FreeBSD Bugzilla – Attachment 179015 Details for
Bug 211689
panic with lagg failover wireless ath and iwm
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Remove the sc_lladdr_task taskqueue
pr211689.patch (text/plain), 7.47 KB, created by
Alan Somers
on 2017-01-17 23:58:57 UTC
(
hide
)
Description:
Remove the sc_lladdr_task taskqueue
Filename:
MIME Type:
Creator:
Alan Somers
Created:
2017-01-17 23:58:57 UTC
Size:
7.47 KB
patch
obsolete
>Index: sys/net/if_lagg.c >=================================================================== >--- sys/net/if_lagg.c (revision 311787) >+++ sys/net/if_lagg.c (working copy) >@@ -98,10 +100,9 @@ > #define V_lagg_cloner VNET(lagg_cloner) > static const char laggname[] = "lagg"; > >-static void lagg_lladdr(struct lagg_softc *, uint8_t *); >+static void lagg_lladdr(struct lagg_softc *, uint8_t *, bool); > static void lagg_capabilities(struct lagg_softc *); > static void lagg_port_lladdr(struct lagg_port *, uint8_t *, lagg_llqtype); >-static void lagg_port_setlladdr(void *, int); > static int lagg_port_create(struct lagg_softc *, struct ifnet *); > static int lagg_port_destroy(struct lagg_port *, int); > static struct mbuf *lagg_input(struct ifnet *, struct mbuf *); >@@ -487,7 +488,6 @@ > > LAGG_LOCK_INIT(sc); > SLIST_INIT(&sc->sc_ports); >- TASK_INIT(&sc->sc_lladdr_task, 0, lagg_port_setlladdr, sc); > > /* Initialise pseudo media types */ > ifmedia_init(&sc->sc_media, 0, lagg_media_change, >@@ -553,7 +553,6 @@ > SLIST_REMOVE(&V_lagg_list, sc, lagg_softc, sc_entries); > LAGG_LIST_UNLOCK(); > >- taskqueue_drain(taskqueue_swi, &sc->sc_lladdr_task); > LAGG_LOCK_DESTROY(sc); > free(sc, M_DEVBUF); > } >@@ -564,7 +563,7 @@ > * Set noinline to be dtrace-friendly > */ > static __noinline void >-lagg_lladdr(struct lagg_softc *sc, uint8_t *lladdr) >+lagg_lladdr(struct lagg_softc *sc, uint8_t *lladdr, bool detaching) > { > struct ifnet *ifp = sc->sc_ifp; > struct lagg_port lp; >@@ -590,6 +589,7 @@ > bzero(&lp, sizeof(lp)); > lp.lp_ifp = sc->sc_ifp; > lp.lp_softc = sc; >+ lp.lp_detaching = detaching; > > /* Do not request lladdr change */ > lagg_port_lladdr(&lp, lladdr, LAGG_LLQTYPE_VIRT); >@@ -645,7 +645,7 @@ > { > struct lagg_softc *sc = lp->lp_softc; > struct ifnet *ifp = lp->lp_ifp; >- struct lagg_llq *llq; >+ int error = 0; > > LAGG_WLOCK_ASSERT(sc); > >@@ -653,75 +653,22 @@ > * Do not enqueue requests where lladdr is the same for > * "physical" interfaces (e.g. ports in lagg) > */ >- if (llq_type == LAGG_LLQTYPE_PHYS && >- memcmp(IF_LLADDR(ifp), lladdr, ETHER_ADDR_LEN) == 0) >+ if (lp->lp_detaching || (llq_type == LAGG_LLQTYPE_PHYS && >+ memcmp(IF_LLADDR(ifp), lladdr, ETHER_ADDR_LEN) == 0)) > return; > >- /* Check to make sure its not already queued to be changed */ >- SLIST_FOREACH(llq, &sc->sc_llq_head, llq_entries) { >- if (llq->llq_ifp == ifp) { >- /* Update lladdr, it may have changed */ >- bcopy(lladdr, llq->llq_lladdr, ETHER_ADDR_LEN); >- return; >- } >- } >- >- llq = malloc(sizeof(struct lagg_llq), M_DEVBUF, M_NOWAIT | M_ZERO); >- if (llq == NULL) /* XXX what to do */ >- return; >- >- llq->llq_ifp = ifp; >- llq->llq_type = llq_type; >- bcopy(lladdr, llq->llq_lladdr, ETHER_ADDR_LEN); >- /* XXX: We should insert to tail */ >- SLIST_INSERT_HEAD(&sc->sc_llq_head, llq, llq_entries); >- >- taskqueue_enqueue(taskqueue_swi, &sc->sc_lladdr_task); >+ /* Set the link layer address */ >+ CURVNET_SET(ifp->if_vnet); >+ if (llq_type == LAGG_LLQTYPE_PHYS) >+ error = if_setlladdr(ifp, lladdr, ETHER_ADDR_LEN); >+ else >+ EVENTHANDLER_INVOKE(iflladdr_event, ifp); >+ CURVNET_RESTORE(); >+ if (error) >+ if_printf(sc->sc_ifp, "%s: setlladdr failed on %s\n", __func__, >+ ifp->if_xname); > } > >-/* >- * Set the interface MAC address from a taskqueue to avoid a LOR. >- * >- * Set noinline to be dtrace-friendly >- */ >-static __noinline void >-lagg_port_setlladdr(void *arg, int pending) >-{ >- struct lagg_softc *sc = (struct lagg_softc *)arg; >- struct lagg_llq *llq, *head; >- struct ifnet *ifp; >- >- /* Grab a local reference of the queue and remove it from the softc */ >- LAGG_WLOCK(sc); >- head = SLIST_FIRST(&sc->sc_llq_head); >- SLIST_FIRST(&sc->sc_llq_head) = NULL; >- LAGG_WUNLOCK(sc); >- >- /* >- * Traverse the queue and set the lladdr on each ifp. It is safe to do >- * unlocked as we have the only reference to it. >- */ >- for (llq = head; llq != NULL; llq = head) { >- ifp = llq->llq_ifp; >- >- CURVNET_SET(ifp->if_vnet); >- >- /* >- * Set the link layer address on the laggport interface. >- * Note that if_setlladdr() or iflladdr_event handler >- * may result in arp transmission / lltable updates. >- */ >- if (llq->llq_type == LAGG_LLQTYPE_PHYS) >- if_setlladdr(ifp, llq->llq_lladdr, >- ETHER_ADDR_LEN); >- else >- EVENTHANDLER_INVOKE(iflladdr_event, ifp); >- CURVNET_RESTORE(); >- head = SLIST_NEXT(llq, llq_entries); >- free(llq, M_DEVBUF); >- } >-} >- > static int > lagg_port_create(struct lagg_softc *sc, struct ifnet *ifp) > { >@@ -801,7 +748,7 @@ > if (SLIST_EMPTY(&sc->sc_ports)) { > sc->sc_primary = lp; > /* First port in lagg. Update/notify lagg lladdress */ >- lagg_lladdr(sc, IF_LLADDR(ifp)); >+ lagg_lladdr(sc, IF_LLADDR(ifp), false); > } else { > > /* >@@ -877,7 +824,6 @@ > { > struct lagg_softc *sc = lp->lp_softc; > struct lagg_port *lp_ptr, *lp0; >- struct lagg_llq *llq; > struct ifnet *ifp = lp->lp_ifp; > uint64_t *pval, vdiff; > int i; >@@ -924,7 +870,7 @@ > bcopy(lp0->lp_lladdr, > lladdr, ETHER_ADDR_LEN); > } >- lagg_lladdr(sc, lladdr); >+ lagg_lladdr(sc, lladdr, true); > > /* Mark lp0 as new primary */ > sc->sc_primary = lp0; >@@ -938,18 +884,6 @@ > lagg_port_lladdr(lp_ptr, lladdr, LAGG_LLQTYPE_PHYS); > } > >- /* Remove any pending lladdr changes from the queue */ >- if (lp->lp_detaching) { >- SLIST_FOREACH(llq, &sc->sc_llq_head, llq_entries) { >- if (llq->llq_ifp == ifp) { >- SLIST_REMOVE(&sc->sc_llq_head, llq, lagg_llq, >- llq_entries); >- free(llq, M_DEVBUF); >- break; /* Only appears once */ >- } >- } >- } >- > if (lp->lp_ifflags) > if_printf(ifp, "%s: lp_ifflags unclean\n", __func__); > >@@ -1472,6 +1406,8 @@ > "before adding it as a member to prevent " > "IPv6 address scope violation.\n", > tpif->if_xname); >+ } else { >+ if_printf(sc->sc_ifp, "No IPv6 link-local address found on %s\n", tpif->if_xname); > } > #endif > LAGG_WLOCK(sc); >Index: sys/net/if_lagg.h >=================================================================== >--- sys/net/if_lagg.h (revision 311787) >+++ sys/net/if_lagg.h (working copy) >@@ -207,14 +207,6 @@ > LAGG_LLQTYPE_VIRT, /* Task related to lagg interface itself */ > } lagg_llqtype; > >-/* List of interfaces to have the MAC address modified */ >-struct lagg_llq { >- struct ifnet *llq_ifp; >- uint8_t llq_lladdr[ETHER_ADDR_LEN]; >- lagg_llqtype llq_type; >- SLIST_ENTRY(lagg_llq) llq_entries; >-}; >- > struct lagg_counters { > uint64_t val[IFCOUNTERS]; > }; >@@ -236,9 +228,6 @@ > SLIST_HEAD(__tplhd, lagg_port) sc_ports; /* list of interfaces */ > SLIST_ENTRY(lagg_softc) sc_entries; > >- struct task sc_lladdr_task; >- SLIST_HEAD(__llqhd, lagg_llq) sc_llq_head; /* interfaces to program >- the lladdr on */ > eventhandler_tag vlan_attach; > eventhandler_tag vlan_detach; > struct callout sc_callout; >Index: sys/netinet6/in6.c >=================================================================== >--- sys/netinet6/in6.c (revision 311787) >+++ sys/netinet6/in6.c (working copy) >@@ -1493,6 +1493,8 @@ > return ((struct in6_ifaddr *)ifa); > } > >+SDT_PROVIDER_DEFINE(in6); >+SDT_PROBE_DEFINE2(in6, kernel, in6ifa_llaonifp, addr, "struct ifnet*", "struct sockaddr*"); > /* > * Find a link-local scoped address on ifp and return it if any. > */ >@@ -1502,10 +1504,11 @@ > struct sockaddr_in6 *sin6; > struct ifaddr *ifa; > >- if (ND_IFINFO(ifp)->flags & ND6_IFF_IFDISABLED) >- return (NULL); >+/* if (ND_IFINFO(ifp)->flags & ND6_IFF_IFDISABLED)*/ >+/* return (NULL);*/ > IF_ADDR_RLOCK(ifp); > TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) { >+ SDT_PROBE2(in6, kernel, in6ifa_llaonifp, addr, ifp, ifa->ifa_addr); > if (ifa->ifa_addr->sa_family != AF_INET6) > continue; > sin6 = (struct sockaddr_in6 *)ifa->ifa_addr;
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 211689
:
173440
|
173441
|
173477
|
178330
| 179015