Message ID | 20250109142724.29228-1-tbogendoerfer@suse.de (mailing list archive) |
---|---|
State | Changes Requested |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | [net] gro_cells: Avoid packet re-ordering for cloned skbs | expand |
On Thu, Jan 9, 2025 at 3:27 PM Thomas Bogendoerfer <tbogendoerfer@suse.de> wrote: > > gro_cells_receive() passes a cloned skb directly up the stack and > could cause re-ordering against segments still in GRO. To avoid > this copy the skb and let GRO do it's work. > > Fixes: c9e6bc644e55 ("net: add gro_cells infrastructure") > Signed-off-by: Thomas Bogendoerfer <tbogendoerfer@suse.de> > --- > net/core/gro_cells.c | 11 ++++++++++- > 1 file changed, 10 insertions(+), 1 deletion(-) > > diff --git a/net/core/gro_cells.c b/net/core/gro_cells.c > index ff8e5b64bf6b..2f8d688f9d82 100644 > --- a/net/core/gro_cells.c > +++ b/net/core/gro_cells.c > @@ -20,11 +20,20 @@ int gro_cells_receive(struct gro_cells *gcells, struct sk_buff *skb) > if (unlikely(!(dev->flags & IFF_UP))) > goto drop; > > - if (!gcells->cells || skb_cloned(skb) || netif_elide_gro(dev)) { > + if (!gcells->cells || netif_elide_gro(dev)) { > +netif_rx: > res = netif_rx(skb); > goto unlock; > } > + if (skb_cloned(skb)) { > + struct sk_buff *n; > > + n = skb_copy(skb, GFP_KERNEL); I do not think we want this skb_copy(). This is going to fail too often. Can you remind us why we have this skb_cloned() check here ?
diff --git a/net/core/gro_cells.c b/net/core/gro_cells.c index ff8e5b64bf6b..2f8d688f9d82 100644 --- a/net/core/gro_cells.c +++ b/net/core/gro_cells.c @@ -20,11 +20,20 @@ int gro_cells_receive(struct gro_cells *gcells, struct sk_buff *skb) if (unlikely(!(dev->flags & IFF_UP))) goto drop; - if (!gcells->cells || skb_cloned(skb) || netif_elide_gro(dev)) { + if (!gcells->cells || netif_elide_gro(dev)) { +netif_rx: res = netif_rx(skb); goto unlock; } + if (skb_cloned(skb)) { + struct sk_buff *n; + n = skb_copy(skb, GFP_KERNEL); + if (!n) + goto netif_rx; + kfree_skb(skb); + skb = n; + } cell = this_cpu_ptr(gcells->cells); if (skb_queue_len(&cell->napi_skbs) > READ_ONCE(net_hotdata.max_backlog)) {
gro_cells_receive() passes a cloned skb directly up the stack and could cause re-ordering against segments still in GRO. To avoid this copy the skb and let GRO do it's work. Fixes: c9e6bc644e55 ("net: add gro_cells infrastructure") Signed-off-by: Thomas Bogendoerfer <tbogendoerfer@suse.de> --- net/core/gro_cells.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-)