From 1026fbd360db933593886c5c4fbb5b58ffa84a96 Mon Sep 17 00:00:00 2001 From: Wes Peters Date: Fri, 10 Jun 2005 23:54:52 +0000 Subject: [PATCH] Avoid deadlock in fxp driver when system runs out of mbufs. MFC after: 1 week Provided by: Ernie Smallis --- sys/dev/fxp/if_fxp.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/sys/dev/fxp/if_fxp.c b/sys/dev/fxp/if_fxp.c index 5f8d68600028..4fd50f93ac47 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) {