From a3dd34d2519ecf8970110832a595b0c98f259da1 Mon Sep 17 00:00:00 2001 From: Sepherosa Ziehau Date: Sun, 5 Apr 2009 09:04:08 +0800 Subject: [PATCH] Split ifnet serialize step 1/many: Add if_{serialize,deserialize,tryserialize}() function pointers to ifnet. These three function pointers accept ifnet struct and ifnet_serialize enumeration. The ifnet_serialize enumeration indicates the serialization type: IFNET_SERIALIZE_ALL: All of the serializers should be held. Except for if_start and if_input, this enumeration must be used when call ifnet function pointers. IFNET_SERIALIZE_TX: Only transmit serializer should be held. This enumeration could be used when calling ifnet.if_start. IFNET_SERIALIZE_RX: Only receive serializer should be held. This enumeration could be used when calling ifnet.if_input. If the NIC driver does not set these three function pointer, then if_attach() will set them to the default ones: only one serializer (if_serializer) is used and ifnet_serialize parameter is ignored. Following several inline functions are added which are sheer wrappers of the three ifnet serialize function pointers: ifnet_serialize_{all,tx,rx}() ifnet_deserialize_{all,tx,rx}() ifnet_tryserialize_{all,tx,rx}() All of the protocol layers and most of the pseudo drivers are converted. Discussed-with: dillon@ --- sys/bus/usb/usb_ethersubr.c | 4 +- sys/dev/virtual/net/if_vke.c | 8 +- sys/kern/kern_poll.c | 30 +++--- sys/net/altq/altq_subr.c | 4 +- sys/net/bpf.c | 4 +- sys/net/bridge/bridgestp.c | 12 +-- sys/net/bridge/if_bridge.c | 72 ++++++------- sys/net/gif/if_gif.c | 4 +- sys/net/gre/if_gre.c | 4 +- sys/net/i4b/driver/i4b_ipr.c | 4 +- sys/net/if.c | 102 +++++++++++------- sys/net/if_atmsubr.c | 4 +- sys/net/if_loop.c | 4 +- sys/net/if_var.h | 91 ++++++++++++++-- sys/net/ppp/if_ppp.c | 10 +- sys/net/sl/if_sl.c | 4 +- sys/net/sppp/if_spppsubr.c | 8 +- sys/net/stf/if_stf.c | 4 +- sys/net/tap/if_tap.c | 24 ++--- sys/net/tun/if_tun.c | 27 ++--- sys/net/vlan/if_vlan.c | 32 +++--- sys/net/vlan/if_vlan_ether.c | 4 +- sys/netgraph/eiface/ng_eiface.c | 10 +- sys/netgraph/fec/ng_fec.c | 37 ++++--- sys/netgraph/iface/ng_iface.c | 4 +- sys/netinet/if_atm.c | 8 +- sys/netinet/in.c | 12 +-- sys/netinet6/in6.c | 11 +- sys/netinet6/ip6_mroute.c | 4 +- sys/netinet6/scope6.c | 9 +- sys/netproto/802_11/wlan/ieee80211.c | 12 +-- sys/netproto/802_11/wlan/ieee80211_proto.c | 4 +- .../amrr/ieee80211_ratectl_amrr.c | 4 +- .../onoe/ieee80211_ratectl_onoe.c | 4 +- sys/netproto/atalk/at_control.c | 10 +- sys/netproto/atm/atm_if.c | 4 +- sys/netproto/ipx/ipx.c | 14 +-- sys/netproto/ipx/ipx_ip.c | 4 +- sys/netproto/natm/natm.c | 31 +++--- sys/netproto/ns/ns.c | 25 +++-- sys/netproto/ns/ns_ip.c | 4 +- 41 files changed, 382 insertions(+), 289 deletions(-) diff --git a/sys/bus/usb/usb_ethersubr.c b/sys/bus/usb/usb_ethersubr.c index 13e16ff12a..610afd292b 100644 --- a/sys/bus/usb/usb_ethersubr.c +++ b/sys/bus/usb/usb_ethersubr.c @@ -80,9 +80,9 @@ usbintr(struct netmsg *msg) struct ifnet *ifp; ifp = m->m_pkthdr.rcvif; - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_rx(ifp); (*ifp->if_input)(ifp, m); - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_rx(ifp); /* the msg is embedded in the mbuf, do not reply it */ } diff --git a/sys/dev/virtual/net/if_vke.c b/sys/dev/virtual/net/if_vke.c index 4e62bfad4c..b9425da60b 100644 --- a/sys/dev/virtual/net/if_vke.c +++ b/sys/dev/virtual/net/if_vke.c @@ -253,7 +253,7 @@ vke_intr(void *xsc, struct intrframe *frame __unused) struct vke_softc *sc = xsc; struct ifnet *ifp = &sc->arpcom.ac_if; - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_all(ifp); if ((ifp->if_flags & IFF_RUNNING) == 0) goto back; @@ -263,7 +263,7 @@ vke_intr(void *xsc, struct intrframe *frame __unused) ifp->if_start(ifp); back: - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); } static void @@ -434,9 +434,9 @@ vke_init_addr(struct ifnet *ifp, in_addr_t addr, in_addr_t mask) * Temporarily release serializer, in_control() will hold * it again before calling ifnet.if_ioctl(). */ - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); ret = in_control(NULL, SIOCAIFADDR, (caddr_t)&ifra, ifp, NULL); - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_all(ifp); return ret; } diff --git a/sys/kern/kern_poll.c b/sys/kern/kern_poll.c index c4c1005d9c..53550e2346 100644 --- a/sys/kern/kern_poll.c +++ b/sys/kern/kern_poll.c @@ -637,7 +637,7 @@ netisr_poll(struct netmsg *msg) for (i = 0 ; i < pctx->poll_handlers ; i++) { struct ifnet *ifp = pctx->pr[i].ifp; - if (!lwkt_serialize_try(ifp->if_serializer)) + if (!ifnet_tryserialize_all(ifp)) continue; if ((ifp->if_flags & (IFF_UP|IFF_RUNNING|IFF_POLLING)) @@ -649,7 +649,7 @@ netisr_poll(struct netmsg *msg) logpoll(end, ifp); } - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); } schedpollmore(pctx); @@ -751,11 +751,11 @@ ether_pollcpu_register(struct ifnet *ifp, int cpuid) */ crit_enter(); /* XXX MP - not mp safe */ - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_all(ifp); if (ifp->if_flags & IFF_POLLING) { /* Already polling */ KKASSERT(ifp->if_poll_cpuid >= 0); - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); crit_exit(); return 0; } @@ -764,7 +764,7 @@ ether_pollcpu_register(struct ifnet *ifp, int cpuid) ifp->if_poll_cpuid = cpuid; if (ifp->if_flags & IFF_RUNNING) ifp->if_poll(ifp, POLL_REGISTER, 0); - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); netmsg_init(&msg, &curthread->td_msgport, MSGF_MPSAFE, poll_register); msg.nm_lmsg.u.ms_resultp = ifp; @@ -773,12 +773,12 @@ ether_pollcpu_register(struct ifnet *ifp, int cpuid) lwkt_domsg(port, &msg.nm_lmsg, 0); if (msg.nm_lmsg.ms_error) { - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_all(ifp); ifp->if_flags &= ~IFF_POLLING; ifp->if_poll_cpuid = -1; if (ifp->if_flags & IFF_RUNNING) ifp->if_poll(ifp, POLL_DEREGISTER, 0); - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); rc = 0; } else { rc = 1; @@ -843,10 +843,10 @@ ether_poll_deregister(struct ifnet *ifp) crit_enter(); - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_all(ifp); if ((ifp->if_flags & IFF_POLLING) == 0) { KKASSERT(ifp->if_poll_cpuid < 0); - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); crit_exit(); return 0; } @@ -857,7 +857,7 @@ ether_poll_deregister(struct ifnet *ifp) ifp->if_flags &= ~IFF_POLLING; ifp->if_poll_cpuid = -1; - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); netmsg_init(&msg, &curthread->td_msgport, MSGF_MPSAFE, poll_deregister); msg.nm_lmsg.u.ms_resultp = ifp; @@ -866,10 +866,10 @@ ether_poll_deregister(struct ifnet *ifp) lwkt_domsg(port, &msg.nm_lmsg, 0); if (!msg.nm_lmsg.ms_error) { - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_all(ifp); if (ifp->if_flags & IFF_RUNNING) ifp->if_poll(ifp, POLL_DEREGISTER, 1); - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); rc = 1; } else { rc = 0; @@ -1005,11 +1005,11 @@ poll_sysctl_polling(struct netmsg *msg) for (i = 0 ; i < pctx->poll_handlers ; i++) { struct ifnet *ifp = pctx->pr[i].ifp; - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_all(ifp); if ((ifp->if_flags & IFF_POLLING) == 0) { KKASSERT(ifp->if_poll_cpuid < 0); - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); continue; } ifp->if_flags &= ~IFF_POLLING; @@ -1023,7 +1023,7 @@ poll_sysctl_polling(struct netmsg *msg) if (ifp->if_flags & IFF_RUNNING) ifp->if_poll(ifp, POLL_DEREGISTER, 1); - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); } pctx->poll_handlers = 0; } diff --git a/sys/net/altq/altq_subr.c b/sys/net/altq/altq_subr.c index c96d21c499..1383d94834 100644 --- a/sys/net/altq/altq_subr.c +++ b/sys/net/altq/altq_subr.c @@ -345,9 +345,9 @@ tbr_timeout(void *arg) continue; active++; if (!ifq_is_empty(&ifp->if_snd) && ifp->if_start != NULL) { - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_tx(ifp); (*ifp->if_start)(ifp); - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_tx(ifp); } } crit_exit(); diff --git a/sys/net/bpf.c b/sys/net/bpf.c index 9ac8291def..20db04768d 100644 --- a/sys/net/bpf.c +++ b/sys/net/bpf.c @@ -667,10 +667,10 @@ bpfioctl(struct dev_ioctl_args *ap) error = EINVAL; } else { ifp = d->bd_bif->bif_ifp; - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_all(ifp); error = ifp->if_ioctl(ifp, ap->a_cmd, ap->a_data, ap->a_cred); - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); } break; } diff --git a/sys/net/bridge/bridgestp.c b/sys/net/bridge/bridgestp.c index 00da529c31..b086c60713 100644 --- a/sys/net/bridge/bridgestp.c +++ b/sys/net/bridge/bridgestp.c @@ -1060,7 +1060,7 @@ bstp_linkstate(struct ifnet *ifp, int state) struct bridge_iflist *bif; sc = ifp->if_bridge; - lwkt_serialize_enter(sc->sc_ifp->if_serializer); + ifnet_serialize_all(sc->sc_ifp); /* * bstp_ifupdstatus() may block, but it is the last @@ -1077,7 +1077,7 @@ bstp_linkstate(struct ifnet *ifp, int state) break; } } - lwkt_serialize_exit(sc->sc_ifp->if_serializer); + ifnet_deserialize_all(sc->sc_ifp); } static void @@ -1088,9 +1088,9 @@ bstp_ifupdstatus(struct bridge_softc *sc, struct bridge_iflist *bif) int error = 0; bzero((char *)&ifmr, sizeof(ifmr)); - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_all(ifp); error = (*ifp->if_ioctl)(ifp, SIOCGIFMEDIA, (caddr_t)&ifmr, NULL); - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); if ((error == 0) && (ifp->if_flags & IFF_UP)) { if (ifmr.ifm_status & IFM_ACTIVE) { @@ -1144,7 +1144,7 @@ bstp_tick_handler(struct netmsg *nmsg) lwkt_replymsg(&nmsg->nm_lmsg, 0); crit_exit(); - lwkt_serialize_enter(sc->sc_ifp->if_serializer); + ifnet_serialize_all(sc->sc_ifp); /* * NOTE: @@ -1200,7 +1200,7 @@ bstp_tick_handler(struct netmsg *nmsg) if (sc->sc_ifp->if_flags & IFF_RUNNING) callout_reset(&sc->sc_bstpcallout, hz, bstp_tick, sc); - lwkt_serialize_exit(sc->sc_ifp->if_serializer); + ifnet_deserialize_all(sc->sc_ifp); } static void diff --git a/sys/net/bridge/if_bridge.c b/sys/net/bridge/if_bridge.c index 3b061ed8df..e5d2577594 100644 --- a/sys/net/bridge/if_bridge.c +++ b/sys/net/bridge/if_bridge.c @@ -714,7 +714,7 @@ bridge_delete_dispatch(struct netmsg *nmsg) struct ifnet *bifp = sc->sc_ifp; struct bridge_iflist *bif; - lwkt_serialize_enter(bifp->if_serializer); + ifnet_serialize_all(bifp); while ((bif = LIST_FIRST(&sc->sc_iflists[mycpuid])) != NULL) bridge_delete_member(sc, bif, 0); @@ -722,7 +722,7 @@ bridge_delete_dispatch(struct netmsg *nmsg) while ((bif = LIST_FIRST(&sc->sc_spanlist)) != NULL) bridge_delete_span(sc, bif); - lwkt_serialize_exit(bifp->if_serializer); + ifnet_deserialize_all(bifp); lwkt_replymsg(lmsg, 0); } @@ -739,12 +739,12 @@ bridge_clone_destroy(struct ifnet *ifp) struct lwkt_msg *lmsg; struct netmsg nmsg; - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_all(ifp); bridge_stop(ifp); ifp->if_flags &= ~IFF_UP; - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); netmsg_init(&nmsg, &curthread->td_msgport, 0, bridge_delete_dispatch); lmsg = &nmsg.nm_lmsg; @@ -906,9 +906,9 @@ bridge_mutecaps(struct bridge_ifinfo *bif_info, struct ifnet *ifp, int mute) } if (bif_info->bifi_mutecap != 0) { - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_all(ifp); error = ifp->if_ioctl(ifp, SIOCSIFCAP, (caddr_t)&ifr, NULL); - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); } } @@ -988,7 +988,7 @@ bridge_delete_member(struct bridge_softc *sc, struct bridge_iflist *bif, * - To avoid possible dead lock. * - Various sync operation will block the current thread. */ - lwkt_serialize_exit(bifp->if_serializer); + ifnet_deserialize_all(bifp); if (!gone) { switch (ifs->if_type) { @@ -1041,7 +1041,7 @@ bridge_delete_member(struct bridge_softc *sc, struct bridge_iflist *bif, bridge_rtmsg_sync(sc); bridge_rtdelete(sc, ifs, IFBF_FLUSHALL | IFBF_FLUSHSYNC); - lwkt_serialize_enter(bifp->if_serializer); + ifnet_serialize_all(bifp); if (bifp->if_flags & IFF_RUNNING) bstp_initialization(sc); @@ -1108,7 +1108,7 @@ bridge_ioctl_stop(struct bridge_softc *sc, void *arg __unused) ifp->if_flags &= ~IFF_RUNNING; - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); /* Let everyone know that we are stopped */ netmsg_service_sync(); @@ -1122,7 +1122,7 @@ bridge_ioctl_stop(struct bridge_softc *sc, void *arg __unused) bridge_rtmsg_sync(sc); bridge_rtflush(sc, IFBF_FLUSHDYN | IFBF_FLUSHSYNC); - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_all(ifp); return 0; } @@ -1173,7 +1173,7 @@ bridge_ioctl_add(struct bridge_softc *sc, void *arg) * - To avoid possible dead lock. * - Various sync operation will block the current thread. */ - lwkt_serialize_exit(bifp->if_serializer); + ifnet_deserialize_all(bifp); switch (ifs->if_type) { case IFT_ETHER: @@ -1183,7 +1183,7 @@ bridge_ioctl_add(struct bridge_softc *sc, void *arg) */ error = ifpromisc(ifs, 1); if (error) { - lwkt_serialize_enter(bifp->if_serializer); + ifnet_serialize_all(bifp); goto out; } bridge_mutecaps(bif_info, ifs, 1); @@ -1194,7 +1194,7 @@ bridge_ioctl_add(struct bridge_softc *sc, void *arg) default: error = EINVAL; - lwkt_serialize_enter(bifp->if_serializer); + ifnet_serialize_all(bifp); goto out; } @@ -1203,7 +1203,7 @@ bridge_ioctl_add(struct bridge_softc *sc, void *arg) */ bridge_add_bif(sc, bif_info, ifs); - lwkt_serialize_enter(bifp->if_serializer); + ifnet_serialize_all(bifp); if (bifp->if_flags & IFF_RUNNING) bstp_initialization(sc); @@ -1285,9 +1285,9 @@ bridge_ioctl_sifflags(struct bridge_softc *sc, void *arg) } } - lwkt_serialize_exit(bifp->if_serializer); + ifnet_deserialize_all(bifp); bridge_set_bifflags(sc, bif->bif_info, req->ifbr_ifsflags); - lwkt_serialize_enter(bifp->if_serializer); + ifnet_serialize_all(bifp); if (bifp->if_flags & IFF_RUNNING) bstp_initialization(sc); @@ -1303,9 +1303,9 @@ bridge_ioctl_scache(struct bridge_softc *sc, void *arg) sc->sc_brtmax = param->ifbrp_csize; - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); bridge_rttrim(sc); - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_all(ifp); return (0); } @@ -1466,10 +1466,10 @@ bridge_ioctl_saddr(struct bridge_softc *sc, void *arg) if (bif == NULL) return (ENOENT); - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); error = bridge_rtsaddr(sc, req->ifba_dst, bif->bif_ifp, req->ifba_flags); - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_all(ifp); return (error); } @@ -1500,9 +1500,9 @@ bridge_ioctl_daddr(struct bridge_softc *sc, void *arg) struct ifnet *ifp = sc->sc_ifp; int error; - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); error = bridge_rtdaddr(sc, req->ifba_dst); - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_all(ifp); return error; } @@ -1512,9 +1512,9 @@ bridge_ioctl_flush(struct bridge_softc *sc, void *arg) struct ifbreq *req = arg; struct ifnet *ifp = sc->sc_ifp; - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); bridge_rtflush(sc, req->ifbr_ifsflags | IFBF_FLUSHSYNC); - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_all(ifp); return (0); } @@ -1734,7 +1734,7 @@ bridge_ifdetach_dispatch(struct netmsg *nmsg) if (sc != NULL) { bifp = sc->sc_ifp; - lwkt_serialize_enter(bifp->if_serializer); + ifnet_serialize_all(bifp); bif = bridge_lookup_member_if(sc, ifp); if (bif != NULL) { @@ -1743,7 +1743,7 @@ bridge_ifdetach_dispatch(struct netmsg *nmsg) /* XXX Why bif will be NULL? */ } - lwkt_serialize_exit(bifp->if_serializer); + ifnet_deserialize_all(bifp); goto reply; } @@ -1753,7 +1753,7 @@ bridge_ifdetach_dispatch(struct netmsg *nmsg) LIST_FOREACH(sc, &bridge_list, sc_list) { bifp = sc->sc_ifp; - lwkt_serialize_enter(bifp->if_serializer); + ifnet_serialize_all(bifp); LIST_FOREACH(bif, &sc->sc_spanlist, bif_next) if (ifp == bif->bif_ifp) { @@ -1761,7 +1761,7 @@ bridge_ifdetach_dispatch(struct netmsg *nmsg) break; } - lwkt_serialize_exit(bifp->if_serializer); + ifnet_deserialize_all(bifp); } crit_exit(); @@ -2209,9 +2209,9 @@ bridge_input(struct ifnet *ifp, struct mbuf *m) /* Tap off 802.1D packets; they do not get forwarded. */ if (memcmp(eh->ether_dhost, bstp_etheraddr, ETHER_ADDR_LEN) == 0) { - lwkt_serialize_enter(bifp->if_serializer); + ifnet_serialize_all(bifp); bstp_input(sc, bif, m); - lwkt_serialize_exit(bifp->if_serializer); + ifnet_deserialize_all(bifp); /* m is freed by bstp_input */ m = NULL; @@ -2484,7 +2484,7 @@ bridge_span(struct bridge_softc *sc, struct mbuf *m) struct mbuf *mc; bifp = sc->sc_ifp; - lwkt_serialize_enter(bifp->if_serializer); + ifnet_serialize_all(bifp); LIST_FOREACH(bif, &sc->sc_spanlist, bif_next) { dst_if = bif->bif_ifp; @@ -2500,7 +2500,7 @@ bridge_span(struct bridge_softc *sc, struct mbuf *m) bridge_enqueue(dst_if, mc); } - lwkt_serialize_exit(bifp->if_serializer); + ifnet_deserialize_all(bifp); } static void @@ -3671,9 +3671,9 @@ bridge_control_dispatch(struct netmsg *nmsg) struct ifnet *bifp = bc_msg->bc_sc->sc_ifp; int error; - lwkt_serialize_enter(bifp->if_serializer); + ifnet_serialize_all(bifp); error = bc_msg->bc_func(bc_msg->bc_sc, bc_msg->bc_arg); - lwkt_serialize_exit(bifp->if_serializer); + ifnet_deserialize_all(bifp); lwkt_replymsg(&nmsg->nm_lmsg, error); } @@ -3697,9 +3697,9 @@ bridge_control(struct bridge_softc *sc, u_long cmd, bc_msg.bc_sc = sc; bc_msg.bc_arg = bc_arg; - lwkt_serialize_exit(bifp->if_serializer); + ifnet_deserialize_all(bifp); error = lwkt_domsg(BRIDGE_CFGPORT, &nmsg->nm_lmsg, 0); - lwkt_serialize_enter(bifp->if_serializer); + ifnet_serialize_all(bifp); return error; } diff --git a/sys/net/gif/if_gif.c b/sys/net/gif/if_gif.c index f400b52c7d..0e49238127 100644 --- a/sys/net/gif/if_gif.c +++ b/sys/net/gif/if_gif.c @@ -369,9 +369,9 @@ gif_output(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst, { int error; - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_tx(ifp); error = gif_output_serialized(ifp, m, dst, rt); - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_tx(ifp); return error; } diff --git a/sys/net/gre/if_gre.c b/sys/net/gre/if_gre.c index cce46c489b..99c5f35fa2 100644 --- a/sys/net/gre/if_gre.c +++ b/sys/net/gre/if_gre.c @@ -395,9 +395,9 @@ gre_output(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst, { int error; - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_tx(ifp); error = gre_output_serialized(ifp, m, dst, rt); - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_tx(ifp); return error; } diff --git a/sys/net/i4b/driver/i4b_ipr.c b/sys/net/i4b/driver/i4b_ipr.c index a307c2f3fd..4e248f73ce 100644 --- a/sys/net/i4b/driver/i4b_ipr.c +++ b/sys/net/i4b/driver/i4b_ipr.c @@ -418,9 +418,9 @@ i4biproutput(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst, { int error; - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_tx(ifp); error = i4biproutput_serialized(ifp, m, dst, rtp); - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_tx(ifp); return error; } diff --git a/sys/net/if.c b/sys/net/if.c index 98100d6424..812bc58ccb 100644 --- a/sys/net/if.c +++ b/sys/net/if.c @@ -342,7 +342,7 @@ if_start_dispatch(struct netmsg *nmsg) #endif if (ifp->if_flags & IFF_UP) { - lwkt_serialize_enter(ifp->if_serializer); /* XXX try? */ + ifnet_serialize_tx(ifp); /* XXX try? */ if ((ifp->if_flags & IFF_OACTIVE) == 0) { logifstart(run, ifp); ifp->if_start(ifp); @@ -350,7 +350,7 @@ if_start_dispatch(struct netmsg *nmsg) (IFF_OACTIVE | IFF_RUNNING)) == IFF_RUNNING) running = 1; } - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_tx(ifp); } #ifdef SMP check: @@ -410,6 +410,24 @@ if_devstart(struct ifnet *ifp) } } +static void +if_default_serialize(struct ifnet *ifp, enum ifnet_serialize slz __unused) +{ + lwkt_serialize_enter(ifp->if_serializer); +} + +static void +if_default_deserialize(struct ifnet *ifp, enum ifnet_serialize slz __unused) +{ + lwkt_serialize_exit(ifp->if_serializer); +} + +static int +if_default_tryserialize(struct ifnet *ifp, enum ifnet_serialize slz __unused) +{ + return lwkt_serialize_try(ifp->if_serializer); +} + /* * Attach an interface to the list of "active" interfaces. * @@ -440,6 +458,19 @@ if_attach(struct ifnet *ifp, lwkt_serialize_t serializer) } ifp->if_serializer = serializer; + if (ifp->if_serialize != NULL) { + KASSERT(ifp->if_deserialize != NULL && + ifp->if_tryserialize != NULL, + ("serialize functions are partially setup\n")); + } else { + KASSERT(ifp->if_deserialize == NULL && + ifp->if_tryserialize == NULL, + ("serialize functions are partially setup\n")); + ifp->if_serialize = if_default_serialize; + ifp->if_deserialize = if_default_deserialize; + ifp->if_tryserialize = if_default_tryserialize; + } + ifp->if_start_cpuid = if_start_cpuid; ifp->if_cpuid = 0; @@ -1105,9 +1136,9 @@ if_slowtimo(void *arg) if (ifp->if_timer == 0 || --ifp->if_timer) continue; if (ifp->if_watchdog) { - if (lwkt_serialize_try(ifp->if_serializer)) { + if (ifnet_tryserialize_all(ifp)) { (*ifp->if_watchdog)(ifp); - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); } else { /* try again next timeout */ ++ifp->if_timer; @@ -1291,9 +1322,9 @@ ifioctl(struct socket *so, u_long cmd, caddr_t data, struct ucred *cred) ifp->if_flags &= ~IFF_PROMISC; } if (ifp->if_ioctl) { - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_all(ifp); ifp->if_ioctl(ifp, cmd, data, cred); - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); } getmicrotime(&ifp->if_lastchange); break; @@ -1304,9 +1335,9 @@ ifioctl(struct socket *so, u_long cmd, caddr_t data, struct ucred *cred) return (error); if (ifr->ifr_reqcap & ~ifp->if_capabilities) return (EINVAL); - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_all(ifp); ifp->if_ioctl(ifp, cmd, data, cred); - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); break; case SIOCSIFNAME: @@ -1369,9 +1400,9 @@ ifioctl(struct socket *so, u_long cmd, caddr_t data, struct ucred *cred) return error; if (!ifp->if_ioctl) return EOPNOTSUPP; - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_all(ifp); error = ifp->if_ioctl(ifp, cmd, data, cred); - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); if (error == 0) getmicrotime(&ifp->if_lastchange); return (error); @@ -1387,9 +1418,9 @@ ifioctl(struct socket *so, u_long cmd, caddr_t data, struct ucred *cred) return (EOPNOTSUPP); if (ifr->ifr_mtu < IF_MINMTU || ifr->ifr_mtu > IF_MAXMTU) return (EINVAL); - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_all(ifp); error = ifp->if_ioctl(ifp, cmd, data, cred); - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); if (error == 0) { getmicrotime(&ifp->if_lastchange); rt_ifmsg(ifp); @@ -1442,9 +1473,9 @@ ifioctl(struct socket *so, u_long cmd, caddr_t data, struct ucred *cred) return (error); if (ifp->if_ioctl == 0) return (EOPNOTSUPP); - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_all(ifp); error = ifp->if_ioctl(ifp, cmd, data, cred); - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); if (error == 0) getmicrotime(&ifp->if_lastchange); return error; @@ -1460,9 +1491,9 @@ ifioctl(struct socket *so, u_long cmd, caddr_t data, struct ucred *cred) case SIOCGIFGENERIC: if (ifp->if_ioctl == NULL) return (EOPNOTSUPP); - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_all(ifp); error = ifp->if_ioctl(ifp, cmd, data, cred); - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); return (error); case SIOCSIFLLADDR: @@ -1584,10 +1615,9 @@ ifpromisc(struct ifnet *ifp, int pswitch) } ifr.ifr_flags = ifp->if_flags; ifr.ifr_flagshigh = ifp->if_flags >> 16; - lwkt_serialize_enter(ifp->if_serializer); - error = ifp->if_ioctl(ifp, SIOCSIFFLAGS, (caddr_t)&ifr, - NULL); - lwkt_serialize_exit(ifp->if_serializer); + ifnet_serialize_all(ifp); + error = ifp->if_ioctl(ifp, SIOCSIFFLAGS, (caddr_t)&ifr, NULL); + ifnet_deserialize_all(ifp); if (error == 0) rt_ifmsg(ifp); else @@ -1702,10 +1732,10 @@ if_allmulti(struct ifnet *ifp, int onswitch) ifp->if_flags |= IFF_ALLMULTI; ifr.ifr_flags = ifp->if_flags; ifr.ifr_flagshigh = ifp->if_flags >> 16; - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_all(ifp); error = ifp->if_ioctl(ifp, SIOCSIFFLAGS, (caddr_t)&ifr, NULL); - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); } } else { if (ifp->if_amcount > 1) { @@ -1715,10 +1745,10 @@ if_allmulti(struct ifnet *ifp, int onswitch) ifp->if_flags &= ~IFF_ALLMULTI; ifr.ifr_flags = ifp->if_flags; ifr.ifr_flagshigh = ifp->if_flags >> 16; - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_all(ifp); error = ifp->if_ioctl(ifp, SIOCSIFFLAGS, (caddr_t)&ifr, NULL); - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); } } @@ -1762,9 +1792,9 @@ if_addmulti( * already. */ if (ifp->if_resolvemulti) { - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_all(ifp); error = ifp->if_resolvemulti(ifp, &llsa, sa); - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); if (error) return error; } else { @@ -1817,9 +1847,9 @@ if_addmulti( * interface to let them know about it. */ crit_enter(); - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_all(ifp); ifp->if_ioctl(ifp, SIOCADDMULTI, 0, NULL); - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); crit_exit(); return 0; @@ -1854,9 +1884,9 @@ if_delmulti(struct ifnet *ifp, struct sockaddr *sa) * in the case of a link layer mcast group being left. */ if (ifma->ifma_addr->sa_family == AF_LINK && sa == 0) { - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_all(ifp); ifp->if_ioctl(ifp, SIOCDELMULTI, 0, NULL); - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); } crit_exit(); kfree(ifma->ifma_addr, M_IFMADDR); @@ -1887,10 +1917,10 @@ if_delmulti(struct ifnet *ifp, struct sockaddr *sa) } crit_enter(); - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_all(ifp); LIST_REMOVE(ifma, ifma_link); ifp->if_ioctl(ifp, SIOCDELMULTI, 0, NULL); - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); crit_exit(); kfree(ifma->ifma_addr, M_IFMADDR); kfree(sa, M_IFMADDR); @@ -1931,7 +1961,7 @@ if_setlladdr(struct ifnet *ifp, const u_char *lladdr, int len) * to re-init it in order to reprogram its * address filter. */ - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_all(ifp); if ((ifp->if_flags & IFF_UP) != 0) { struct ifaddr_container *ifac; @@ -1959,7 +1989,7 @@ if_setlladdr(struct ifnet *ifp, const u_char *lladdr, int len) } #endif } - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); return (0); } @@ -2132,7 +2162,7 @@ ifq_dispatch(struct ifnet *ifp, struct mbuf *m, struct altq_pktattr *pa) * contention on ifnet's serializer, ifnet.if_start will * be scheduled on ifnet's CPU. */ - if (!lwkt_serialize_try(ifp->if_serializer)) { + if (!ifnet_tryserialize_tx(ifp)) { /* * ifnet serializer contention happened, * ifnet.if_start is scheduled on ifnet's @@ -2151,7 +2181,7 @@ ifq_dispatch(struct ifnet *ifp, struct mbuf *m, struct altq_pktattr *pa) running = 1; } - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_tx(ifp); if (ifq_dispatch_schednochk || if_start_need_schedule(ifq, running)) { /* diff --git a/sys/net/if_atmsubr.c b/sys/net/if_atmsubr.c index 1a5251302a..f4365bb0f7 100644 --- a/sys/net/if_atmsubr.c +++ b/sys/net/if_atmsubr.c @@ -214,9 +214,9 @@ atm_output(struct ifnet *ifp, struct mbuf *m0, struct sockaddr *dst, /* * Dispatch message to the interface. */ - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_tx(ifp); error = ifq_handoff(ifp, m, &pktattr); - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_tx(ifp); return error; bad: diff --git a/sys/net/if_loop.c b/sys/net/if_loop.c index 6136d91d58..ddba6ef675 100644 --- a/sys/net/if_loop.c +++ b/sys/net/if_loop.c @@ -260,9 +260,9 @@ rel: */ crit_enter(); error = ifq_enqueue(&ifp->if_snd, m, &pktattr); - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_tx(ifp); ifp->if_start(ifp); - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_tx(ifp); crit_exit(); return (error); } diff --git a/sys/net/if_var.h b/sys/net/if_var.h index 9eb7d54f93..1eea6efc80 100644 --- a/sys/net/if_var.h +++ b/sys/net/if_var.h @@ -135,6 +135,14 @@ enum poll_cmd { POLL_ONLY, POLL_AND_CHECK_STATUS, POLL_DEREGISTER, POLL_REGISTER }; #endif +enum ifnet_serialize { + IFNET_SERIALIZE_ALL, + IFNET_SERIALIZE_TX_BASE = 0x10000000, + IFNET_SERIALIZE_RX_BASE = 0x20000000 +}; +#define IFNET_SERIALIZE_TX IFNET_SERIALIZE_TX_BASE +#define IFNET_SERIALIZE_RX IFNET_SERIALIZE_RX_BASE + /* * Structure defining a network interface. * @@ -161,15 +169,20 @@ enum poll_cmd { POLL_ONLY, POLL_AND_CHECK_STATUS, POLL_DEREGISTER, * * MPSAFE NOTES: * - * ifnet is protected by if_serializer. ifnet.if_snd is protected by its - * own spinlock. Callers of if_ioctl, if_start, if_watchdog, if_init, - * if_resolvemulti, and if_poll hold if_serializer. Device drivers usually - * use the same serializer for their interrupt but this is not required. - * Caller of if_output must not hold if_serializer; if_output should hold - * if_serializer based on its own needs. However, the device driver must - * be holding if_serializer when it calls if_input. Note that the serializer - * may be temporarily released within if_input to avoid a deadlock (e.g. when - * fast-forwarding or bridging packets between interfaces). + * ifnet is protected by calling if_serialize, if_tryserialize and + * if_deserialize serialize functions with the ifnet_serialize parameter. + * ifnet.if_snd is protected by its own spinlock. Callers of if_ioctl, + * if_watchdog, if_init, if_resolvemulti, and if_poll should call the + * ifnet serialize functions with IFNET_SERIALIZE_ALL. Callers of if_start + * sould call the ifnet serialize functions with IFNET_SERIALIZE_TX. + * + * FIXME: Device drivers usually use the same serializer for their interrupt + * FIXME: but this is not required. + * + * Caller of if_output must not serialize ifnet by calling ifnet serialize + * functions; if_output will call the ifnet serialize functions based on + * its own needs. However, the device driver must call ifnet serialize + * functions with IFNET_SERIALIZE_RX when it calls if_input. * * If a device driver installs the same serializer for its interrupt * as for ifnet, then the driver only really needs to worry about further @@ -226,6 +239,12 @@ struct ifnet { void (*if_poll_unused)(void); int if_poll_cpuid_used; #endif + void (*if_serialize) + (struct ifnet *, enum ifnet_serialize); + void (*if_deserialize) + (struct ifnet *, enum ifnet_serialize); + int (*if_tryserialize) + (struct ifnet *, enum ifnet_serialize); struct ifaltq if_snd; /* output queue (includes altq) */ struct ifprefixhead if_prefixhead; /* list of prefixes per if */ const uint8_t *if_broadcastaddr; @@ -318,6 +337,60 @@ typedef void if_init_f_t (void *); #ifdef _KERNEL +static __inline void +ifnet_serialize_all(struct ifnet *_ifp) +{ + _ifp->if_serialize(_ifp, IFNET_SERIALIZE_ALL); +} + +static __inline void +ifnet_deserialize_all(struct ifnet *_ifp) +{ + _ifp->if_deserialize(_ifp, IFNET_SERIALIZE_ALL); +} + +static __inline int +ifnet_tryserialize_all(struct ifnet *_ifp) +{ + return _ifp->if_tryserialize(_ifp, IFNET_SERIALIZE_ALL); +} + +static __inline void +ifnet_serialize_tx(struct ifnet *_ifp) +{ + _ifp->if_serialize(_ifp, IFNET_SERIALIZE_TX); +} + +static __inline void +ifnet_deserialize_tx(struct ifnet *_ifp) +{ + _ifp->if_deserialize(_ifp, IFNET_SERIALIZE_TX); +} + +static __inline int +ifnet_tryserialize_tx(struct ifnet *_ifp) +{ + return _ifp->if_tryserialize(_ifp, IFNET_SERIALIZE_TX); +} + +static __inline void +ifnet_serialize_rx(struct ifnet *_ifp) +{ + _ifp->if_serialize(_ifp, IFNET_SERIALIZE_RX); +} + +static __inline void +ifnet_deserialize_rx(struct ifnet *_ifp) +{ + _ifp->if_deserialize(_ifp, IFNET_SERIALIZE_RX); +} + +static __inline int +ifnet_tryserialize_rx(struct ifnet *_ifp) +{ + return _ifp->if_tryserialize(_ifp, IFNET_SERIALIZE_RX); +} + /* * DEPRECATED - should not be used by any new driver. This code uses the * old queueing interface and if_start ABI and does not use the ifp's diff --git a/sys/net/ppp/if_ppp.c b/sys/net/ppp/if_ppp.c index a402a2fb38..8d6b2d5be9 100644 --- a/sys/net/ppp/if_ppp.c +++ b/sys/net/ppp/if_ppp.c @@ -213,7 +213,7 @@ pppintr(struct netmsg *msg) sc = ppp_softc; for (i = 0; i < NPPP; ++i, ++sc) { - lwkt_serialize_enter(sc->sc_if.if_serializer); + ifnet_serialize_all(&sc->sc_if); if (!(sc->sc_flags & SC_TBUSY) && (!ifq_is_empty(&sc->sc_if.if_snd) || !IF_QEMPTY(&sc->sc_fastq))) { sc->sc_flags |= SC_TBUSY; @@ -225,7 +225,7 @@ pppintr(struct netmsg *msg) break; ppp_inproc(sc, m); } - lwkt_serialize_exit(sc->sc_if.if_serializer); + ifnet_deserialize_all(&sc->sc_if); } } @@ -900,9 +900,9 @@ pppoutput(struct ifnet *ifp, struct mbuf *m0, struct sockaddr *dst, { int error; - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_tx(ifp); error = pppoutput_serialized(ifp, m0, dst, rtp); - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_tx(ifp); return error; } @@ -946,9 +946,7 @@ ppp_requeue(struct ppp_softc *sc) error = 0; } } else { - lwkt_serialize_enter(sc->sc_if.if_serializer); error = ifq_enqueue(&sc->sc_if.if_snd, m, NULL); - lwkt_serialize_exit(sc->sc_if.if_serializer); } if (error) { sc->sc_if.if_oerrors++; diff --git a/sys/net/sl/if_sl.c b/sys/net/sl/if_sl.c index 2c9b3274cd..df99473c87 100644 --- a/sys/net/sl/if_sl.c +++ b/sys/net/sl/if_sl.c @@ -507,9 +507,9 @@ sloutput(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst, { int error; - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_tx(ifp); error = sloutput_serialized(ifp, m, dst, rtp); - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_tx(ifp); return error; } diff --git a/sys/net/sppp/if_spppsubr.c b/sys/net/sppp/if_spppsubr.c index 46010a0f76..69664ecc21 100644 --- a/sys/net/sppp/if_spppsubr.c +++ b/sys/net/sppp/if_spppsubr.c @@ -1003,9 +1003,9 @@ sppp_output(struct ifnet *ifp, struct mbuf *m, { int error; - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_tx(ifp); error = sppp_output_serialized(ifp, m, dst, rt); - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_tx(ifp); return error; } @@ -4846,7 +4846,7 @@ sppp_keepalive(void *dummy) lcp.Up(sp); } } - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_all(ifp); if (sp->pp_alivecnt <= MAXALIVECNT) ++sp->pp_alivecnt; if (sp->pp_mode == IFF_CISCO) @@ -4858,7 +4858,7 @@ sppp_keepalive(void *dummy) sppp_cp_send (sp, PPP_LCP, ECHO_REQ, sp->lcp.echoid, 4, &nmagic); } - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); } callout_reset(&keepalive_timeout, hz * 10, sppp_keepalive, NULL); crit_exit(); diff --git a/sys/net/stf/if_stf.c b/sys/net/stf/if_stf.c index 8a6c816e43..9a886574d7 100644 --- a/sys/net/stf/if_stf.c +++ b/sys/net/stf/if_stf.c @@ -411,9 +411,9 @@ stf_output(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst, { int error; - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_tx(ifp); error = stf_output_serialized(ifp, m, dst, rt); - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_tx(ifp); return error; } diff --git a/sys/net/tap/if_tap.c b/sys/net/tap/if_tap.c index ec725a606f..7374cbe0ca 100644 --- a/sys/net/tap/if_tap.c +++ b/sys/net/tap/if_tap.c @@ -168,9 +168,9 @@ tapmodevent(module_t mod, int type, void *data) "taplastunit = %d\n", minor(tp->tap_dev), taplastunit); - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_all(ifp); tapifstop(tp, 1); - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); ether_ifdetach(ifp); destroy_dev(tp->tap_dev); @@ -333,9 +333,9 @@ tapclose(struct dev_close_args *ap) if_down(ifp); clear_flags = 0; } - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_all(ifp); tapifstop(tp, clear_flags); - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); if_purgeaddrs_nolink(ifp); @@ -555,7 +555,7 @@ tapioctl(struct dev_ioctl_args *ap) short f; int error; - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_all(ifp); error = 0; switch (ap->a_cmd) { @@ -647,7 +647,7 @@ tapioctl(struct dev_ioctl_args *ap) error = ENOTTY; break; } - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); return (error); } @@ -685,23 +685,23 @@ tapread(struct dev_read_args *ap) /* sleep until we get a packet */ do { - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_all(ifp); IF_DEQUEUE(&tp->tap_devq, m0); if (m0 == NULL) { if (ap->a_ioflag & IO_NDELAY) { - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); return (EWOULDBLOCK); } tp->tap_flags |= TAP_RWAIT; crit_enter(); tsleep_interlock(tp); - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); error = tsleep(tp, PCATCH, "taprd", 0); crit_exit(); if (error) return (error); } else { - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); } } while (m0 == NULL); @@ -795,10 +795,10 @@ tapwrite(struct dev_write_args *ap) * * adjust mbuf and give packet to the ether_input */ - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_all(ifp); ifp->if_input(ifp, top); ifp->if_ipackets ++; /* ibytes are counted in ether_input */ - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); return (0); } diff --git a/sys/net/tun/if_tun.c b/sys/net/tun/if_tun.c index dc8b2c4203..0d9012f47a 100644 --- a/sys/net/tun/if_tun.c +++ b/sys/net/tun/if_tun.c @@ -174,15 +174,10 @@ tunclose(struct dev_close_args *ap) tp->tun_pid = 0; /* Junk all pending output. */ - lwkt_serialize_enter(ifp->if_serializer); ifq_purge(&ifp->if_snd); - lwkt_serialize_exit(ifp->if_serializer); - if (ifp->if_flags & IFF_UP) { - lwkt_serialize_enter(ifp->if_serializer); + if (ifp->if_flags & IFF_UP) if_down(ifp); - lwkt_serialize_exit(ifp->if_serializer); - } ifp->if_flags &= ~IFF_RUNNING; if_purgeaddrs_nolink(ifp); @@ -373,9 +368,9 @@ tunoutput(struct ifnet *ifp, struct mbuf *m0, struct sockaddr *dst, { int error; - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_all(ifp); error = tunoutput_serialized(ifp, m0, dst, rt); - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); return error; } @@ -453,7 +448,6 @@ tunioctl(struct dev_ioctl_args *ap) tp->tun_flags &= ~TUN_ASYNC; break; case FIONREAD: - lwkt_serialize_enter(tp->tun_if.if_serializer); if (!ifq_is_empty(&tp->tun_if.if_snd)) { struct mbuf *mb; @@ -463,7 +457,6 @@ tunioctl(struct dev_ioctl_args *ap) } else { *(int *)ap->a_data = 0; } - lwkt_serialize_exit(tp->tun_if.if_serializer); break; case FIOSETOWN: return (fsetown(*(int *)ap->a_data, &tp->tun_sigio)); @@ -509,21 +502,21 @@ tunread(struct dev_read_args *ap) tp->tun_flags &= ~TUN_RWAIT; - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_all(ifp); while ((m0 = ifq_dequeue(&ifp->if_snd, NULL)) == NULL) { if (ap->a_ioflag & IO_NDELAY) { - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); return EWOULDBLOCK; } tp->tun_flags |= TUN_RWAIT; - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); if ((error = tsleep(tp, PCATCH, "tunread", 0)) != 0) return error; - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_all(ifp); } - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); while (m0 && uio->uio_resid > 0 && error == 0) { len = min(uio->uio_resid, m0->m_len); @@ -679,7 +672,7 @@ tunpoll(struct dev_poll_args *ap) TUNDEBUG(ifp, "tunpoll\n"); - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_all(ifp); if (ap->a_events & (POLLIN | POLLRDNORM)) { if (!ifq_is_empty(&ifp->if_snd)) { @@ -693,7 +686,7 @@ tunpoll(struct dev_poll_args *ap) if (ap->a_events & (POLLOUT | POLLWRNORM)) revents |= ap->a_events & (POLLOUT | POLLWRNORM); - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); ap->a_events = revents; return(0); } diff --git a/sys/net/vlan/if_vlan.c b/sys/net/vlan/if_vlan.c index debefccdea..eebcefb5fc 100644 --- a/sys/net/vlan/if_vlan.c +++ b/sys/net/vlan/if_vlan.c @@ -644,7 +644,7 @@ vlan_config_dispatch(struct netmsg *nmsg) /* Link vlan into parent's vlantrunk */ vlan_link(ifv, ifp_p); - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_all(ifp); ifv->ifv_tag = vmsg->nv_vlantag; if (ifp_p->if_capenable & IFCAP_VLAN_MTU) @@ -679,7 +679,7 @@ vlan_config_dispatch(struct netmsg *nmsg) * Release vlan's serializer before reprogramming parent's * multicast filter to avoid possible dead lock. */ - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); /* * Configure multicast addresses that may already be @@ -792,7 +792,7 @@ vlan_unconfig_dispatch(struct netmsg *nmsg) if (ifp->if_flags & IFF_UP) if_down(ifp); - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_all(ifp); ifp->if_flags &= ~IFF_RUNNING; @@ -809,7 +809,7 @@ vlan_unconfig_dispatch(struct netmsg *nmsg) * Release vlan's serializer before reprogramming parent's * multicast filter to avoid possible dead lock. */ - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); if (ifp_p) { /* @@ -823,7 +823,7 @@ vlan_unconfig_dispatch(struct netmsg *nmsg) vlan_setflags(ifv, ifp_p, 0); } - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_all(ifp); ifp->if_mtu = ETHERMTU; @@ -834,7 +834,7 @@ vlan_unconfig_dispatch(struct netmsg *nmsg) bzero(LLADDR(sdl), ETHER_ADDR_LEN); bzero(ifv->ifv_ac.ac_enaddr, ETHER_ADDR_LEN); - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); /* Unlink vlan from parent's vlantrunk */ if (ifp_p != NULL && ifp_p->if_vlantrunks != NULL) @@ -880,13 +880,13 @@ vlan_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data, struct ucred *cr) * Release vlan interface's serializer to void * possible dead lock. */ - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); - lwkt_serialize_enter(ifp_p->if_serializer); + ifnet_serialize_all(ifp_p); error = ifp_p->if_ioctl(ifp_p, SIOCGIFMEDIA, data, cr); - lwkt_serialize_exit(ifp_p->if_serializer); + ifnet_deserialize_all(ifp_p); - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_all(ifp); if (ifv->ifv_p == NULL && ifv->ifv_p != ifp_p) { /* @@ -924,12 +924,12 @@ vlan_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data, struct ucred *cr) if (error) break; - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); if (vlr.vlr_parent[0] == '\0') error = vlan_unconfig(ifv); else error = vlan_config(ifv, vlr.vlr_parent, vlr.vlr_tag); - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_all(ifp); break; case SIOCGETVLAN: @@ -952,16 +952,16 @@ vlan_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data, struct ucred *cr) * We should propagate selected flags to the parent, * e.g., promiscuous mode. */ - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); error = vlan_config_flags(ifv); - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_all(ifp); break; case SIOCADDMULTI: case SIOCDELMULTI: - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); error = vlan_config_multi(ifv); - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_all(ifp); break; default: diff --git a/sys/net/vlan/if_vlan_ether.c b/sys/net/vlan/if_vlan_ether.c index ba06d8116d..bac789d86d 100644 --- a/sys/net/vlan/if_vlan_ether.c +++ b/sys/net/vlan/if_vlan_ether.c @@ -58,7 +58,7 @@ vlan_start_dispatch(struct netmsg *nmsg) M_ASSERTPKTHDR(m); KASSERT(m->m_flags & M_VLANTAG, ("mbuf has not been vlan tagged!\n")); - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_tx(ifp); /* * Make sure that the interface is still UP and RUNNING, @@ -120,7 +120,7 @@ vlan_start_dispatch(struct netmsg *nmsg) } ifq_handoff(ifp, m, &pktattr); back: - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_tx(ifp); } void diff --git a/sys/netgraph/eiface/ng_eiface.c b/sys/netgraph/eiface/ng_eiface.c index 4ae3e72b51..3978f95091 100644 --- a/sys/netgraph/eiface/ng_eiface.c +++ b/sys/netgraph/eiface/ng_eiface.c @@ -501,9 +501,9 @@ ng_eiface_rcvdata(hook_p hook, struct mbuf *m, meta_p meta) return (EINVAL); } - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_rx(ifp); if ( !(ifp->if_flags & IFF_UP) ) { - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_rx(ifp); return (ENETDOWN); } @@ -516,7 +516,7 @@ ng_eiface_rcvdata(hook_p hook, struct mbuf *m, meta_p meta) BPF_MTAP(ifp, m); ifp->if_input(ifp, m); - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_rx(ifp); /* Done */ return (error); @@ -536,9 +536,9 @@ ng_eiface_rmnode(node_p node) ng_cutlinks(node); node->flags &= ~NG_INVALID; - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_all(ifp); ifp->if_flags &= ~(IFF_UP | IFF_RUNNING | IFF_OACTIVE); - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); return (0); } diff --git a/sys/netgraph/fec/ng_fec.c b/sys/netgraph/fec/ng_fec.c index 5a28180520..0c551e81d8 100644 --- a/sys/netgraph/fec/ng_fec.c +++ b/sys/netgraph/fec/ng_fec.c @@ -473,16 +473,16 @@ ng_fec_setport(struct ifnet *ifp, u_long command, caddr_t data) priv = ifp->if_softc; b = &priv->fec_bundle; - lwkt_serialize_exit(ifp->if_serializer); /* XXX */ + ifnet_deserialize_all(ifp); /* XXX */ TAILQ_FOREACH(p, &b->ng_fec_ports, fec_list) { oifp = p->fec_if; if (oifp != NULL) { - lwkt_serialize_enter(oifp->if_serializer); + ifnet_serialize_all(oifp); oifp->if_ioctl(oifp, command, data, NULL); - lwkt_serialize_exit(oifp->if_serializer); + ifnet_deserialize_all(oifp); } } - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_all(ifp); return(0); } @@ -508,17 +508,17 @@ ng_fec_init(void *arg) ng_fec_stop(ifp); - lwkt_serialize_exit(ifp->if_serializer); /* XXX */ + ifnet_deserialize_all(ifp); /* XXX */ TAILQ_FOREACH(p, &b->ng_fec_ports, fec_list) { bifp = p->fec_if; - lwkt_serialize_enter(bifp->if_serializer); + ifnet_serialize_all(bifp); bifp->if_flags |= IFF_UP; bifp->if_ioctl(bifp, SIOCSIFFLAGS, NULL, NULL); /* mark iface as up and let the monitor check it */ p->fec_ifstat = -1; - lwkt_serialize_exit(bifp->if_serializer); + ifnet_deserialize_all(bifp); } - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_all(ifp); callout_reset(&priv->fec_timeout, hz, ng_fec_tick, priv); } @@ -534,16 +534,17 @@ ng_fec_stop(struct ifnet *ifp) priv = ifp->if_softc; b = &priv->fec_bundle; - lwkt_serialize_exit(ifp->if_serializer); /* XXX */ + ifnet_deserialize_all(ifp); /* XXX */ TAILQ_FOREACH(p, &b->ng_fec_ports, fec_list) { bifp = p->fec_if; - lwkt_serialize_enter(bifp->if_serializer); + ifnet_serialize_all(bifp); bifp->if_flags &= ~IFF_UP; bifp->if_ioctl(bifp, SIOCSIFFLAGS, NULL, NULL); - lwkt_serialize_exit(bifp->if_serializer); + ifnet_deserialize_all(bifp); } + ifnet_serialize_all(ifp); + callout_stop(&priv->fec_timeout); - lwkt_serialize_enter(ifp->if_serializer); /* XXX */ } static void @@ -566,12 +567,12 @@ ng_fec_tick(void *arg) TAILQ_FOREACH(p, &b->ng_fec_ports, fec_list) { bzero((char *)&ifmr, sizeof(ifmr)); ifp = p->fec_if; - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_all(ifp); error = ifp->if_ioctl(ifp, SIOCGIFMEDIA, (caddr_t)&ifmr, NULL); if (error) { kprintf("fec%d: failed to check status " "of link %s\n", priv->unit, ifp->if_xname); - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); continue; } @@ -595,7 +596,7 @@ ng_fec_tick(void *arg) } } } - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); } ifp = &priv->arpcom.ac_if; @@ -839,9 +840,9 @@ ng_fec_output(struct ifnet *ifp, struct mbuf *m, { int error; - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_tx(ifp); error = ng_fec_output_serialized(ifp, m, dst, rt0); - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_tx(ifp); return error; } @@ -1002,9 +1003,7 @@ ng_fec_start(struct ifnet *ifp) /* * Release current iface's serializer to avoid possible dead lock */ - lwkt_serialize_exit(ifp->if_serializer); priv->if_error = ether_output_frame(oifp, m0); - lwkt_serialize_enter(ifp->if_serializer); } #ifdef DEBUG diff --git a/sys/netgraph/iface/ng_iface.c b/sys/netgraph/iface/ng_iface.c index 66dc7b8667..943df9b419 100644 --- a/sys/netgraph/iface/ng_iface.c +++ b/sys/netgraph/iface/ng_iface.c @@ -464,9 +464,9 @@ ng_iface_output(struct ifnet *ifp, struct mbuf *m, { int error; - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_tx(ifp); error = ng_iface_output_serialized(ifp, m, dst, rt0); - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_tx(ifp); return error; } diff --git a/sys/netinet/if_atm.c b/sys/netinet/if_atm.c index d8f30a23b4..8714410638 100644 --- a/sys/netinet/if_atm.c +++ b/sys/netinet/if_atm.c @@ -152,10 +152,10 @@ atm_rtrequest(int req, struct rtentry *rt, struct rt_addrinfo *info) */ bcopy(LLADDR(SDL(gate)), &api.aph, sizeof(api.aph)); api.rxhand = NULL; - lwkt_serialize_enter(rt->rt_ifp->if_serializer); + ifnet_serialize_all(rt->rt_ifp); error = rt->rt_ifp->if_ioctl(rt->rt_ifp, SIOCATMENA, (caddr_t)&api, NULL); - lwkt_serialize_exit(rt->rt_ifp->if_serializer); + ifnet_deserialize_all(rt->rt_ifp); if (error) { kprintf("atm: couldn't add VC\n"); goto failed; @@ -197,10 +197,10 @@ failed: bcopy(LLADDR(SDL(gate)), &api.aph, sizeof(api.aph)); api.rxhand = NULL; - lwkt_serialize_enter(rt->rt_ifp->if_serializer); + ifnet_serialize_all(rt->rt_ifp); rt->rt_ifp->if_ioctl(rt->rt_ifp, SIOCATMDIS, (caddr_t)&api, NULL); - lwkt_serialize_exit(rt->rt_ifp->if_serializer); + ifnet_deserialize_all(rt->rt_ifp); break; } } diff --git a/sys/netinet/in.c b/sys/netinet/in.c index 8693d696bb..43d265ad32 100644 --- a/sys/netinet/in.c +++ b/sys/netinet/in.c @@ -614,10 +614,10 @@ in_control_internal(u_long cmd, caddr_t data, struct ifnet *ifp, oldaddr = ia->ia_dstaddr; ia->ia_dstaddr = *(struct sockaddr_in *)&ifr->ifr_dstaddr; if (ifp->if_ioctl != NULL) { - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_all(ifp); error = ifp->if_ioctl(ifp, SIOCSIFDSTADDR, (caddr_t)ia, td->td_proc->p_ucred); - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); if (error) { ia->ia_dstaddr = oldaddr; return (error); @@ -731,9 +731,9 @@ in_control_internal(u_long cmd, caddr_t data, struct ifnet *ifp, default: if (ifp == NULL || ifp->if_ioctl == NULL) return (EOPNOTSUPP); - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_all(ifp); error = ifp->if_ioctl(ifp, cmd, data, td->td_proc->p_ucred); - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); return (error); } @@ -1005,9 +1005,9 @@ in_ifinit(struct ifnet *ifp, struct in_ifaddr *ia, * and to validate the address if necessary. */ if (ifp->if_ioctl != NULL) { - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_all(ifp); error = ifp->if_ioctl(ifp, SIOCSIFADDR, (caddr_t)ia, NULL); - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); if (error) goto fail; } diff --git a/sys/netinet6/in6.c b/sys/netinet6/in6.c index 5c1b218c35..c5bdcbbee6 100644 --- a/sys/netinet6/in6.c +++ b/sys/netinet6/in6.c @@ -782,9 +782,9 @@ purgeaddr: default: if (ifp == NULL || ifp->if_ioctl == 0) return (EOPNOTSUPP); - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_all(ifp); error = ifp->if_ioctl(ifp, cmd, data, td->td_proc->p_ucred); - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); return (error); } @@ -1585,16 +1585,17 @@ in6_ifinit(struct ifnet *ifp, struct in6_ifaddr *ia, struct sockaddr_in6 *sin6, ifacount++; } - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_all(ifp); ia->ia_addr = *sin6; if (ifacount <= 1 && ifp->if_ioctl && (error = ifp->if_ioctl(ifp, SIOCSIFADDR, (caddr_t)ia, NULL))) { - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); return (error); } - lwkt_serialize_exit(ifp->if_serializer); + + ifnet_deserialize_all(ifp); ia->ia_ifa.ifa_metric = ifp->if_metric; diff --git a/sys/netinet6/ip6_mroute.c b/sys/netinet6/ip6_mroute.c index 825697f1dc..24053c4a22 100644 --- a/sys/netinet6/ip6_mroute.c +++ b/sys/netinet6/ip6_mroute.c @@ -446,10 +446,10 @@ ip6_mrouter_done(void) ifr.ifr_addr.sin6_family = AF_INET6; ifr.ifr_addr.sin6_addr= kin6addr_any; ifp = mif6table[mifi].m6_ifp; - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_all(ifp); ifp->if_ioctl(ifp, SIOCDELMULTI, (caddr_t)&ifr, NULL); - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); } } } diff --git a/sys/netinet6/scope6.c b/sys/netinet6/scope6.c index 847b81fa81..70ae83ffe3 100644 --- a/sys/netinet6/scope6.c +++ b/sys/netinet6/scope6.c @@ -309,7 +309,7 @@ in6_setscope(struct in6_addr *in6, struct ifnet *ifp, u_int32_t *ret_id) u_int32_t zoneid = 0; struct scope6_id *sid; - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_all(ifp); sid = SID(ifp); @@ -326,12 +326,12 @@ in6_setscope(struct in6_addr *in6, struct ifnet *ifp, u_int32_t *ret_id) */ if (IN6_IS_ADDR_LOOPBACK(in6)) { if (!(ifp->if_flags & IFF_LOOPBACK)) { - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); return (EINVAL); } else { if (ret_id != NULL) *ret_id = 0; /* there's no ambiguity */ - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); return (0); } } @@ -359,7 +359,8 @@ in6_setscope(struct in6_addr *in6, struct ifnet *ifp, u_int32_t *ret_id) zoneid = 0; /* XXX: treat as global. */ break; } - lwkt_serialize_exit(ifp->if_serializer); + + ifnet_deserialize_all(ifp); if (ret_id != NULL) *ret_id = zoneid; diff --git a/sys/netproto/802_11/wlan/ieee80211.c b/sys/netproto/802_11/wlan/ieee80211.c index b31384f7b9..80db97d186 100644 --- a/sys/netproto/802_11/wlan/ieee80211.c +++ b/sys/netproto/802_11/wlan/ieee80211.c @@ -231,9 +231,9 @@ ieee80211_ifdetach(struct ieee80211com *ic) * In order to make the assertion work, hold serializer here. * SHOULD BE REMOVED */ - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_all(ifp); ieee80211_ratectl_detach(ic); - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); ieee80211_remove_vap(ic); @@ -249,9 +249,9 @@ ieee80211_ifdetach(struct ieee80211com *ic) * In order to make the assertion work, hold serializer here. * SHOULD BE REMOVED */ - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_all(ifp); ieee80211_node_detach(ic); - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); ifmedia_removeall(&ic->ic_media); @@ -358,7 +358,7 @@ ieee80211_media_init(struct ieee80211com *ic, * * SHOULD BE REMOVED */ - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_all(ifp); /* * Do late attach work that must wait for any subclass @@ -366,7 +366,7 @@ ieee80211_media_init(struct ieee80211com *ic, */ ieee80211_node_lateattach(ic); - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); /* * Fill in media characteristics. diff --git a/sys/netproto/802_11/wlan/ieee80211_proto.c b/sys/netproto/802_11/wlan/ieee80211_proto.c index 561fe0e340..fb0eab24b0 100644 --- a/sys/netproto/802_11/wlan/ieee80211_proto.c +++ b/sys/netproto/802_11/wlan/ieee80211_proto.c @@ -938,7 +938,7 @@ ieee80211_swbmiss(void *arg) struct ieee80211com *ic = arg; struct ifnet *ifp = ic->ic_ifp; - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_all(ifp); if (ic->ic_swbmiss_count == 0) { ieee80211_beacon_miss(ic); @@ -950,7 +950,7 @@ ieee80211_swbmiss(void *arg) ieee80211_swbmiss, ic); back: - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); } static void diff --git a/sys/netproto/802_11/wlan_ratectl/amrr/ieee80211_ratectl_amrr.c b/sys/netproto/802_11/wlan_ratectl/amrr/ieee80211_ratectl_amrr.c index 08af4bc8e5..cf7f20622b 100644 --- a/sys/netproto/802_11/wlan_ratectl/amrr/ieee80211_ratectl_amrr.c +++ b/sys/netproto/802_11/wlan_ratectl/amrr/ieee80211_ratectl_amrr.c @@ -443,7 +443,7 @@ amrr_tick(void *arg) struct ifnet *ifp = &ic->ic_if; int interval; - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_all(ifp); if (ifp->if_flags & IFF_RUNNING) { if (ic->ic_opmode == IEEE80211_M_STA) @@ -456,7 +456,7 @@ amrr_tick(void *arg) interval /= 2; callout_reset(&asc->timer, (interval * hz) / 1000, amrr_tick, asc); - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); } static void diff --git a/sys/netproto/802_11/wlan_ratectl/onoe/ieee80211_ratectl_onoe.c b/sys/netproto/802_11/wlan_ratectl/onoe/ieee80211_ratectl_onoe.c index c9ab27def1..3b6617d3fb 100644 --- a/sys/netproto/802_11/wlan_ratectl/onoe/ieee80211_ratectl_onoe.c +++ b/sys/netproto/802_11/wlan_ratectl/onoe/ieee80211_ratectl_onoe.c @@ -431,7 +431,7 @@ onoe_tick(void *arg) struct ifnet *ifp = &ic->ic_if; int interval; - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_all(ifp); if (ifp->if_flags & IFF_RUNNING) { if (ic->ic_opmode == IEEE80211_M_STA) @@ -445,7 +445,7 @@ onoe_tick(void *arg) interval /= 2; callout_reset(&osc->timer, (interval * hz) / 1000, onoe_tick, osc); - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); } static void diff --git a/sys/netproto/atalk/at_control.c b/sys/netproto/atalk/at_control.c index 007924fd7d..40787c132e 100644 --- a/sys/netproto/atalk/at_control.c +++ b/sys/netproto/atalk/at_control.c @@ -309,9 +309,9 @@ at_control(struct socket *so, u_long cmd, caddr_t data, default: if ( ifp == 0 || ifp->if_ioctl == 0 ) return( EOPNOTSUPP ); - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_all(ifp); error = ifp->if_ioctl(ifp, cmd, data, td->td_proc->p_ucred); - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); return (error); } return( 0 ); @@ -560,7 +560,7 @@ at_ifinit(struct ifnet *ifp, struct at_ifaddr *aa, struct sockaddr_at *sat) * Now that we have selected an address, we need to tell the interface * about it, just in case it needs to adjust something. */ - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_all(ifp); if (ifp->if_ioctl && (error = ifp->if_ioctl(ifp, SIOCSIFADDR, (caddr_t)aa, NULL)) ) { @@ -571,11 +571,11 @@ at_ifinit(struct ifnet *ifp, struct at_ifaddr *aa, struct sockaddr_at *sat) aa->aa_addr = oldaddr; aa->aa_firstnet = onr.nr_firstnet; aa->aa_lastnet = onr.nr_lastnet; - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); crit_exit(); return( error ); } - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); /* * set up the netmask part of the at_ifaddr diff --git a/sys/netproto/atm/atm_if.c b/sys/netproto/atm/atm_if.c index 46eacf2290..171d9ea39b 100644 --- a/sys/netproto/atm/atm_if.c +++ b/sys/netproto/atm/atm_if.c @@ -975,9 +975,9 @@ atm_ifoutput(struct ifnet *ifp, KBuffer *m, struct sockaddr *dst, { int error; - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_tx(ifp); error = atm_ifoutput_serialized(ifp, m, dst, rt); - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_tx(ifp); return error; } diff --git a/sys/netproto/ipx/ipx.c b/sys/netproto/ipx/ipx.c index 66ae830111..d5cbe83704 100644 --- a/sys/netproto/ipx/ipx.c +++ b/sys/netproto/ipx/ipx.c @@ -162,10 +162,10 @@ ipx_control(struct socket *so, u_long cmd, caddr_t data, ia->ia_flags &= ~IFA_ROUTE; } if (ifp->if_ioctl) { - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_all(ifp); error = ifp->if_ioctl(ifp, SIOCSIFDSTADDR, (void *)ia, td->td_proc->p_ucred); - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); if (error) return (error); } @@ -221,9 +221,9 @@ ipx_control(struct socket *so, u_long cmd, caddr_t data, default: if (ifp->if_ioctl == NULL) return (EOPNOTSUPP); - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_all(ifp); error = ifp->if_ioctl(ifp, cmd, data, td->td_proc->p_ucred); - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); return (error); } } @@ -270,14 +270,14 @@ ipx_ifinit(struct ifnet *ifp, struct ipx_ifaddr *ia, * if this is its first address, * and to validate the address if necessary. */ - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_all(ifp); if (ifp->if_ioctl != NULL && (error = ifp->if_ioctl(ifp, SIOCSIFADDR, (void *)ia, NULL))) { ia->ia_addr = oldaddr; - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); return (error); } - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); ia->ia_ifa.ifa_metric = ifp->if_metric; /* * Add route for the network. diff --git a/sys/netproto/ipx/ipx_ip.c b/sys/netproto/ipx/ipx_ip.c index b37618593e..e999c763ab 100644 --- a/sys/netproto/ipx/ipx_ip.c +++ b/sys/netproto/ipx/ipx_ip.c @@ -291,9 +291,9 @@ ipxipoutput(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst, { int error; - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_tx(ifp); error = ipxipoutput_serialized(ifp, m, dst, rt); - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_tx(ifp); return error; } diff --git a/sys/netproto/natm/natm.c b/sys/netproto/natm/natm.c index 545bd67104..cd56285f0a 100644 --- a/sys/netproto/natm/natm.c +++ b/sys/netproto/natm/natm.c @@ -213,16 +213,16 @@ natm_usr_connect(struct socket *so, struct sockaddr *nam, struct thread *td) ATM_PH_VPI(&api.aph) = npcb->npcb_vpi; ATM_PH_SETVCI(&api.aph, npcb->npcb_vci); api.rxhand = npcb; - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_all(ifp); if (ifp->if_ioctl == NULL || ifp->if_ioctl(ifp, SIOCATMENA, (caddr_t) &api, td->td_proc->p_ucred) != 0) { - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); npcb_free(npcb, NPCB_REMOVE); error = EIO; goto out; } - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); soisconnected(so); @@ -262,9 +262,9 @@ natm_usr_disconnect(struct socket *so) ATM_PH_SETVCI(&api.aph, npcb->npcb_vci); api.rxhand = npcb; if (ifp->if_ioctl != NULL) { - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_all(ifp); ifp->if_ioctl(ifp, SIOCATMDIS, (caddr_t) &api, NULL); - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); } npcb_free(npcb, NPCB_REMOVE); @@ -381,11 +381,11 @@ natm_usr_control(struct socket *so, u_long cmd, caddr_t arg, } ario.npcb = npcb; ario.rawvalue = *((int *)arg); - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_all(npcb->npcb_ifp); error = npcb->npcb_ifp->if_ioctl(npcb->npcb_ifp, SIOCXRAWATM, (caddr_t) &ario, td->td_proc->p_ucred); - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(npcb->npcb_ifp); if (!error) { if (ario.rawvalue) npcb->npcb_flags |= NPCB_RAW; @@ -562,16 +562,15 @@ natm_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam, ATM_PH_VPI(&api.aph) = npcb->npcb_vpi; ATM_PH_SETVCI(&api.aph, npcb->npcb_vci); api.rxhand = npcb; - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_all(ifp); if (ifp->if_ioctl == NULL || - ifp->if_ioctl(ifp, SIOCATMENA, (caddr_t) &api, - NULL) != 0) { - lwkt_serialize_exit(ifp->if_serializer); + ifp->if_ioctl(ifp, SIOCATMENA, (caddr_t) &api, NULL) != 0) { + ifnet_deserialize_all(ifp); npcb_free(npcb, NPCB_REMOVE); error = EIO; break; } - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); soisconnected(so); @@ -594,10 +593,10 @@ natm_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam, ATM_PH_VPI(&api.aph) = npcb->npcb_vpi; ATM_PH_SETVCI(&api.aph, npcb->npcb_vci); api.rxhand = npcb; - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_all(ifp); if (ifp->if_ioctl != NULL) ifp->if_ioctl(ifp, SIOCATMDIS, (caddr_t) &api, NULL); - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); npcb_free(npcb, NPCB_REMOVE); soisdisconnected(so); @@ -665,10 +664,10 @@ natm_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam, } ario.npcb = npcb; ario.rawvalue = *((int *)nam); - lwkt_serialize_enter(npcb->npcb_ifp->if_serializer); + ifnet_serialize_all(npcb->npcb_ifp); error = npcb->npcb_ifp->if_ioctl(npcb->npcb_ifp, SIOCXRAWATM, (caddr_t) &ario, NULL); - lwkt_serialize_exit(npcb->npcb_ifp->if_serializer); + ifnet_deserialize_all(npcb->npcb_ifp); if (!error) { if (ario.rawvalue) npcb->npcb_flags |= NPCB_RAW; diff --git a/sys/netproto/ns/ns.c b/sys/netproto/ns/ns.c index 0438da97b4..5ae9f3e971 100644 --- a/sys/netproto/ns/ns.c +++ b/sys/netproto/ns/ns.c @@ -169,11 +169,10 @@ ns_control(struct socket *so, u_long cmd, caddr_t data, struct ifnet *ifp, ia->ia_flags &= ~IFA_ROUTE; } if (ifp->if_ioctl) { - lwkt_serialize_enter(ifp->if_serializer); - error = ifp->if_ioctl(ifp, SIOCSIFDSTADDR, - (caddr_t)ia, - NULL); - lwkt_serialize_exit(ifp->if_serializer); + ifnet_serialize_all(ifp); + error = ifp->if_ioctl(ifp, SIOCSIFDSTADDR, (caddr_t)ia, + NULL); + ifnet_deserialize_all(ifp); if (error) return (error); } @@ -235,9 +234,9 @@ ns_control(struct socket *so, u_long cmd, caddr_t data, struct ifnet *ifp, default: if (ifp->if_ioctl == 0) return (EOPNOTSUPP); - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_all(ifp); error = ifp->if_ioctl(ifp, cmd, data, NULL); - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); return (error); } } @@ -287,32 +286,32 @@ ns_ifinit(struct ifnet *ifp, struct ns_ifaddr *ia, struct sockaddr_ns *sns, int * and to validate the address if necessary. */ if (ns_hosteqnh(ns_thishost, ns_zerohost)) { - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_all(ifp); if (ifp->if_ioctl && (error = ifp->if_ioctl(ifp, SIOCSIFADDR, (caddr_t)ia, NULL))) { ia->ia_addr = oldaddr; - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); crit_exit(); return (error); } - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); ns_thishost = *h; } else if (ns_hosteqnh(sns->sns_addr.x_host, ns_zerohost) || ns_hosteqnh(sns->sns_addr.x_host, ns_thishost)) { *h = ns_thishost; - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_all(ifp); if (ifp->if_ioctl && (error = ifp->if_ioctl(ifp, SIOCSIFADDR, (caddr_t)ia, NULL))) { ia->ia_addr = oldaddr; - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); crit_exit(); return (error); } - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_all(ifp); if (!ns_hosteqnh(ns_thishost,*h)) { ia->ia_addr = oldaddr; crit_exit(); diff --git a/sys/netproto/ns/ns_ip.c b/sys/netproto/ns/ns_ip.c index 852f94f0b2..dcbb64b9ae 100644 --- a/sys/netproto/ns/ns_ip.c +++ b/sys/netproto/ns/ns_ip.c @@ -301,9 +301,9 @@ nsipoutput(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst, { int error; - lwkt_serialize_enter(ifp->if_serializer); + ifnet_serialize_tx(ifp); error = nsipoutput_serialized(ifp->if_softc, m, dst); - lwkt_serialize_exit(ifp->if_serializer); + ifnet_deserialize_tx(ifp); return error; } -- 2.41.0