commit f54898541d50bb3b47085a6decbffcd06b0f72a6 Author: Alexander Lobakin Date: Mon Oct 14 11:00:33 2019 +0300 net: core: use listified Rx for GRO_NORMAL in napi_gro_receive() [ Upstream commit 6570bc79c0dfff0f228b7afd2de720fb4e84d61d ] Commit 323ebb61e32b4 ("net: use listified RX for handling GRO_NORMAL skbs") made use of listified skb processing for the users of napi_gro_frags(). The same technique can be used in a way more common napi_gro_receive() to speed up non-merged (GRO_NORMAL) skbs for a wide range of drivers including gro_cells and mac80211 users. This slightly changes the return value in cases where skb is being dropped by the core stack, but it seems to have no impact on related drivers' functionality. gro_normal_batch is left untouched as it's very individual for every single system configuration and might be tuned in manual order to achieve an optimal performance. 5.4-stable note: This patch is required to avoid packet reordering when both napi_gro_receive() and napi_gro_frags() are used. The specific case used to debug this involved the ena driver and its use of rx_copybreak to select between napi_gro_receive()/napi_gro_frags(). Signed-off-by: Alexander Lobakin Acked-by: Edward Cree Signed-off-by: David S. Miller [Ion: backported to v5.4] Signed-off-by: Ion Badulescu diff --git a/net/core/dev.c b/net/core/dev.c index ee5ef71..02973a4 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -5602,12 +5602,13 @@ static void napi_skb_free_stolen_head(struct sk_buff *skb) kmem_cache_free(skbuff_head_cache, skb); } -static gro_result_t napi_skb_finish(gro_result_t ret, struct sk_buff *skb) +static gro_result_t napi_skb_finish(struct napi_struct *napi, + struct sk_buff *skb, + gro_result_t ret) { switch (ret) { case GRO_NORMAL: - if (netif_receive_skb_internal(skb)) - ret = GRO_DROP; + gro_normal_one(napi, skb); break; case GRO_DROP: @@ -5639,7 +5640,7 @@ gro_result_t napi_gro_receive(struct napi_struct *napi, struct sk_buff *skb) skb_gro_reset_offset(skb); - ret = napi_skb_finish(dev_gro_receive(napi, skb), skb); + ret = napi_skb_finish(napi, skb, dev_gro_receive(napi, skb)); trace_napi_gro_receive_exit(ret); return ret;