1
0
mirror of https://git.FreeBSD.org/src.git synced 2025-01-04 12:52:15 +00:00

When an mbuf allocation fails in the receive path, the mbuf containing the received packet is not sent to the host net

work stack and is reused again on the receive ring.  Remaining received packets in the ring are not processed in that
invocation of bxe_rxeof() and defered to the task thread.

MFC after: 5 days
This commit is contained in:
David C Somayajulu 2015-04-02 21:55:03 +00:00
parent 29f36d0bf8
commit 16a38a930d
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=281006

View File

@ -3246,7 +3246,7 @@ bxe_rxeof(struct bxe_softc *sc,
uint16_t bd_cons, bd_prod, bd_prod_fw, comp_ring_cons;
uint16_t hw_cq_cons, sw_cq_cons, sw_cq_prod;
int rx_pkts = 0;
int rc;
int rc = 0;
BXE_FP_RX_LOCK(fp);
@ -3388,6 +3388,10 @@ bxe_rxeof(struct bxe_softc *sc,
(sc->max_rx_bufs != RX_BD_USABLE) ?
bd_prod : bd_cons);
if (rc != 0) {
/* we simply reuse the received mbuf and don't post it to the stack */
m = NULL;
BLOGE(sc, "mbuf alloc fail for fp[%02d] rx chain (%d)\n",
fp->index, rc);
fp->eth_q_stats.rx_soft_errors++;
@ -3476,6 +3480,9 @@ bxe_rxeof(struct bxe_softc *sc,
sw_cq_cons = RCQ_NEXT(sw_cq_cons);
/* limit spinning on the queue */
if (rc != 0)
break;
if (rx_pkts == sc->rx_budget) {
fp->eth_q_stats.rx_budget_reached++;
break;