Patch "gso: Validate assumption of frag_list segementation" has been added to the 4.10-stable tree
Subsystems (2)
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.
--- 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_buif (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