[2/2] net: stmmac: fix jumbo frame sending with non-linear skbs
diff mbox series

Message ID 20190314194320.25566-2-aaro.koskinen@iki.fi
State Accepted
Delegated to: David Miller
Headers show
Series
  • [1/2] net: stmmac: don't set own bit too early for jumbo frames
Related show

Commit Message

Aaro Koskinen March 14, 2019, 7:43 p.m. UTC
From: Aaro Koskinen <aaro.koskinen@nokia.com>

When sending non-linear skbs with jumbo frames, we set up the non-paged
data and mark that as a last segment, although the paged fragments are
also prepared. This will stall the TX queue and trigger a watchdog warning
(a simple reproducer is to run an iperf client mode TCP test with a large
MTU - networking fails instantly).

Fix by checking if the skb is non-linear.

Signed-off-by: Aaro Koskinen <aaro.koskinen@nokia.com>
---
 drivers/net/ethernet/stmicro/stmmac/ring_mode.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

Comments

Jose Abreu March 15, 2019, 9:50 a.m. UTC | #1
On 3/14/2019 7:43 PM, Aaro Koskinen wrote:
> From: Aaro Koskinen <aaro.koskinen@nokia.com>
> 
> When sending non-linear skbs with jumbo frames, we set up the non-paged
> data and mark that as a last segment, although the paged fragments are
> also prepared. This will stall the TX queue and trigger a watchdog warning
> (a simple reproducer is to run an iperf client mode TCP test with a large
> MTU - networking fails instantly).
> 
> Fix by checking if the skb is non-linear.
> 
> Signed-off-by: Aaro Koskinen <aaro.koskinen@nokia.com>

Acked-by: Jose Abreu <joabreu@synopsys.com>

Thanks,
Jose Miguel Abreu
David Miller March 15, 2019, 6:39 p.m. UTC | #2
From: Aaro Koskinen <aaro.koskinen@iki.fi>
Date: Thu, 14 Mar 2019 21:43:20 +0200

> From: Aaro Koskinen <aaro.koskinen@nokia.com>
> 
> When sending non-linear skbs with jumbo frames, we set up the non-paged
> data and mark that as a last segment, although the paged fragments are
> also prepared. This will stall the TX queue and trigger a watchdog warning
> (a simple reproducer is to run an iperf client mode TCP test with a large
> MTU - networking fails instantly).
> 
> Fix by checking if the skb is non-linear.
> 
> Signed-off-by: Aaro Koskinen <aaro.koskinen@nokia.com>

Applied.

Patch
diff mbox series

diff --git a/drivers/net/ethernet/stmicro/stmmac/ring_mode.c b/drivers/net/ethernet/stmicro/stmmac/ring_mode.c
index bc83ced94e1b..f936166d8910 100644
--- a/drivers/net/ethernet/stmicro/stmmac/ring_mode.c
+++ b/drivers/net/ethernet/stmicro/stmmac/ring_mode.c
@@ -79,7 +79,8 @@  static int jumbo_frm(void *p, struct sk_buff *skb, int csum)
 
 		desc->des3 = cpu_to_le32(des2 + BUF_SIZE_4KiB);
 		stmmac_prepare_tx_desc(priv, desc, 0, len, csum,
-				STMMAC_RING_MODE, 1, true, skb->len);
+				STMMAC_RING_MODE, 1, !skb_is_nonlinear(skb),
+				skb->len);
 	} else {
 		des2 = dma_map_single(priv->device, skb->data,
 				      nopaged_len, DMA_TO_DEVICE);
@@ -91,7 +92,8 @@  static int jumbo_frm(void *p, struct sk_buff *skb, int csum)
 		tx_q->tx_skbuff_dma[entry].is_jumbo = true;
 		desc->des3 = cpu_to_le32(des2 + BUF_SIZE_4KiB);
 		stmmac_prepare_tx_desc(priv, desc, 1, nopaged_len, csum,
-				STMMAC_RING_MODE, 0, true, skb->len);
+				STMMAC_RING_MODE, 0, !skb_is_nonlinear(skb),
+				skb->len);
 	}
 
 	tx_q->cur_tx = entry;