diff mbox series

[net-next] net: skb_vlan_untag(): don't reset transport offset if set by GRO layer

Message ID zYurwsZRN7BkqSoikWQLVqHyxz18h4LhHU4NFa2Vw@cp4-web-038.plabs.ch
State New
Headers show
Series [net-next] net: skb_vlan_untag(): don't reset transport offset if set by GRO layer | expand

Commit Message

Alexander Lobakin Nov. 5, 2020, 9:29 p.m. UTC
Similar to commit fda55eca5a33f
("net: introduce skb_transport_header_was_set()"), avoid resetting
transport offsets that were already set by GRO layer. This not only
mirrors the behavior of __netif_receive_skb_core(), but also makes
sense when it comes to UDP GSO fraglists forwarding: transport offset
of such skbs is set only once by GRO receive callback and remains
untouched and correct up to the xmitting driver in 1:1 case, but
becomes junk after untagging in ingress VLAN case and breaks UDP
GSO offload. This does not happen after this change, and all types
of forwarding of UDP GSO fraglists work as expected.

Signed-off-by: Alexander Lobakin <alobakin@pm.me>
---
 net/core/skbuff.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

Comments

Jakub Kicinski Nov. 9, 2020, 11:29 p.m. UTC | #1
On Thu, 05 Nov 2020 21:29:01 +0000 Alexander Lobakin wrote:
> Similar to commit fda55eca5a33f

> ("net: introduce skb_transport_header_was_set()"), avoid resetting

> transport offsets that were already set by GRO layer. This not only

> mirrors the behavior of __netif_receive_skb_core(), but also makes

> sense when it comes to UDP GSO fraglists forwarding: transport offset

> of such skbs is set only once by GRO receive callback and remains

> untouched and correct up to the xmitting driver in 1:1 case, but

> becomes junk after untagging in ingress VLAN case and breaks UDP

> GSO offload. This does not happen after this change, and all types

> of forwarding of UDP GSO fraglists work as expected.

> 

> Signed-off-by: Alexander Lobakin <alobakin@pm.me>

> ---

>  net/core/skbuff.c | 4 +++-

>  1 file changed, 3 insertions(+), 1 deletion(-)

> 

> diff --git a/net/core/skbuff.c b/net/core/skbuff.c

> index c5e6c0b83a92..39c13b9cf79d 100644

> --- a/net/core/skbuff.c

> +++ b/net/core/skbuff.c

> @@ -5441,9 +5441,11 @@ struct sk_buff *skb_vlan_untag(struct sk_buff *skb)

>  		goto err_free;

>  

>  	skb_reset_network_header(skb);

> -	skb_reset_transport_header(skb);

>  	skb_reset_mac_len(skb);

>  

> +	if (!skb_transport_header_was_set(skb))

> +		skb_reset_transport_header(skb);

> +


Patch looks fine, thanks, but I don't understand why you decided to 
move the reset?  It's not like it's not in order of headers, either.
Let's keep the series of resets identical to __netif_receive_skb_core(),
shall we?

>  	return skb;

>  

>  err_free:
Alexander Lobakin Nov. 9, 2020, 11:38 p.m. UTC | #2
From: Jakub Kicinski <kuba@kernel.org>

Date: Mon, 9 Nov 2020 15:29:13 -0800

> On Thu, 05 Nov 2020 21:29:01 +0000 Alexander Lobakin wrote:

>> Similar to commit fda55eca5a33f

>> ("net: introduce skb_transport_header_was_set()"), avoid resetting

>> transport offsets that were already set by GRO layer. This not only

>> mirrors the behavior of __netif_receive_skb_core(), but also makes

>> sense when it comes to UDP GSO fraglists forwarding: transport offset

>> of such skbs is set only once by GRO receive callback and remains

>> untouched and correct up to the xmitting driver in 1:1 case, but

>> becomes junk after untagging in ingress VLAN case and breaks UDP

>> GSO offload. This does not happen after this change, and all types

>> of forwarding of UDP GSO fraglists work as expected.

>>

>> Signed-off-by: Alexander Lobakin <alobakin@pm.me>

>> ---

>>  net/core/skbuff.c | 4 +++-

>>  1 file changed, 3 insertions(+), 1 deletion(-)

>>

>> diff --git a/net/core/skbuff.c b/net/core/skbuff.c

>> index c5e6c0b83a92..39c13b9cf79d 100644

>> --- a/net/core/skbuff.c

>> +++ b/net/core/skbuff.c

>> @@ -5441,9 +5441,11 @@ struct sk_buff *skb_vlan_untag(struct sk_buff *skb)

>>  		goto err_free;

>>

>>  	skb_reset_network_header(skb);

>> -	skb_reset_transport_header(skb);

>>  	skb_reset_mac_len(skb);

>>

>> +	if (!skb_transport_header_was_set(skb))

>> +		skb_reset_transport_header(skb);

>> +

>

> Patch looks fine, thanks, but I don't understand why you decided to

> move the reset?  It's not like it's not in order of headers, either.

> Let's keep the series of resets identical to __netif_receive_skb_core(),

> shall we?


Pure cosmetics, but yeah, let's keep. Will submit v2 in just a minute.

>>  	return skb;

>>

>>  err_free:


Thanks,
Al
diff mbox series

Patch

diff --git a/net/core/skbuff.c b/net/core/skbuff.c
index c5e6c0b83a92..39c13b9cf79d 100644
--- a/net/core/skbuff.c
+++ b/net/core/skbuff.c
@@ -5441,9 +5441,11 @@  struct sk_buff *skb_vlan_untag(struct sk_buff *skb)
 		goto err_free;
 
 	skb_reset_network_header(skb);
-	skb_reset_transport_header(skb);
 	skb_reset_mac_len(skb);
 
+	if (!skb_transport_header_was_set(skb))
+		skb_reset_transport_header(skb);
+
 	return skb;
 
 err_free: