Messages in this thread | | | From | Eric Dumazet <> | Date | Wed, 31 May 2023 17:15:58 +0200 | Subject | Re: [PATCH v2 1/1] gro: decrease size of CB |
| |
On Wed, May 31, 2023 at 4:30 PM Richard Gobert <richardbgobert@gmail.com> wrote: > > The GRO control block (NAPI_GRO_CB) is currently at its maximum size. > This commit reduces its size by putting two groups of fields that are > used only at different times into a union. > > Specifically, the fields frag0 and frag0_len are the fields that make up > the frag0 optimisation mechanism, which is used during the initial > parsing of the SKB. > > The fields last and age are used after the initial parsing, while the > SKB is stored in the GRO list, waiting for other packets to arrive. > > There was one location in dev_gro_receive that modified the frag0 fields > after setting last and age. I changed this accordingly without altering > the code behaviour. > > Signed-off-by: Richard Gobert <richardbgobert@gmail.com> > --- > include/net/gro.h | 26 ++++++++++++++++---------- > net/core/gro.c | 18 +++++++++++------- > 2 files changed, 27 insertions(+), 17 deletions(-) > > diff --git a/include/net/gro.h b/include/net/gro.h > index a4fab706240d..7b47dd6ce94f 100644 > --- a/include/net/gro.h > +++ b/include/net/gro.h > @@ -11,11 +11,23 @@ > #include <net/udp.h> > > struct napi_gro_cb { > - /* Virtual address of skb_shinfo(skb)->frags[0].page + offset. */ > - void *frag0; > + union { > + struct { > + /* Virtual address of skb_shinfo(skb)->frags[0].page + offset. */ > + void *frag0; > > - /* Length of frag0. */ > - unsigned int frag0_len; > + /* Length of frag0. */ > + unsigned int frag0_len; > + }; > + > + struct { > + /* used in skb_gro_receive() slow path */ > + struct sk_buff *last; > + > + /* jiffies when first packet was created/queued */ > + unsigned long age; > + }; > + }; > > /* This indicates where we are processing relative to skb->data. */ > int data_offset; > @@ -32,9 +44,6 @@ struct napi_gro_cb { > /* Used in ipv6_gro_receive() and foo-over-udp */ > u16 proto; > > - /* jiffies when first packet was created/queued */ > - unsigned long age; > - > /* Used in napi_gro_cb::free */ > #define NAPI_GRO_FREE 1 > #define NAPI_GRO_FREE_STOLEN_HEAD 2 > @@ -77,9 +86,6 @@ struct napi_gro_cb { > > /* used to support CHECKSUM_COMPLETE for tunneling protocols */ > __wsum csum; > - > - /* used in skb_gro_receive() slow path */ > - struct sk_buff *last; > }; > > #define NAPI_GRO_CB(skb) ((struct napi_gro_cb *)(skb)->cb) > diff --git a/net/core/gro.c b/net/core/gro.c > index 2d84165cb4f1..c6955ef9ca99 100644 > --- a/net/core/gro.c > +++ b/net/core/gro.c > @@ -460,6 +460,14 @@ static void gro_pull_from_frag0(struct sk_buff *skb, int grow) > } > } > > +static void gro_try_pull_from_frag0(struct sk_buff *skb) > +{ > + int grow = skb_gro_offset(skb) - skb_headlen(skb); > + > + if (grow > 0) > + gro_pull_from_frag0(skb, grow); > +} > + > static void gro_flush_oldest(struct napi_struct *napi, struct list_head *head) > { > struct sk_buff *oldest; > @@ -489,7 +497,6 @@ static enum gro_result dev_gro_receive(struct napi_struct *napi, struct sk_buff > struct sk_buff *pp = NULL; > enum gro_result ret; > int same_flow; > - int grow; > > if (netif_elide_gro(skb->dev)) > goto normal; > @@ -564,17 +571,13 @@ static enum gro_result dev_gro_receive(struct napi_struct *napi, struct sk_buff > else > gro_list->count++; >
Could you add a comment here or in front of gro_try_pull_from_frag0() ?
/* Must be called before setting NAPI_GRO_CB(skb)->{age|last} (/
> + gro_try_pull_from_frag0(skb); > NAPI_GRO_CB(skb)->age = jiffies; > NAPI_GRO_CB(skb)->last = skb; > if (!skb_is_gso(skb)) > skb_shinfo(skb)->gso_size = skb_gro_len(skb); > list_add(&skb->list, &gro_list->list); > ret = GRO_HELD;
Thanks.
| |