summaryrefslogtreecommitdiffstats
path: root/sys/dev/fxp
diff options
context:
space:
mode:
authorwes <wes@FreeBSD.org>2005-06-10 23:54:52 +0000
committerwes <wes@FreeBSD.org>2005-06-10 23:54:52 +0000
commita5a3ddb9c7137a05b512c8d12af4e4223209631b (patch)
tree10345abfd6e6ff22953c36bea78809c7d3f6892b /sys/dev/fxp
parent1f4f08f3da0371a57e26c55a541f3ac4e56e9784 (diff)
downloadFreeBSD-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.c7
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) {
OpenPOWER on IntegriCloud