All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH net v2] tg3: Fix for tg3 transmit queue 0 timed out when too many gso_segs
@ 2016-02-03  8:39 skallam
  2016-02-09  9:40 ` David Miller
  0 siblings, 1 reply; 2+ messages in thread
From: skallam @ 2016-02-03  8:39 UTC (permalink / raw)
  To: davem; +Cc: netdev, mchan, prashant, Siva Reddy Kallam

From: Siva Reddy Kallam <siva.kallam@broadcom.com>

tg3_tso_bug() can hit a condition where the entire tx ring is not big
enough to segment the GSO packet. For example, if MSS is very small,
gso_segs can exceed the tx ring size. When we hit the condition, it
will cause tx timeout.

tg3_tso_bug() is called to handle TSO and DMA hardware bugs.
For TSO bugs, if tg3_tso_bug() cannot succeed, we have to drop the packet.
For DMA bugs, we can still fall back to linearize the SKB and let the
hardware transmit the TSO packet.

This patch adds a function tg3_tso_bug_gso_check() to check if there
are enough tx descriptors for GSO before calling tg3_tso_bug().
The caller will then handle the error appropriately - drop or
lineraize the SKB.

v2: Corrected patch description to avoid confusion.

Signed-off-by: Siva Reddy Kallam <siva.kallam@broadcom.com>
Signed-off-by: Michael Chan <mchan@broadcom.com>
Acked-by: Prashant Sreedharan <prashant@broadcom.com>
---
 drivers/net/ethernet/broadcom/tg3.c | 25 +++++++++++++++++++------
 1 file changed, 19 insertions(+), 6 deletions(-)

diff --git a/drivers/net/ethernet/broadcom/tg3.c b/drivers/net/ethernet/broadcom/tg3.c
index 9293675..eb3d347 100644
--- a/drivers/net/ethernet/broadcom/tg3.c
+++ b/drivers/net/ethernet/broadcom/tg3.c
@@ -7831,6 +7831,14 @@ static int tigon3_dma_hwbug_workaround(struct tg3_napi *tnapi,
 	return ret;
 }
 
+static bool tg3_tso_bug_gso_check(struct tg3_napi *tnapi, struct sk_buff *skb)
+{
+	/* Check if we will never have enough descriptors,
+	 * as gso_segs can be more than current ring size
+	 */
+	return skb_shinfo(skb)->gso_segs < tnapi->tx_pending / 3;
+}
+
 static netdev_tx_t tg3_start_xmit(struct sk_buff *, struct net_device *);
 
 /* Use GSO to workaround all TSO packets that meet HW bug conditions
@@ -7934,14 +7942,19 @@ static netdev_tx_t tg3_start_xmit(struct sk_buff *skb, struct net_device *dev)
 		 * vlan encapsulated.
 		 */
 		if (skb->protocol == htons(ETH_P_8021Q) ||
-		    skb->protocol == htons(ETH_P_8021AD))
-			return tg3_tso_bug(tp, tnapi, txq, skb);
+		    skb->protocol == htons(ETH_P_8021AD)) {
+			if (tg3_tso_bug_gso_check(tnapi, skb))
+				return tg3_tso_bug(tp, tnapi, txq, skb);
+			goto drop;
+		}
 
 		if (!skb_is_gso_v6(skb)) {
 			if (unlikely((ETH_HLEN + hdr_len) > 80) &&
-			    tg3_flag(tp, TSO_BUG))
-				return tg3_tso_bug(tp, tnapi, txq, skb);
-
+			    tg3_flag(tp, TSO_BUG)) {
+				if (tg3_tso_bug_gso_check(tnapi, skb))
+					return tg3_tso_bug(tp, tnapi, txq, skb);
+				goto drop;
+			}
 			ip_csum = iph->check;
 			ip_tot_len = iph->tot_len;
 			iph->check = 0;
@@ -8073,7 +8086,7 @@ static netdev_tx_t tg3_start_xmit(struct sk_buff *skb, struct net_device *dev)
 	if (would_hit_hwbug) {
 		tg3_tx_skb_unmap(tnapi, tnapi->tx_prod, i);
 
-		if (mss) {
+		if (mss && tg3_tso_bug_gso_check(tnapi, skb)) {
 			/* If it's a TSO packet, do GSO instead of
 			 * allocating and copying to a large linear SKB
 			 */
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [PATCH net v2] tg3: Fix for tg3 transmit queue 0 timed out when too many gso_segs
  2016-02-03  8:39 [PATCH net v2] tg3: Fix for tg3 transmit queue 0 timed out when too many gso_segs skallam
@ 2016-02-09  9:40 ` David Miller
  0 siblings, 0 replies; 2+ messages in thread
From: David Miller @ 2016-02-09  9:40 UTC (permalink / raw)
  To: siva.kallam; +Cc: netdev, mchan, prashant

From: skallam <siva.kallam@broadcom.com>
Date: Wed,  3 Feb 2016 14:09:38 +0530

> From: Siva Reddy Kallam <siva.kallam@broadcom.com>
> 
> tg3_tso_bug() can hit a condition where the entire tx ring is not big
> enough to segment the GSO packet. For example, if MSS is very small,
> gso_segs can exceed the tx ring size. When we hit the condition, it
> will cause tx timeout.
> 
> tg3_tso_bug() is called to handle TSO and DMA hardware bugs.
> For TSO bugs, if tg3_tso_bug() cannot succeed, we have to drop the packet.
> For DMA bugs, we can still fall back to linearize the SKB and let the
> hardware transmit the TSO packet.
> 
> This patch adds a function tg3_tso_bug_gso_check() to check if there
> are enough tx descriptors for GSO before calling tg3_tso_bug().
> The caller will then handle the error appropriately - drop or
> lineraize the SKB.
> 
> v2: Corrected patch description to avoid confusion.
> 
> Signed-off-by: Siva Reddy Kallam <siva.kallam@broadcom.com>
> Signed-off-by: Michael Chan <mchan@broadcom.com>
> Acked-by: Prashant Sreedharan <prashant@broadcom.com>

Applied and queued up for -stable.

Thanks.

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2016-02-09  9:40 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-02-03  8:39 [PATCH net v2] tg3: Fix for tg3 transmit queue 0 timed out when too many gso_segs skallam
2016-02-09  9:40 ` David Miller

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.