From: Ilias Apalodimas <ilias.apalodimas@linaro.org>
To: Jesper Dangaard Brouer <brouer@redhat.com>
Cc: netdev@vger.kernel.org,
"Daniel Borkmann" <borkmann@iogearbox.net>,
"Alexei Starovoitov" <alexei.starovoitov@gmail.com>,
"David S. Miller" <davem@davemloft.net>,
bpf@vger.kernel.org, "Toke Høiland-Jørgensen" <toke@toke.dk>
Subject: Re: [PATCH bpf-next 3/5] net: core: introduce build_skb_around
Date: Thu, 11 Apr 2019 08:33:03 +0300 [thread overview]
Message-ID: <20190411053303.GA1416@apalos> (raw)
In-Reply-To: <155489662793.20826.5533583763088193882.stgit@firesoul>
On Wed, Apr 10, 2019 at 01:43:47PM +0200, Jesper Dangaard Brouer wrote:
> The function build_skb() also have the responsibility to allocate and clear
> the SKB structure. Introduce a new function build_skb_around(), that moves
> the responsibility of allocation and clearing to the caller. This allows
> caller to use kmem_cache (slab/slub) bulk allocation API.
>
> Next patch use this function combined with kmem_cache_alloc_bulk.
>
> Signed-off-by: Jesper Dangaard Brouer <brouer@redhat.com>
> ---
> include/linux/skbuff.h | 2 +
> net/core/skbuff.c | 71 +++++++++++++++++++++++++++++++++++-------------
> 2 files changed, 54 insertions(+), 19 deletions(-)
>
> diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
> index 9027a8c4219f..c40ffab8a9b0 100644
> --- a/include/linux/skbuff.h
> +++ b/include/linux/skbuff.h
> @@ -1044,6 +1044,8 @@ struct sk_buff *__alloc_skb(unsigned int size, gfp_t priority, int flags,
> int node);
> struct sk_buff *__build_skb(void *data, unsigned int frag_size);
> struct sk_buff *build_skb(void *data, unsigned int frag_size);
> +struct sk_buff *build_skb_around(struct sk_buff *skb,
> + void *data, unsigned int frag_size);
>
> /**
> * alloc_skb - allocate a network buffer
> diff --git a/net/core/skbuff.c b/net/core/skbuff.c
> index 4782f9354dd1..d904b6e5fe08 100644
> --- a/net/core/skbuff.c
> +++ b/net/core/skbuff.c
> @@ -258,6 +258,33 @@ struct sk_buff *__alloc_skb(unsigned int size, gfp_t gfp_mask,
> }
> EXPORT_SYMBOL(__alloc_skb);
>
> +/* Caller must provide SKB that is memset cleared */
> +static struct sk_buff *__build_skb_around(struct sk_buff *skb,
> + void *data, unsigned int frag_size)
> +{
> + struct skb_shared_info *shinfo;
> + unsigned int size = frag_size ? : ksize(data);
> +
> + size -= SKB_DATA_ALIGN(sizeof(struct skb_shared_info));
> +
> + /* Assumes caller memset cleared SKB */
> + skb->truesize = SKB_TRUESIZE(size);
> + refcount_set(&skb->users, 1);
> + skb->head = data;
> + skb->data = data;
> + skb_reset_tail_pointer(skb);
> + skb->end = skb->tail + size;
> + skb->mac_header = (typeof(skb->mac_header))~0U;
> + skb->transport_header = (typeof(skb->transport_header))~0U;
> +
> + /* make sure we initialize shinfo sequentially */
> + shinfo = skb_shinfo(skb);
> + memset(shinfo, 0, offsetof(struct skb_shared_info, dataref));
> + atomic_set(&shinfo->dataref, 1);
> +
> + return skb;
> +}
> +
> /**
> * __build_skb - build a network buffer
> * @data: data buffer provided by caller
> @@ -279,32 +306,15 @@ EXPORT_SYMBOL(__alloc_skb);
> */
> struct sk_buff *__build_skb(void *data, unsigned int frag_size)
> {
> - struct skb_shared_info *shinfo;
> struct sk_buff *skb;
> - unsigned int size = frag_size ? : ksize(data);
>
> skb = kmem_cache_alloc(skbuff_head_cache, GFP_ATOMIC);
> - if (!skb)
> + if (unlikely(!skb))
> return NULL;
>
> - size -= SKB_DATA_ALIGN(sizeof(struct skb_shared_info));
> -
> memset(skb, 0, offsetof(struct sk_buff, tail));
> - skb->truesize = SKB_TRUESIZE(size);
> - refcount_set(&skb->users, 1);
> - skb->head = data;
> - skb->data = data;
> - skb_reset_tail_pointer(skb);
> - skb->end = skb->tail + size;
> - skb->mac_header = (typeof(skb->mac_header))~0U;
> - skb->transport_header = (typeof(skb->transport_header))~0U;
>
> - /* make sure we initialize shinfo sequentially */
> - shinfo = skb_shinfo(skb);
> - memset(shinfo, 0, offsetof(struct skb_shared_info, dataref));
> - atomic_set(&shinfo->dataref, 1);
> -
> - return skb;
> + return __build_skb_around(skb, data, frag_size);
> }
>
> /* build_skb() is wrapper over __build_skb(), that specifically
> @@ -325,6 +335,29 @@ struct sk_buff *build_skb(void *data, unsigned int frag_size)
> }
> EXPORT_SYMBOL(build_skb);
>
> +/**
> + * build_skb_around - build a network buffer around provided skb
> + * @skb: sk_buff provide by caller, must be memset cleared
> + * @data: data buffer provided by caller
> + * @frag_size: size of data, or 0 if head was kmalloced
> + */
> +struct sk_buff *build_skb_around(struct sk_buff *skb,
> + void *data, unsigned int frag_size)
> +{
> + if (unlikely(!skb))
Maybe add a warning here, indicating the buffer *must* be there before calling
this?
> + return NULL;
> +
> + skb = __build_skb_around(skb, data, frag_size);
> +
> + if (skb && frag_size) {
> + skb->head_frag = 1;
> + if (page_is_pfmemalloc(virt_to_head_page(data)))
> + skb->pfmemalloc = 1;
> + }
> + return skb;
> +}
> +EXPORT_SYMBOL(build_skb_around);
> +
> #define NAPI_SKB_CACHE_SIZE 64
>
> struct napi_alloc_cache {
>
/Ilias
next prev parent reply other threads:[~2019-04-11 5:33 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-04-10 11:43 [PATCH bpf-next 0/5] Bulk optimization for XDP cpumap redirect Jesper Dangaard Brouer
2019-04-10 11:43 ` [PATCH bpf-next 1/5] bpf: cpumap use ptr_ring_consume_batched Jesper Dangaard Brouer
2019-04-10 23:24 ` Song Liu
2019-04-11 11:23 ` Jesper Dangaard Brouer
2019-04-11 17:38 ` Song Liu
2019-04-10 11:43 ` [PATCH bpf-next 2/5] bpf: cpumap use netif_receive_skb_list Jesper Dangaard Brouer
2019-04-10 18:56 ` Edward Cree
2019-04-10 11:43 ` [PATCH bpf-next 3/5] net: core: introduce build_skb_around Jesper Dangaard Brouer
2019-04-10 23:34 ` Song Liu
2019-04-11 15:39 ` Jesper Dangaard Brouer
2019-04-11 17:43 ` Song Liu
2019-04-11 5:33 ` Ilias Apalodimas [this message]
2019-04-11 11:17 ` Jesper Dangaard Brouer
2019-04-10 11:43 ` [PATCH bpf-next 4/5] bpf: cpumap do bulk allocation of SKBs Jesper Dangaard Brouer
2019-04-10 23:30 ` Song Liu
2019-04-10 11:43 ` [PATCH bpf-next 5/5] bpf: cpumap memory prefetchw optimizations for struct page Jesper Dangaard Brouer
2019-04-10 23:35 ` Song Liu
2019-04-11 5:47 ` Ilias Apalodimas
2019-04-10 23:36 ` [PATCH bpf-next 0/5] Bulk optimization for XDP cpumap redirect Song Liu
2019-04-11 13:18 ` Jesper Dangaard Brouer
2019-04-11 17:45 ` Song Liu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190411053303.GA1416@apalos \
--to=ilias.apalodimas@linaro.org \
--cc=alexei.starovoitov@gmail.com \
--cc=borkmann@iogearbox.net \
--cc=bpf@vger.kernel.org \
--cc=brouer@redhat.com \
--cc=davem@davemloft.net \
--cc=netdev@vger.kernel.org \
--cc=toke@toke.dk \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.