diff mbox

gro: Check for GSO packets and packets with frag_list

Message ID 20090114215639.GA25069@gondor.apana.org.au
State Accepted, archived
Delegated to: David Miller
Headers show

Commit Message

Herbert Xu Jan. 14, 2009, 9:56 p.m. UTC
Hi Dave:

Here's a patch for GRO allowing it to be used on more drivers.

gro: Check for GSO packets and packets with frag_list

As GRO cannot be applied to packets with frag_list we need to
make sure that we reject such packets if they are fed to us,
e.g., through a tunnel device.

Also there is no point in applying GRO on GSO packets so they
too should be rejected.  This allows GRO to be used in virtio-net
which may produce GSO packets directly but may still benefit
from GRO if the other end of it doesn't support GSO.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>


Thanks,

Comments

David Miller Jan. 14, 2009, 10:36 p.m. UTC | #1
From: Herbert Xu <herbert@gondor.apana.org.au>
Date: Thu, 15 Jan 2009 08:56:39 +1100

> gro: Check for GSO packets and packets with frag_list
> 
> As GRO cannot be applied to packets with frag_list we need to
> make sure that we reject such packets if they are fed to us,
> e.g., through a tunnel device.
> 
> Also there is no point in applying GRO on GSO packets so they
> too should be rejected.  This allows GRO to be used in virtio-net
> which may produce GSO packets directly but may still benefit
> from GRO if the other end of it doesn't support GSO.
> 
> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>

Applied, thanks Herbert.
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/net/core/dev.c b/net/core/dev.c
index 5f736f1..972a47d 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -2382,6 +2382,9 @@  int dev_gro_receive(struct napi_struct *napi, struct sk_buff *skb)
 	if (!(skb->dev->features & NETIF_F_GRO))
 		goto normal;
 
+	if (skb_is_gso(skb) || skb_shinfo(skb)->frag_list)
+		goto normal;
+
 	rcu_read_lock();
 	list_for_each_entry_rcu(ptype, head, list) {
 		struct sk_buff *p;