All of lore.kernel.org
 help / color / mirror / Atom feed
From: Alexei Starovoitov <alexei.starovoitov@gmail.com>
To: Yafang Shao <laoar.shao@gmail.com>
Cc: ast@kernel.org, daniel@iogearbox.net, andrii@kernel.org,
	kafai@fb.com, songliubraving@fb.com, yhs@fb.com,
	john.fastabend@gmail.com, kpsingh@kernel.org, sdf@google.com,
	haoluo@google.com, jolsa@kernel.org, hannes@cmpxchg.org,
	mhocko@kernel.org, roman.gushchin@linux.dev, shakeelb@google.com,
	songmuchun@bytedance.com, akpm@linux-foundation.org,
	netdev@vger.kernel.org, bpf@vger.kernel.org, linux-mm@kvack.org
Subject: Re: [RFC PATCH bpf-next 05/15] bpf: Introduce helpers for container of struct bpf_map
Date: Mon, 1 Aug 2022 21:58:32 -0700	[thread overview]
Message-ID: <20220802045832.fcgzvkenet7cmvy7@macbook-pro-3.dhcp.thefacebook.com> (raw)
In-Reply-To: <20220729152316.58205-6-laoar.shao@gmail.com>

On Fri, Jul 29, 2022 at 03:23:06PM +0000, Yafang Shao wrote:
> Currently bpf_map_area_alloc() is used to allocate a container of struct
> bpf_map or members in this container. To distinguish the map creation
> and other members, let split it into two different helpers,
>   - bpf_map_container_alloc()
>     Used to allocate a container of struct bpf_map, the container is as
>     follows,
>       struct bpf_map_container {
>         struct bpf_map map;  // the map must be the first member
>         ....
>       };
>     Pls. note that the struct bpf_map_contianer is a abstract one, which
>     can be struct bpf_array, struct bpf_bloom_filter and etc.
> 
>     In this helper, it will call bpf_map_save_memcg() to init memcg
>     relevant data in the bpf map. And these data will be cleared in
>     bpf_map_container_free().
> 
>   - bpf_map_area_alloc()
>     Now it is used to allocate the members in a contianer only.
> 
> Signed-off-by: Yafang Shao <laoar.shao@gmail.com>
> ---
>  include/linux/bpf.h  |  4 ++++
>  kernel/bpf/syscall.c | 56 ++++++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 60 insertions(+)
> 
> diff --git a/include/linux/bpf.h b/include/linux/bpf.h
> index 20c26aed7896..2d971b0eb24b 100644
> --- a/include/linux/bpf.h
> +++ b/include/linux/bpf.h
> @@ -1634,9 +1634,13 @@ void bpf_map_inc_with_uref(struct bpf_map *map);
>  struct bpf_map * __must_check bpf_map_inc_not_zero(struct bpf_map *map);
>  void bpf_map_put_with_uref(struct bpf_map *map);
>  void bpf_map_put(struct bpf_map *map);
> +void *bpf_map_container_alloc(u64 size, int numa_node);
> +void *bpf_map_container_mmapable_alloc(u64 size, int numa_node,
> +				       u32 align, u32 offset);
>  void *bpf_map_area_alloc(u64 size, int numa_node);
>  void *bpf_map_area_mmapable_alloc(u64 size, int numa_node);
>  void bpf_map_area_free(void *base);
> +void bpf_map_container_free(void *base);
>  bool bpf_map_write_active(const struct bpf_map *map);
>  void bpf_map_init_from_attr(struct bpf_map *map, union bpf_attr *attr);
>  int  generic_map_lookup_batch(struct bpf_map *map,
> diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c
> index 83c7136c5788..1a1a81a11b37 100644
> --- a/kernel/bpf/syscall.c
> +++ b/kernel/bpf/syscall.c
> @@ -495,6 +495,62 @@ static void bpf_map_release_memcg(struct bpf_map *map)
>  }
>  #endif
>  
> +/*
> + * The return pointer is a bpf_map container, as follow,
> + *   struct bpf_map_container {
> + *       struct bpf_map map;
> + *       ...
> + *   };
> + *
> + * It is used in map creation path.
> + */
> +void *bpf_map_container_alloc(u64 size, int numa_node)
> +{
> +	struct bpf_map *map;
> +	void *container;
> +
> +	container = __bpf_map_area_alloc(size, numa_node, false);
> +	if (!container)
> +		return NULL;
> +
> +	map = (struct bpf_map *)container;
> +	bpf_map_save_memcg(map);
> +
> +	return container;
> +}
> +
> +void *bpf_map_container_mmapable_alloc(u64 size, int numa_node, u32 align,
> +				       u32 offset)
> +{
> +	struct bpf_map *map;
> +	void *container;
> +	void *ptr;
> +
> +	/* kmalloc'ed memory can't be mmap'ed, use explicit vmalloc */
> +	ptr = __bpf_map_area_alloc(size, numa_node, true);
> +	if (!ptr)
> +		return NULL;
> +
> +	container = ptr + align - offset;
> +	map = (struct bpf_map *)container;
> +	bpf_map_save_memcg(map);

This is very error prone.
I don't think the container concept is necessary.
bpf_map_area_alloc() can just take extra memcg_fd argument.

> +
> +	return ptr;
> +}
> +
> +void bpf_map_container_free(void *container)
> +{
> +	struct bpf_map *map;
> +
> +	if (!container)
> +		return;
> +
> +	map = (struct bpf_map *)container;
> +	bpf_map_release_memcg(map);
> +
> +	kvfree(container);
> +}
> +
>  static int bpf_map_kptr_off_cmp(const void *a, const void *b)
>  {
>  	const struct bpf_map_value_off_desc *off_desc1 = a, *off_desc2 = b;
> -- 
> 2.17.1
> 

  reply	other threads:[~2022-08-02  4:58 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-07-29 15:23 [RFC PATCH bpf-next 00/15] bpf: Introduce selectable memcg for bpf map Yafang Shao
2022-07-29 15:23 ` [RFC PATCH bpf-next 01/15] bpf: Remove unneeded memset in queue_stack_map creation Yafang Shao
2022-07-29 15:23 ` [RFC PATCH bpf-next 02/15] bpf: Use bpf_map_area_free instread of kvfree Yafang Shao
2022-07-29 15:23 ` [RFC PATCH bpf-next 03/15] bpf: Make __GFP_NOWARN consistent in bpf map creation Yafang Shao
2022-07-29 15:23 ` [RFC PATCH bpf-next 04/15] bpf: Use bpf_map_area_alloc consistently on " Yafang Shao
2022-07-29 15:23 ` [RFC PATCH bpf-next 05/15] bpf: Introduce helpers for container of struct bpf_map Yafang Shao
2022-08-02  4:58   ` Alexei Starovoitov [this message]
2022-08-02 13:47     ` Yafang Shao
2022-07-29 15:23 ` [RFC PATCH bpf-next 06/15] bpf: Use bpf_map_container_alloc helpers in various bpf maps Yafang Shao
2022-07-29 15:23 ` [RFC PATCH bpf-next 07/15] bpf: Define bpf_map_get_memcg for !CONFIG_MEMCG_KMEM Yafang Shao
2022-07-29 15:23 ` [RFC PATCH bpf-next 08/15] bpf: Use scope-based charge for bpf_map_area_alloc Yafang Shao
2022-07-29 15:23 ` [RFC PATCH bpf-next 09/15] bpf: Use bpf_map_kzalloc in arraymap Yafang Shao
2022-07-29 15:23 ` [RFC PATCH bpf-next 10/15] bpf: Use bpf_map_pages_alloc in ringbuf Yafang Shao
2022-08-01 23:16   ` Andrii Nakryiko
2022-08-02 13:31     ` Yafang Shao
2022-08-02 18:00       ` Andrii Nakryiko
2022-08-03 13:27         ` Yafang Shao
2022-07-29 15:23 ` [RFC PATCH bpf-next 11/15] bpf: Use bpf_map_kvcalloc in bpf_local_storage Yafang Shao
2022-07-29 15:23 ` [RFC PATCH bpf-next 12/15] mm, memcg: Add new helper get_obj_cgroup_from_cgroup Yafang Shao
2022-07-29 15:23 ` [RFC PATCH bpf-next 13/15] bpf: Add new parameter into bpf_map_container_alloc Yafang Shao
2022-07-29 15:23 ` [RFC PATCH bpf-next 14/15] bpf: Add new map flag BPF_F_SELECTABLE_MEMCG Yafang Shao
2022-07-29 15:23 ` [RFC PATCH bpf-next 15/15] bpf: Introduce selectable memcg for bpf map Yafang Shao
2022-08-02  4:55   ` Alexei Starovoitov
2022-08-02 13:47     ` Yafang Shao

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=20220802045832.fcgzvkenet7cmvy7@macbook-pro-3.dhcp.thefacebook.com \
    --to=alexei.starovoitov@gmail.com \
    --cc=akpm@linux-foundation.org \
    --cc=andrii@kernel.org \
    --cc=ast@kernel.org \
    --cc=bpf@vger.kernel.org \
    --cc=daniel@iogearbox.net \
    --cc=hannes@cmpxchg.org \
    --cc=haoluo@google.com \
    --cc=john.fastabend@gmail.com \
    --cc=jolsa@kernel.org \
    --cc=kafai@fb.com \
    --cc=kpsingh@kernel.org \
    --cc=laoar.shao@gmail.com \
    --cc=linux-mm@kvack.org \
    --cc=mhocko@kernel.org \
    --cc=netdev@vger.kernel.org \
    --cc=roman.gushchin@linux.dev \
    --cc=sdf@google.com \
    --cc=shakeelb@google.com \
    --cc=songliubraving@fb.com \
    --cc=songmuchun@bytedance.com \
    --cc=yhs@fb.com \
    /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.