From: Sepherosa Ziehau Date: Tue, 6 Jan 2015 13:44:02 +0000 (+0800) Subject: inet6: Dispatch in6_if_up() to netisr0 to run X-Git-Tag: v4.2.0rc~1172 X-Git-Url: https://gitweb.dragonflybsd.org/~tuxillo/dragonfly.git/commitdiff_plain/83167ee5a6cbd30fc7a5bc033d94a8ee8deb52c7 inet6: Dispatch in6_if_up() to netisr0 to run - Processing of DAD, nd6 prefix and inet6 address on in6_if_up() code path are now in netisr0. - Accessing of ifnet global variable on in6_if_up() code path is now in netisr0. --- diff --git a/sys/netinet6/in6.c b/sys/netinet6/in6.c index 8f080882e0..47e792a5de 100644 --- a/sys/netinet6/in6.c +++ b/sys/netinet6/in6.c @@ -2448,13 +2448,18 @@ in6_ifawithifp(struct ifnet *ifp, struct in6_addr *dst) /* * perform DAD when interface becomes IFF_UP. */ -void -in6_if_up(struct ifnet *ifp) +static void +in6_if_up_dispatch(netmsg_t nmsg) { + struct lwkt_msg *lmsg = &nmsg->lmsg; + struct ifnet *ifp = lmsg->u.ms_resultp; struct ifaddr_container *ifac; struct in6_ifaddr *ia; int dad_delay; /* delay ticks before DAD output */ + KASSERT(&curthread->td_msgport == netisr_cpuport(0), + ("not in netisr0")); + /* * special cases, like 6to4, are handled in in6_ifattach */ @@ -2470,6 +2475,21 @@ in6_if_up(struct ifnet *ifp) if (ia->ia6_flags & IN6_IFF_TENTATIVE) nd6_dad_start(ifa, &dad_delay); } + + lwkt_replymsg(lmsg, 0); +} + +void +in6_if_up(struct ifnet *ifp) +{ + struct netmsg_base nmsg; + struct lwkt_msg *lmsg = &nmsg.lmsg; + + ASSERT_CANDOMSG_NETISR0(curthread); + + netmsg_init(&nmsg, NULL, &curthread->td_msgport, 0, in6_if_up_dispatch); + lmsg->u.ms_resultp = ifp; + lwkt_domsg(netisr_cpuport(0), lmsg, 0); } int