From: Eric Dumazet <redacted>
Date: Mon, 10 Dec 2012 08:54:31 -0800
I believe performance problem might come from the
skb_set_queue_mapping(skb, 0); in __skb_tunnel_rx()
So all packets are queued into a single GRO queue, instead of being
split as intended in multiple queues.
I cant find why we must clear queue_mapping, so could you try :
Tom says:
commit 693019e90ca45d881109d32c0c6d29adf03f6447
Author: Tom Herbert [off-list ref]
Date: Thu Sep 23 11:19:54 2010 +0000
net: reset skb queue mapping when rx'ing over tunnel
Reset queue mapping when an skb is reentering the stack via a tunnel.
On second pass, the queue mapping from the original device is no
longer valid.
Signed-off-by: Tom Herbert [off-list ref]
Acked-by: Eric Dumazet [off-list ref]
Signed-off-by: David S. Miller [off-list ref]
diff --git a/include/net/dst.h b/include/net/dst.h
index 81d1413..0238650 100644
--- a/include/net/dst.h
+++ b/include/net/dst.h
@@ -242,6 +242,7 @@ static inline void skb_tunnel_rx(struct sk_buff *skb, struct net_device *dev)
dev->stats.rx_packets++;
dev->stats.rx_bytes += skb->len;
skb->rxhash = 0;
+ skb_set_queue_mapping(skb, 0);
skb_dst_drop(skb);
nf_reset(skb);
}