Skip to contentSkip to conversation

Patch "gso: Validate assumption of frag_list segementation" has been added to the 4.10-stable tree

PATCH [email protected] 1 participant 1 message Apr 29, 2017

Subsystems (2)
lore
Share & tools
lore

[email protected]

author maintainer Applied
#0 lore raw

This is a note to let you know that I've just added the patch titled

gso: Validate assumption of frag_list segementation

to the 4.10-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
gso-validate-assumption-of-frag_list-segementation.patch
and it can be found in the queue-4.10 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.

Quoted 1 line

From foo@baz Sat Apr 29 08:22:40 CEST 2017

From: Ilan Tayari <[email protected]>
Date: Wed, 19 Apr 2017 21:26:07 +0300
Subject: gso: Validate assumption of frag_list segementation

From: Ilan Tayari <[email protected]>

[ Upstream commit 43170c4e0ba709c79130c3fe5a41e66279950cd0 ]

Commit 07b26c9454a2 ("gso: Support partial splitting at the frag_list pointer") assumes that all SKBs in a frag_list (except maybe the last one) contain the same amount of GSO payload.

This assumption is not always correct, resulting in the following warning message in the log:
skb_segment: too many frags

For example, mlx5 driver in Striding RQ mode creates some RX SKBs with one frag, and some with 2 frags.
After GRO, the frag_list SKBs end up having different amounts of payload. If this frag_list SKB is then forwarded, the aforementioned assumption is violated.

Validate the assumption, and fall back to software GSO if it not true.

Change-Id Ia03983f4a47b6534dd987d7a2aad96d54d46d212
Fixes 07b26c9454a2 ("gso: Support partial splitting at the frag_list pointer")
---
 net/core/skbuff.c |   18 ++++++++++++++----
 1 file changed, 14 insertions(+), 4 deletions(-)
net/core/skbuff.c +14 -4
@@ -3078,22 +3078,32 @@ struct sk_buff *skb_segment(struct sk_bu
 	if (sg && csum && (mss != GSO_BY_FRAGS))  {
 		if (!(features & NETIF_F_GSO_PARTIAL)) {
 			struct sk_buff *iter;
+			unsigned int frag_len;
 
 			if (!list_skb ||
 			    !net_gso_ok(features, skb_shinfo(head_skb)->gso_type))
 				goto normal;
 
-			/* Split the buffer at the frag_list pointer.
-			 * This is based on the assumption that all
-			 * buffers in the chain excluding the last
-			 * containing the same amount of data.
+			/* If we get here then all the required
+			 * GSO features except frag_list are supported.
+			 * Try to split the SKB to multiple GSO SKBs
+			 * with no frag_list.
+			 * Currently we can do that only when the buffers don't
+			 * have a linear part and all the buffers except
+			 * the last are of the same length.
 			 */
+			frag_len = list_skb->len;
 			skb_walk_frags(head_skb, iter) {
+				if (frag_len != iter->len && iter->next)
+					goto normal;
 				if (skb_headlen(iter))
 					goto normal;
 
 				len -= iter->len;
 			}
+
+			if (len != frag_len)
+				goto normal;
 		}
 
 		/* GSO partial only requires that we trim off any excess that

Patches currently in stable-queue which might be from [email protected] are

queue-4.10/gso-validate-assumption-of-frag_list-segementation.patch queue-4.10/net-mlx5e-fix-ethtool_grxclsrlall-handling.patch