| From: Aaro Koskinen <aaro.koskinen@nokia.com> |
| Date: Wed, 27 Mar 2019 22:35:37 +0200 |
| Subject: net: stmmac: don't stop NAPI processing when dropping a packet |
| |
| commit 07b3975352374c3f5ebb4a42ef0b253fe370542d upstream. |
| |
| Currently, if we drop a packet, we exit from NAPI loop before the budget |
| is consumed. In some situations this will make the RX processing stall |
| e.g. when flood pinging the system with oversized packets, as the |
| errorneous packets are not dropped efficiently. |
| |
| If we drop a packet, we should just continue to the next one as long as |
| the budget allows. |
| |
| Signed-off-by: Aaro Koskinen <aaro.koskinen@nokia.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| [acj: backport v4.4 -stable |
| -adjust context] |
| Signed-off-by: Aviraj CJ <acj@cisco.com> |
| Signed-off-by: Ben Hutchings <ben@decadent.org.uk> |
| --- |
| drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 12 ++++++------ |
| 1 file changed, 6 insertions(+), 6 deletions(-) |
| |
| --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c |
| +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c |
| @@ -2060,8 +2060,7 @@ static inline void stmmac_rx_refill(stru |
| static int stmmac_rx(struct stmmac_priv *priv, int limit) |
| { |
| unsigned int rxsize = priv->dma_rx_size; |
| - unsigned int entry = priv->cur_rx % rxsize; |
| - unsigned int next_entry; |
| + unsigned int next_entry = priv->cur_rx % rxsize; |
| unsigned int count = 0; |
| int coe = priv->plat->rx_coe; |
| |
| @@ -2073,9 +2072,11 @@ static int stmmac_rx(struct stmmac_priv |
| stmmac_display_ring((void *)priv->dma_rx, rxsize, 0); |
| } |
| while (count < limit) { |
| - int status; |
| + int status, entry; |
| struct dma_desc *p; |
| |
| + entry = next_entry; |
| + |
| if (priv->extend_desc) |
| p = (struct dma_desc *)(priv->dma_erx + entry); |
| else |
| @@ -2123,7 +2124,7 @@ static int stmmac_rx(struct stmmac_priv |
| /* check if frame_len fits the preallocated memory */ |
| if (frame_len > priv->dma_buf_sz) { |
| priv->dev->stats.rx_length_errors++; |
| - break; |
| + continue; |
| } |
| |
| /* ACS is set; GMAC core strips PAD/FCS for IEEE 802.3 |
| @@ -2144,7 +2145,7 @@ static int stmmac_rx(struct stmmac_priv |
| pr_err("%s: Inconsistent Rx descriptor chain\n", |
| priv->dev->name); |
| priv->dev->stats.rx_dropped++; |
| - break; |
| + continue; |
| } |
| prefetch(skb->data - NET_IP_ALIGN); |
| priv->rx_skbuff[entry] = NULL; |
| @@ -2175,7 +2176,6 @@ static int stmmac_rx(struct stmmac_priv |
| priv->dev->stats.rx_packets++; |
| priv->dev->stats.rx_bytes += frame_len; |
| } |
| - entry = next_entry; |
| } |
| |
| stmmac_rx_refill(priv); |