net: stmmac: don't stop NAPI processing when dropping a packet
authorAaro Koskinen <aaro.koskinen@nokia.com>
Wed, 27 Mar 2019 20:35:37 +0000 (22:35 +0200)
committerJianxin Pan <jianxin.pan@amlogic.com>
Thu, 31 Oct 2019 10:34:15 +0000 (03:34 -0700)
PD#TV-11316

[ Upstream commit 07b3975352374c3f5ebb4a42ef0b253fe370542d ]

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>
Signed-off-by: Sasha Levin <sashal@kernel.org>
Change-Id: Ib13615c2e413af86519c1cec0a6638b88ceaf4de
Signed-off-by: Jiamin Ma <jiamin.ma@amlogic.com>
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c

index f298627..7f4dbb4 100644 (file)
@@ -2544,8 +2544,7 @@ static inline void stmmac_rx_refill(struct stmmac_priv *priv)
  */
 static int stmmac_rx(struct stmmac_priv *priv, int limit)
 {
-       unsigned int entry = priv->cur_rx;
-       unsigned int next_entry;
+       unsigned int next_entry = priv->cur_rx;
        unsigned int count = 0;
        int coe = priv->hw->rx_csum;
 
@@ -2561,10 +2560,12 @@ static int stmmac_rx(struct stmmac_priv *priv, int limit)
                priv->hw->desc->display_ring(rx_head, DMA_RX_SIZE, true);
        }
        while (count < limit) {
-               int status;
+               int entry, status;
                struct dma_desc *p;
                struct dma_desc *np;
 
+               entry = next_entry;
+
                if (priv->extend_desc)
                        p = (struct dma_desc *)(priv->dma_erx + entry);
                else
@@ -2629,7 +2630,7 @@ static int stmmac_rx(struct stmmac_priv *priv, int limit)
                                       priv->dev->name, 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
@@ -2660,7 +2661,7 @@ static int stmmac_rx(struct stmmac_priv *priv, int limit)
                                                dev_warn(priv->device,
                                                         "packet dropped\n");
                                        priv->dev->stats.rx_dropped++;
-                                       break;
+                                       continue;
                                }
 
                                dma_sync_single_for_cpu(priv->device,
@@ -2683,7 +2684,7 @@ static int stmmac_rx(struct stmmac_priv *priv, int limit)
                                        pr_err("%s: Inconsistent Rx chain\n",
                                               priv->dev->name);
                                        priv->dev->stats.rx_dropped++;
-                                       break;
+                                       continue;
                                }
                                prefetch(skb->data - NET_IP_ALIGN);
                                priv->rx_skbuff[entry] = NULL;
@@ -2717,7 +2718,6 @@ static int stmmac_rx(struct stmmac_priv *priv, int limit)
                        priv->dev->stats.rx_packets++;
                        priv->dev->stats.rx_bytes += frame_len;
                }
-               entry = next_entry;
        }
 
        stmmac_rx_refill(priv);