diff options
author | wes <wes@FreeBSD.org> | 2005-06-10 23:54:52 +0000 |
---|---|---|
committer | wes <wes@FreeBSD.org> | 2005-06-10 23:54:52 +0000 |
commit | a5a3ddb9c7137a05b512c8d12af4e4223209631b (patch) | |
tree | 10345abfd6e6ff22953c36bea78809c7d3f6892b /sys/dev/fxp | |
parent | 1f4f08f3da0371a57e26c55a541f3ac4e56e9784 (diff) | |
download | FreeBSD-src-a5a3ddb9c7137a05b512c8d12af4e4223209631b.zip FreeBSD-src-a5a3ddb9c7137a05b512c8d12af4e4223209631b.tar.gz |
Avoid deadlock in fxp driver when system runs out of mbufs.
MFC after: 1 week
Provided by: Ernie Smallis <esmallis@stbernard.com>
Diffstat (limited to 'sys/dev/fxp')
-rw-r--r-- | sys/dev/fxp/if_fxp.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/sys/dev/fxp/if_fxp.c b/sys/dev/fxp/if_fxp.c index 5f8d686..4fd50f9 100644 --- a/sys/dev/fxp/if_fxp.c +++ b/sys/dev/fxp/if_fxp.c @@ -1576,6 +1576,7 @@ fxp_intr_body(struct fxp_softc *sc, struct ifnet *ifp, uint8_t statack, struct fxp_rx *rxp; struct fxp_rfa *rfa; int rnr = (statack & FXP_SCB_STATACK_RNR) ? 1 : 0; + int fxp_rc = 0; FXP_LOCK_ASSERT(sc, MA_OWNED); if (rnr) @@ -1666,7 +1667,8 @@ fxp_intr_body(struct fxp_softc *sc, struct ifnet *ifp, uint8_t statack, * If this fails, the old buffer is recycled * instead. */ - if (fxp_add_rfabuf(sc, rxp) == 0) { + fxp_rc = fxp_add_rfabuf(sc, rxp); + if (fxp_rc == 0) { int total_len; /* @@ -1718,6 +1720,9 @@ fxp_intr_body(struct fxp_softc *sc, struct ifnet *ifp, uint8_t statack, FXP_UNLOCK(sc); (*ifp->if_input)(ifp, m); FXP_LOCK(sc); + } else if (fxp_rc == ENOBUFS) { + rnr = 0; + break; } } if (rnr) { |