Date: Tue, 21 Sep 2010 23:08:13 +0000 (UTC) From: Weongyo Jeong <weongyo@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r212981 - user/weongyo/usb/sys/dev/usb/net Message-ID: <201009212308.o8LN8DSl009450@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: weongyo Date: Tue Sep 21 23:08:12 2010 New Revision: 212981 URL: http://svn.freebsd.org/changeset/base/212981 Log: Fixes a regression that [devname]_start API could be called without holding the device lock if it's called from ifp->if_start(). Modified: user/weongyo/usb/sys/dev/usb/net/if_aue.c user/weongyo/usb/sys/dev/usb/net/if_axe.c user/weongyo/usb/sys/dev/usb/net/if_cdce.c user/weongyo/usb/sys/dev/usb/net/if_cue.c user/weongyo/usb/sys/dev/usb/net/if_kue.c user/weongyo/usb/sys/dev/usb/net/if_rue.c user/weongyo/usb/sys/dev/usb/net/if_udav.c Modified: user/weongyo/usb/sys/dev/usb/net/if_aue.c ============================================================================== --- user/weongyo/usb/sys/dev/usb/net/if_aue.c Tue Sep 21 22:42:14 2010 (r212980) +++ user/weongyo/usb/sys/dev/usb/net/if_aue.c Tue Sep 21 23:08:12 2010 (r212981) @@ -223,6 +223,7 @@ static int aue_ifmedia_upd(struct ifnet static void aue_ifmedia_sts(struct ifnet *, struct ifmediareq *); static int aue_ioctl(struct ifnet *, u_long, caddr_t); static void aue_start(struct ifnet *); +static void aue_start_locked(struct ifnet *); static void aue_init(void *); static void aue_setmulti(void *, int); static void aue_setmulti_locked(struct aue_softc *); @@ -985,7 +986,7 @@ aue_tick(struct aue_softc *sc) && mii->mii_media_status & IFM_ACTIVE && IFM_SUBTYPE(mii->mii_media_active) != IFM_NONE) { sc->sc_flags |= AUE_FLAG_LINK; - aue_start(sc->sc_ifp); + aue_start_locked(sc->sc_ifp); } } @@ -994,6 +995,18 @@ aue_start(struct ifnet *ifp) { struct aue_softc *sc = ifp->if_softc; + AUE_LOCK(sc); + aue_start_locked(ifp); + AUE_UNLOCK(sc); +} + +static void +aue_start_locked(struct ifnet *ifp) +{ + struct aue_softc *sc = ifp->if_softc; + + AUE_LOCK_ASSERT(sc, MA_OWNED); + /* * start the USB transfers, if not already started: */ @@ -1044,7 +1057,7 @@ aue_init_locked(struct aue_softc *sc) ifp->if_drv_flags |= IFF_DRV_RUNNING; sleepout_reset(&sc->sc_watchdog, hz, aue_watchdog, sc); - aue_start(sc->sc_ifp); + aue_start_locked(sc->sc_ifp); } static void Modified: user/weongyo/usb/sys/dev/usb/net/if_axe.c ============================================================================== --- user/weongyo/usb/sys/dev/usb/net/if_axe.c Tue Sep 21 22:42:14 2010 (r212980) +++ user/weongyo/usb/sys/dev/usb/net/if_axe.c Tue Sep 21 23:08:12 2010 (r212981) @@ -202,6 +202,7 @@ static void axe_init(void *); static void axe_init_locked(struct axe_softc *); static int axe_ioctl(struct ifnet *, u_long, caddr_t); static void axe_start(struct ifnet *); +static void axe_start_locked(struct ifnet *); static void axe_tick(struct axe_softc *); static void axe_stop(struct axe_softc *); static void axe_setmulti_locked(struct axe_softc *); @@ -1140,7 +1141,7 @@ axe_tick(struct axe_softc *sc) if ((sc->sc_flags & AXE_FLAG_LINK) == 0) { axe_miibus_statchg(sc->sc_dev); if ((sc->sc_flags & AXE_FLAG_LINK) != 0) - axe_start(sc->sc_ifp); + axe_start_locked(sc->sc_ifp); } } @@ -1149,6 +1150,18 @@ axe_start(struct ifnet *ifp) { struct axe_softc *sc = ifp->if_softc; + AXE_LOCK(sc); + axe_start_locked(ifp); + AXE_UNLOCK(sc); +} + +static void +axe_start_locked(struct ifnet *ifp) +{ + struct axe_softc *sc = ifp->if_softc; + + AXE_LOCK_ASSERT(sc, MA_OWNED); + /* * start the USB transfers, if not already started: */ @@ -1226,7 +1239,7 @@ axe_init_locked(struct axe_softc *sc) ifp->if_drv_flags |= IFF_DRV_RUNNING; sleepout_reset(&sc->sc_watchdog, hz, axe_watchdog, sc); - axe_start(sc->sc_ifp); + axe_start_locked(sc->sc_ifp); } static void Modified: user/weongyo/usb/sys/dev/usb/net/if_cdce.c ============================================================================== --- user/weongyo/usb/sys/dev/usb/net/if_cdce.c Tue Sep 21 22:42:14 2010 (r212980) +++ user/weongyo/usb/sys/dev/usb/net/if_cdce.c Tue Sep 21 23:08:12 2010 (r212981) @@ -108,6 +108,7 @@ static usb_callback_t cdce_ncm_bulk_read static uint32_t cdce_m_crc32(struct mbuf *, uint32_t, uint32_t); static int cdce_ioctl(struct ifnet *, u_long, caddr_t); static void cdce_start(struct ifnet *); +static void cdce_start_locked(struct ifnet *); static void cdce_init(void *); static void cdce_init_locked(struct cdce_softc *); static int cdce_rxmbuf(struct cdce_softc *, struct mbuf *, unsigned int); @@ -633,6 +634,18 @@ cdce_start(struct ifnet *ifp) { struct cdce_softc *sc = ifp->if_softc; + CDCE_LOCK(sc); + cdce_start_locked(ifp); + CDCE_UNLOCK(sc); +} + +static void +cdce_start_locked(struct ifnet *ifp) +{ + struct cdce_softc *sc = ifp->if_softc; + + CDCE_LOCK_ASSERT(sc, MA_OWNED); + /* * Start the USB transfers, if not already started: */ @@ -795,7 +808,7 @@ cdce_init_locked(struct cdce_softc *sc) usbd_xfer_set_stall(sc->sc_xfer[CDCE_BULK_TX]); /* start data transfers */ - cdce_start(sc->sc_ifp); + cdce_start_locked(sc->sc_ifp); } static void Modified: user/weongyo/usb/sys/dev/usb/net/if_cue.c ============================================================================== --- user/weongyo/usb/sys/dev/usb/net/if_cue.c Tue Sep 21 22:42:14 2010 (r212980) +++ user/weongyo/usb/sys/dev/usb/net/if_cue.c Tue Sep 21 23:08:12 2010 (r212981) @@ -127,6 +127,7 @@ static void cue_init(void *); static void cue_init_locked(struct cue_softc *); static int cue_ioctl(struct ifnet *, u_long, caddr_t); static void cue_start(struct ifnet *); +static void cue_start_locked(struct ifnet *); static int cue_rxbuf(struct cue_softc *, struct usb_page_cache *, unsigned int, unsigned int); static void cue_rxflush(struct cue_softc *); @@ -599,6 +600,18 @@ cue_start(struct ifnet *ifp) { struct cue_softc *sc = ifp->if_softc; + CUE_LOCK(sc); + cue_start_locked(ifp); + CUE_UNLOCK(sc); +} + +static void +cue_start_locked(struct ifnet *ifp) +{ + struct cue_softc *sc = ifp->if_softc; + + CUE_LOCK_ASSERT(sc, MA_OWNED); + /* * start the USB transfers, if not already started: */ @@ -659,7 +672,7 @@ cue_init_locked(struct cue_softc *sc) ifp->if_drv_flags |= IFF_DRV_RUNNING; sleepout_reset(&sc->sc_watchdog, hz, cue_watchdog, sc); - cue_start(sc->sc_ifp); + cue_start_locked(sc->sc_ifp); } /* Modified: user/weongyo/usb/sys/dev/usb/net/if_kue.c ============================================================================== --- user/weongyo/usb/sys/dev/usb/net/if_kue.c Tue Sep 21 22:42:14 2010 (r212980) +++ user/weongyo/usb/sys/dev/usb/net/if_kue.c Tue Sep 21 23:08:12 2010 (r212981) @@ -168,6 +168,7 @@ static void kue_init(void *); static void kue_init_locked(struct kue_softc *); static int kue_ioctl(struct ifnet *, u_long, caddr_t); static void kue_start(struct ifnet *); +static void kue_start_locked(struct ifnet *); #ifdef USB_DEBUG static int kue_debug = 0; @@ -734,6 +735,18 @@ kue_start(struct ifnet *ifp) { struct kue_softc *sc = ifp->if_softc; + KUE_LOCK(sc); + kue_start_locked(ifp); + KUE_UNLOCK(sc); +} + +static void +kue_start_locked(struct ifnet *ifp) +{ + struct kue_softc *sc = ifp->if_softc; + + KUE_LOCK_ASSERT(sc, MA_OWNED); + /* * start the USB transfers, if not already started: */ @@ -778,7 +791,7 @@ kue_init_locked(struct kue_softc *sc) usbd_xfer_set_stall(sc->sc_xfer[KUE_BULK_DT_WR]); ifp->if_drv_flags |= IFF_DRV_RUNNING; - kue_start(sc->sc_ifp); + kue_start_locked(sc->sc_ifp); } static void Modified: user/weongyo/usb/sys/dev/usb/net/if_rue.c ============================================================================== --- user/weongyo/usb/sys/dev/usb/net/if_rue.c Tue Sep 21 22:42:14 2010 (r212980) +++ user/weongyo/usb/sys/dev/usb/net/if_rue.c Tue Sep 21 23:08:12 2010 (r212981) @@ -157,6 +157,7 @@ static void rue_init(void *); static void rue_init_locked(struct rue_softc *); static int rue_ioctl(struct ifnet *, u_long, caddr_t); static void rue_start(struct ifnet *); +static void rue_start_locked(struct ifnet *); static void rue_stop(struct rue_softc *); static void rue_watchdog(void *); @@ -901,7 +902,7 @@ rue_tick(struct rue_softc *sc) && mii->mii_media_status & IFM_ACTIVE && IFM_SUBTYPE(mii->mii_media_active) != IFM_NONE) { sc->sc_flags |= RUE_FLAG_LINK; - rue_start(sc->sc_ifp); + rue_start_locked(sc->sc_ifp); } } @@ -910,6 +911,18 @@ rue_start(struct ifnet *ifp) { struct rue_softc *sc = ifp->if_softc; + RUE_LOCK(sc); + rue_start_locked(ifp); + RUE_UNLOCK(sc); +} + +static void +rue_start_locked(struct ifnet *ifp) +{ + struct rue_softc *sc = ifp->if_softc; + + RUE_LOCK_ASSERT(sc, MA_OWNED); + /* * start the USB transfers, if not already started: */ @@ -963,7 +976,7 @@ rue_init_locked(struct rue_softc *sc) ifp->if_drv_flags |= IFF_DRV_RUNNING; sleepout_reset(&sc->sc_watchdog, hz, rue_watchdog, sc); - rue_start(sc->sc_ifp); + rue_start_locked(sc->sc_ifp); } /* Modified: user/weongyo/usb/sys/dev/usb/net/if_udav.c ============================================================================== --- user/weongyo/usb/sys/dev/usb/net/if_udav.c Tue Sep 21 22:42:14 2010 (r212980) +++ user/weongyo/usb/sys/dev/usb/net/if_udav.c Tue Sep 21 23:08:12 2010 (r212981) @@ -113,6 +113,7 @@ static void udav_init(void *); static void udav_init_locked(struct udav_softc *); static int udav_ioctl(struct ifnet *, u_long, caddr_t); static void udav_start(struct ifnet *); +static void udav_start_locked(struct ifnet *); static void udav_setmulti(void *, int); static void udav_stop(struct udav_softc *); static void udav_setpromisc(struct udav_softc *); @@ -481,7 +482,7 @@ udav_init_locked(struct udav_softc *sc) ifp->if_drv_flags |= IFF_DRV_RUNNING; sleepout_reset(&sc->sc_watchdog, hz, udav_watchdog, sc); - udav_start(sc->sc_ifp); + udav_start_locked(sc->sc_ifp); } static void @@ -578,6 +579,18 @@ udav_start(struct ifnet *ifp) { struct udav_softc *sc = ifp->if_softc; + UDAV_LOCK(sc); + udav_start_locked(ifp); + UDAV_UNLOCK(sc); +} + +static void +udav_start_locked(struct ifnet *ifp) +{ + struct udav_softc *sc = ifp->if_softc; + + UDAV_LOCK_ASSERT(sc, MA_OWNED); + /* * start the USB transfers, if not already started: */ @@ -873,7 +886,7 @@ udav_tick(struct udav_softc *sc) && mii->mii_media_status & IFM_ACTIVE && IFM_SUBTYPE(mii->mii_media_active) != IFM_NONE) { sc->sc_flags |= UDAV_FLAG_LINK; - udav_start(sc->sc_ifp); + udav_start_locked(sc->sc_ifp); } }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201009212308.o8LN8DSl009450>