Index: sys/net/ieee8023ad_lacp.c =================================================================== --- sys/net/ieee8023ad_lacp.c +++ sys/net/ieee8023ad_lacp.c @@ -566,7 +566,6 @@ lp->lp_aggregator = NULL; lacp_sm_rx_set_expired(lp); LACP_UNLOCK(lsc); - lacp_linkstate(lgp); return (0); } Index: sys/net/if_lagg.c =================================================================== --- sys/net/if_lagg.c +++ sys/net/if_lagg.c @@ -731,6 +731,7 @@ if (CK_SLIST_EMPTY(&sc->sc_ports)) sc->sc_primary = lp; + LAGG_RLOCK(); /* Change the interface type */ lp->lp_iftype = ifp->if_type; ifp->if_type = IFT_IEEE8023ADLAG; @@ -751,7 +752,6 @@ * is predictable and `ifconfig laggN create ...` command * will lead to the same result each time. */ - LAGG_RLOCK(); CK_SLIST_FOREACH(tlp, &sc->sc_ports, lp_entries) { if (tlp->lp_ifp->if_index < ifp->if_index && ( CK_SLIST_NEXT(tlp, lp_entries) == NULL || @@ -759,7 +759,6 @@ ifp->if_index)) break; } - LAGG_RUNLOCK(); if (tlp != NULL) CK_SLIST_INSERT_AFTER(tlp, lp, lp_entries); else @@ -774,10 +773,13 @@ lagg_port_destroy(lp, 0); if (oldmtu != -1) (*ifp->if_ioctl)(ifp, SIOCSIFMTU, (caddr_t)&ifr); + LAGG_RUNLOCK(); return (error); } + LAGG_RUNLOCK(); /* Update lagg capabilities */ + lagg_proto_linkstate(sc, lp); lagg_capabilities(sc); lagg_linkstate(sc); @@ -828,6 +830,7 @@ LAGG_XLOCK_ASSERT(sc); + LAGG_RLOCK(); if (rundelport) lagg_proto_delport(sc, lp); @@ -850,6 +853,7 @@ /* Finally, remove the port from the lagg */ CK_SLIST_REMOVE(&sc->sc_ports, lp, lagg_port, lp_entries); sc->sc_count--; + LAGG_RUNLOCK(); /* Update the primary interface */ if (lp == sc->sc_primary) { Index: sys/net/iflib.c =================================================================== --- sys/net/iflib.c +++ sys/net/iflib.c @@ -1468,12 +1468,14 @@ { iflib_filter_info_t info = arg; struct grouptask *gtask = info->ifi_task; + int result; if (!iflib_started) - return (FILTER_HANDLED); + return (FILTER_STRAY); DBG_COUNTER_INC(fast_intrs); - if (info->ifi_filter != NULL && info->ifi_filter(info->ifi_filter_arg) == FILTER_HANDLED) - return (FILTER_HANDLED); + if (info->ifi_filter != NULL + && (result = info->ifi_filter(info->ifi_filter_arg)) != FILTER_SCHEDULE_THREAD) + return result; GROUPTASK_ENQUEUE(gtask); return (FILTER_HANDLED); @@ -1522,7 +1524,7 @@ IFDI_RX_QUEUE_INTR_ENABLE(ctx, rxq->ifr_id); DBG_COUNTER_INC(rx_intr_enables); } - return (FILTER_HANDLED); + return (FILTER_SCHEDULE_THREAD); } @@ -1531,16 +1533,18 @@ { iflib_filter_info_t info = arg; struct grouptask *gtask = info->ifi_task; + int result; if (!iflib_started) - return (FILTER_HANDLED); + return (FILTER_STRAY); DBG_COUNTER_INC(fast_intrs); - if (info->ifi_filter != NULL && info->ifi_filter(info->ifi_filter_arg) == FILTER_HANDLED) - return (FILTER_HANDLED); + if (info->ifi_filter != NULL + && (result = info->ifi_filter(info->ifi_filter_arg)) != FILTER_SCHEDULE_THREAD) + return result; GROUPTASK_ENQUEUE(gtask); - return (FILTER_HANDLED); + return (FILTER_SCHEDULE_THREAD); } static int