From b2792ff681e96d921bbe3192bea9fae344a29f2d Mon Sep 17 00:00:00 2001 From: Sam Leffler Date: Thu, 9 Feb 2006 22:29:23 +0000 Subject: [PATCH] correct handling of mbuf allocation failure when replenishing the rx list (leave a printf for the moment, need to make a debug msg) Obtained from: atheros MFC after: 2 weeks --- sys/dev/ath/if_ath.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/sys/dev/ath/if_ath.c b/sys/dev/ath/if_ath.c index fc948cb6a6e0..1940044662c9 100644 --- a/sys/dev/ath/if_ath.c +++ b/sys/dev/ath/if_ath.c @@ -2562,7 +2562,6 @@ ath_rxbuf_init(struct ath_softc *sc, struct ath_buf *bf) sc->sc_stats.ast_rx_nombuf++; return ENOMEM; } - bf->bf_m = m; m->m_pkthdr.len = m->m_len = m->m_ext.ext_size; error = bus_dmamap_load_mbuf_sg(sc->sc_dmat, @@ -2574,10 +2573,12 @@ ath_rxbuf_init(struct ath_softc *sc, struct ath_buf *bf) "%s: bus_dmamap_load_mbuf_sg failed; error %d\n", __func__, error); sc->sc_stats.ast_rx_busdma++; + m_freem(m); return error; } KASSERT(bf->bf_nseg == 1, ("multi-segment packet; nseg %u", bf->bf_nseg)); + bf->bf_m = m; } bus_dmamap_sync(sc->sc_dmat, bf->bf_dmamap, BUS_DMASYNC_PREREAD); @@ -2761,16 +2762,22 @@ ath_rx_proc(void *arg, int npending) if_printf(ifp, "%s: no buffer!\n", __func__); break; } + m = bf->bf_m; + if (m == NULL) { /* NB: shouldn't happen */ + /* + * If mbuf allocation failed previously there + * will be no mbuf; try again to re-populate it. + */ + /* XXX make debug msg */ + if_printf(ifp, "%s: no mbuf!\n", __func__); + STAILQ_REMOVE_HEAD(&sc->sc_rxbuf, bf_list); + goto rx_next; + } ds = bf->bf_desc; if (ds->ds_link == bf->bf_daddr) { /* NB: never process the self-linked entry at the end */ break; } - m = bf->bf_m; - if (m == NULL) { /* NB: shouldn't happen */ - if_printf(ifp, "%s: no mbuf!\n", __func__); - continue; - } /* XXX sync descriptor memory */ /* * Must provide the virtual address of the current