netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH net v2] gro: Make GRO aware of lightweight tunnels.
@ 2016-01-21  1:59 Jesse Gross
  2016-01-21  2:10 ` Eric Dumazet
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: Jesse Gross @ 2016-01-21  1:59 UTC (permalink / raw)
  To: David Miller; +Cc: netdev, Eric Dumazet, Thomas Graf, John

GRO is currently not aware of tunnel metadata generated by lightweight
tunnels and stored in the dst. This leads to two possible problems:
 * Incorrectly merging two frames that have different metadata.
 * Leaking of allocated metadata from merged frames.

This avoids those problems by comparing the tunnel information before
merging, similar to how we handle other metadata (such as vlan tags),
and releasing any state when we are done.

Reported-by: John <john.phillips5@hpe.com>
Fixes: 2e15ea39 ("ip_gre: Add support to collect tunnel metadata.")
Signed-off-by: Jesse Gross <jesse@kernel.org>
---
v2: Remove branches to optimize for common case where there is no dst.
---
 include/net/dst_metadata.h | 18 ++++++++++++++++++
 net/core/dev.c             |  7 +++++--
 2 files changed, 23 insertions(+), 2 deletions(-)

diff --git a/include/net/dst_metadata.h b/include/net/dst_metadata.h
index 6816f0f..30a56ab 100644
--- a/include/net/dst_metadata.h
+++ b/include/net/dst_metadata.h
@@ -44,6 +44,24 @@ static inline bool skb_valid_dst(const struct sk_buff *skb)
 	return dst && !(dst->flags & DST_METADATA);
 }
 
+static inline int skb_metadata_dst_cmp(const struct sk_buff *skb_a,
+				       const struct sk_buff *skb_b)
+{
+	const struct metadata_dst *a, *b;
+
+	if (!(skb_a->_skb_refdst | skb_b->_skb_refdst))
+		return 0;
+
+	a = (const struct metadata_dst *) skb_dst(skb_a);
+	b = (const struct metadata_dst *) skb_dst(skb_b);
+
+	if (!a != !b || a->u.tun_info.options_len != b->u.tun_info.options_len)
+		return 1;
+
+	return memcmp(&a->u.tun_info, &b->u.tun_info,
+		      sizeof(a->u.tun_info) + a->u.tun_info.options_len);
+}
+
 struct metadata_dst *metadata_dst_alloc(u8 optslen, gfp_t flags);
 struct metadata_dst __percpu *metadata_dst_alloc_percpu(u8 optslen, gfp_t flags);
 
diff --git a/net/core/dev.c b/net/core/dev.c
index cc9e365..8cba3d8 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -4351,6 +4351,7 @@ static void gro_list_prepare(struct napi_struct *napi, struct sk_buff *skb)
 
 		diffs = (unsigned long)p->dev ^ (unsigned long)skb->dev;
 		diffs |= p->vlan_tci ^ skb->vlan_tci;
+		diffs |= skb_metadata_dst_cmp(p, skb);
 		if (maclen == ETH_HLEN)
 			diffs |= compare_ether_header(skb_mac_header(p),
 						      skb_mac_header(skb));
@@ -4548,10 +4549,12 @@ static gro_result_t napi_skb_finish(gro_result_t ret, struct sk_buff *skb)
 		break;
 
 	case GRO_MERGED_FREE:
-		if (NAPI_GRO_CB(skb)->free == NAPI_GRO_FREE_STOLEN_HEAD)
+		if (NAPI_GRO_CB(skb)->free == NAPI_GRO_FREE_STOLEN_HEAD) {
+			skb_dst_drop(skb);
 			kmem_cache_free(skbuff_head_cache, skb);
-		else
+		} else {
 			__kfree_skb(skb);
+		}
 		break;
 
 	case GRO_HELD:
-- 
2.5.0

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

* Re: [PATCH net v2] gro: Make GRO aware of lightweight tunnels.
  2016-01-21  1:59 [PATCH net v2] gro: Make GRO aware of lightweight tunnels Jesse Gross
@ 2016-01-21  2:10 ` Eric Dumazet
  2016-01-21  2:34 ` Thomas Graf
  2016-01-21  2:50 ` David Miller
  2 siblings, 0 replies; 4+ messages in thread
