| From c35847181c2176108d0fae1570d86bf88e953c16 Mon Sep 17 00:00:00 2001 |
| 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 |
| |
| [ 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 (Microsoft) <sashal@kernel.org> |
| --- |
| drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 14 +++++++------- |
| 1 file changed, 7 insertions(+), 7 deletions(-) |
| |
| diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c |
| index 0ccf91a08290..f0e0593e54f3 100644 |
| --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c |
| +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c |
| @@ -3328,9 +3328,8 @@ static int stmmac_rx(struct stmmac_priv *priv, int limit, u32 queue) |
| { |
| struct stmmac_rx_queue *rx_q = &priv->rx_queue[queue]; |
| struct stmmac_channel *ch = &priv->channel[queue]; |
| - unsigned int entry = rx_q->cur_rx; |
| + unsigned int next_entry = rx_q->cur_rx; |
| int coe = priv->hw->rx_csum; |
| - unsigned int next_entry; |
| unsigned int count = 0; |
| bool xmac; |
| |
| @@ -3348,10 +3347,12 @@ static int stmmac_rx(struct stmmac_priv *priv, int limit, u32 queue) |
| stmmac_display_ring(priv, 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 *)(rx_q->dma_erx + entry); |
| else |
| @@ -3412,7 +3413,7 @@ static int stmmac_rx(struct stmmac_priv *priv, int limit, u32 queue) |
| "len %d larger than size (%d)\n", |
| 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 |
| @@ -3447,7 +3448,7 @@ static int stmmac_rx(struct stmmac_priv *priv, int limit, u32 queue) |
| dev_warn(priv->device, |
| "packet dropped\n"); |
| priv->dev->stats.rx_dropped++; |
| - break; |
| + continue; |
| } |
| |
| dma_sync_single_for_cpu(priv->device, |
| @@ -3472,7 +3473,7 @@ static int stmmac_rx(struct stmmac_priv *priv, int limit, u32 queue) |
| "%s: Inconsistent Rx chain\n", |
| priv->dev->name); |
| priv->dev->stats.rx_dropped++; |
| - break; |
| + continue; |
| } |
| prefetch(skb->data - NET_IP_ALIGN); |
| rx_q->rx_skbuff[entry] = NULL; |
| @@ -3507,7 +3508,6 @@ static int stmmac_rx(struct stmmac_priv *priv, int limit, u32 queue) |
| priv->dev->stats.rx_packets++; |
| priv->dev->stats.rx_bytes += frame_len; |
| } |
| - entry = next_entry; |
| } |
| |
| stmmac_rx_refill(priv, queue); |
| -- |
| 2.20.1 |
| |