forked from Minki/linux
net: gro: do not keep too many GRO packets in napi->rx_list
Commitc80794323e
("net: Fix packet reordering caused by GRO and listified RX cooperation") had the unfortunate effect of adding latencies in common workloads. Before the patch, GRO packets were immediately passed to upper stacks. After the patch, we can accumulate quite a lot of GRO packets (depdending on NAPI budget). My fix is counting in napi->rx_count number of segments instead of number of logical packets. Fixes:c80794323e
("net: Fix packet reordering caused by GRO and listified RX cooperation") Signed-off-by: Eric Dumazet <edumazet@google.com> Bisected-by: John Sperbeck <jsperbeck@google.com> Tested-by: Jian Yang <jianyang@google.com> Cc: Maxim Mikityanskiy <maximmi@mellanox.com> Reviewed-by: Saeed Mahameed <saeedm@nvidia.com> Reviewed-by: Edward Cree <ecree.xilinx@gmail.com> Reviewed-by: Alexander Lobakin <alobakin@pm.me> Link: https://lore.kernel.org/r/20210204213146.4192368-1-eric.dumazet@gmail.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
b3d2c7b876
commit
8dc1c444df
@ -5735,10 +5735,11 @@ static void gro_normal_list(struct napi_struct *napi)
|
||||
/* Queue one GRO_NORMAL SKB up for list processing. If batch size exceeded,
|
||||
* pass the whole batch up to the stack.
|
||||
*/
|
||||
static void gro_normal_one(struct napi_struct *napi, struct sk_buff *skb)
|
||||
static void gro_normal_one(struct napi_struct *napi, struct sk_buff *skb, int segs)
|
||||
{
|
||||
list_add_tail(&skb->list, &napi->rx_list);
|
||||
if (++napi->rx_count >= gro_normal_batch)
|
||||
napi->rx_count += segs;
|
||||
if (napi->rx_count >= gro_normal_batch)
|
||||
gro_normal_list(napi);
|
||||
}
|
||||
|
||||
@ -5777,7 +5778,7 @@ static int napi_gro_complete(struct napi_struct *napi, struct sk_buff *skb)
|
||||
}
|
||||
|
||||
out:
|
||||
gro_normal_one(napi, skb);
|
||||
gro_normal_one(napi, skb, NAPI_GRO_CB(skb)->count);
|
||||
return NET_RX_SUCCESS;
|
||||
}
|
||||
|
||||
@ -6067,7 +6068,7 @@ static gro_result_t napi_skb_finish(struct napi_struct *napi,
|
||||
{
|
||||
switch (ret) {
|
||||
case GRO_NORMAL:
|
||||
gro_normal_one(napi, skb);
|
||||
gro_normal_one(napi, skb, 1);
|
||||
break;
|
||||
|
||||
case GRO_DROP:
|
||||
@ -6155,7 +6156,7 @@ static gro_result_t napi_frags_finish(struct napi_struct *napi,
|
||||
__skb_push(skb, ETH_HLEN);
|
||||
skb->protocol = eth_type_trans(skb, skb->dev);
|
||||
if (ret == GRO_NORMAL)
|
||||
gro_normal_one(napi, skb);
|
||||
gro_normal_one(napi, skb, 1);
|
||||
break;
|
||||
|
||||
case GRO_DROP:
|
||||
|
Loading…
Reference in New Issue
Block a user