From 97b79471912e3befcbd3eee5fe4fe6100e7b05da Mon Sep 17 00:00:00 2001 From: Bogdan Hamciuc Date: Fri, 7 Jun 2013 15:06:49 +0300 Subject: dpaa_eth: Fix endless loop in case of memory depletion Check the return value from the buffer-allocating function, in order to prevent looping forever if memory depletes. Signed-off-by: Bogdan Hamciuc Change-Id: If817c367a39a47322dc3e55d6d133d500b324b3b Reviewed-on: http://git.am.freescale.net:8181/3331 Reviewed-by: Fleming Andrew-AFLEMING Tested-by: Fleming Andrew-AFLEMING diff --git a/drivers/net/ethernet/freescale/dpa/dpaa_eth_sg.c b/drivers/net/ethernet/freescale/dpa/dpaa_eth_sg.c index ad03b6c..9b96f85 100644 --- a/drivers/net/ethernet/freescale/dpa/dpaa_eth_sg.c +++ b/drivers/net/ethernet/freescale/dpa/dpaa_eth_sg.c @@ -129,7 +129,9 @@ release_bufs: return i; bail_out: - dev_err(dpa_bp->dev, "dpa_bp_add_8_pages() failed\n"); + net_err_ratelimited("dpa_bp_add_8_pages() failed\n"); + WARN_ONCE(1, "Memory allocation failure on Rx\n"); + bm_buffer_set64(&bmb[i], 0); /* * Avoid releasing a completely null buffer; bman_release() requires @@ -178,10 +180,20 @@ void dpaa_eth_refill_bpools(struct dpa_percpu_priv_s *percpu_priv) int *countptr = percpu_priv->dpa_bp_count; int count = *countptr; const struct dpa_bp *dpa_bp = percpu_priv->dpa_bp; + int new_pages; /* Add pages to the buffer pool */ - while (count < CONFIG_FSL_DPAA_ETH_MAX_BUF_COUNT) - count += _dpa_bp_add_8_pages(dpa_bp); + while (count < CONFIG_FSL_DPAA_ETH_MAX_BUF_COUNT) { + new_pages = _dpa_bp_add_8_pages(dpa_bp); + if (unlikely(!new_pages)) { + /* Avoid looping forever if we've temporarily + * run out of memory. We'll try again at the next + * NAPI cycle. + */ + break; + } + count += new_pages; + } *countptr = count; } -- cgit v0.10.2