From: Eric Dumazet @ 2016-01-21  2:10 UTC (permalink / raw)
  To: Jesse Gross; +Cc: David Miller, netdev, Thomas Graf, John

On Wed, 2016-01-20 at 17:59 -0800, Jesse Gross wrote:
> GRO is currently not aware of tunnel metadata generated by lightweight
> tunnels and stored in the dst. This leads to two possible problems:
>  * Incorrectly merging two frames that have different metadata.
>  * Leaking of allocated metadata from merged frames.
> 
> This avoids those problems by comparing the tunnel information before
> merging, similar to how we handle other metadata (such as vlan tags),
> and releasing any state when we are done.
> 
> Reported-by: John <john.phillips5@hpe.com>
> Fixes: 2e15ea39 ("ip_gre: Add support to collect tunnel metadata.")
> Signed-off-by: Jesse Gross <jesse@kernel.org>
> ---

Acked-by: Eric Dumazet <edumazet@google.com>

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

* Re: [PATCH net v2] gro: Make GRO aware of lightweight tunnels.
  2016-01-21  1:59 [PATCH net v2] gro: Make GRO aware of lightweight tunnels Jesse Gross
  2016-01-21  2:10 ` Eric Dumazet
@ 2016-01-21  2:34 ` Thomas Graf
  2016-01-21  2:50 ` David Miller
  2 siblings, 0 replies; 4+ messages in thread
From: Thomas Graf @ 2016-01-21  2:34 UTC (permalink / raw)
  To: Jesse Gross; +Cc: David Miller, netdev, Eric Dumazet, John

On 01/20/16 at 05:59pm, Jesse Gross wrote:
> GRO is currently not aware of tunnel metadata generated by lightweight
> tunnels and stored in the dst. This leads to two possible problems:
>  * Incorrectly merging two frames that have different metadata.
>  * Leaking of allocated metadata from merged frames.
> 
> This avoids those problems by comparing the tunnel information before
> merging, similar to how we handle other metadata (such as vlan tags),
> and releasing any state when we are done.
> 
> Reported-by: John <john.phillips5@hpe.com>
> Fixes: 2e15ea39 ("ip_gre: Add support to collect tunnel metadata.")
> Signed-off-by: Jesse Gross <jesse@kernel.org>

Acked-by: Thomas Graf <tgraf@suug.ch>

Thanks Jesse

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

* Re: [PATCH net v2] gro: Make GRO aware of lightweight tunnels.
  2016-01-21  1:59 [PATCH net v2] gro: Make GRO aware of lightweight tunnels Jesse Gross
  2016-01-21  2:10 ` Eric Dumazet
  2016-01-21  2:34 ` Thomas Graf
@ 2016-01-21  2:50 ` David Miller
  2 siblings, 0 replies; 4+ messages in thread
From: David Miller @ 2016-01-21  2:50 UTC (permalink / raw)
  To: jesse; +Cc: netdev, eric.dumazet, tgraf, john.phillips5

From: Jesse Gross <jesse@kernel.org>
Date: Wed, 20 Jan 2016 17:59:49 -0800

> GRO is currently not aware of tunnel metadata generated by lightweight
> tunnels and stored in the dst. This leads to two possible problems:
>  * Incorrectly merging two frames that have different metadata.
>  * Leaking of allocated metadata from merged frames.
> 
> This avoids those problems by comparing the tunnel information before
> merging, similar to how we handle other metadata (such as vlan tags),
> and releasing any state when we are done.
> 
> Reported-by: John <john.phillips5@hpe.com>
> Fixes: 2e15ea39 ("ip_gre: Add support to collect tunnel metadata.")
> Signed-off-by: Jesse Gross <jesse@kernel.org>
> ---
> v2: Remove branches to optimize for common case where there is no dst.

Applied and queued up for -stable, thanks.

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

end of thread, other threads:[~2016-01-21  2:50 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-01-21  1:59 [PATCH net v2] gro: Make GRO aware of lightweight tunnels Jesse Gross
2016-01-21  2:10 ` Eric Dumazet
2016-01-21  2:34 ` Thomas Graf
2016-01-21  2:50 ` David Miller

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).