From: "Emil Tsalapatis" <emil@etsalapatis.com>
To: "Amery Hung" <ameryhung@gmail.com>, <bpf@vger.kernel.org>
Cc: <netdev@vger.kernel.org>, <alexei.starovoitov@gmail.com>,
<andrii@kernel.org>, <daniel@iogearbox.net>, <eddyz87@gmail.com>,
<memxor@gmail.com>, <martin.lau@kernel.org>,
<shakeel.butt@linux.dev>, <roman.gushchin@linux.dev>,
<kuniyu@google.com>, <kerneljasonxing@gmail.com>,
<kernel-team@meta.com>
Subject: Re: [PATCH bpf-next v3 13/15] libbpf: Support attaching struct_ops to a cgroup
Date: Tue, 14 Jul 2026 02:48:44 -0400 [thread overview]
Message-ID: <DJY3DJSWEMPW.3ODE44OQVL7J3@etsalapatis.com> (raw)
In-Reply-To: <20260706171918.317102-14-ameryhung@gmail.com>
On Mon Jul 6, 2026 at 1:19 PM EDT, Amery Hung wrote:
> From: Martin KaFai Lau <martin.lau@kernel.org>
>
> Add bpf_map__attach_cgroup_opts() to attach a struct_ops map to a cgroup
> through a BPF link.
>
> Also extend struct bpf_prog_query_opts with a type_id field so a
> BPF_STRUCT_OPS query on a cgroup can select the struct_ops type to
> enumerate.
>
> Signed-off-by: Martin KaFai Lau <martin.lau@kernel.org>
> Signed-off-by: Amery Hung <ameryhung@gmail.com>
Reviewed-by: Emil Tsalapatis <emil@etsalapatis.com>
> ---
> tools/lib/bpf/bpf.c | 2 ++
> tools/lib/bpf/bpf.h | 3 +-
> tools/lib/bpf/libbpf.c | 64 ++++++++++++++++++++++++++++++++++++++++
> tools/lib/bpf/libbpf.h | 3 ++
> tools/lib/bpf/libbpf.map | 1 +
> 5 files changed, 72 insertions(+), 1 deletion(-)
>
> diff --git a/tools/lib/bpf/bpf.c b/tools/lib/bpf/bpf.c
> index 96819c082c77..a9de7f107cf7 100644
> --- a/tools/lib/bpf/bpf.c
> +++ b/tools/lib/bpf/bpf.c
> @@ -934,6 +934,7 @@ int bpf_link_create(int prog_fd, int target_fd,
> case BPF_CGROUP_GETSOCKOPT:
> case BPF_CGROUP_SETSOCKOPT:
> case BPF_LSM_CGROUP:
> + case BPF_STRUCT_OPS:
> relative_fd = OPTS_GET(opts, cgroup.relative_fd, 0);
> relative_id = OPTS_GET(opts, cgroup.relative_id, 0);
> if (relative_fd && relative_id)
> @@ -1056,6 +1057,7 @@ int bpf_prog_query_opts(int target, enum bpf_attach_type type,
> attr.query.attach_type = type;
> attr.query.query_flags = OPTS_GET(opts, query_flags, 0);
> attr.query.count = OPTS_GET(opts, count, 0);
> + attr.query.type_id = OPTS_GET(opts, type_id, 0);
> attr.query.prog_ids = ptr_to_u64(OPTS_GET(opts, prog_ids, NULL));
> attr.query.link_ids = ptr_to_u64(OPTS_GET(opts, link_ids, NULL));
> attr.query.prog_attach_flags = ptr_to_u64(OPTS_GET(opts, prog_attach_flags, NULL));
> diff --git a/tools/lib/bpf/bpf.h b/tools/lib/bpf/bpf.h
> index 7534a593edae..490e8cb4ba53 100644
> --- a/tools/lib/bpf/bpf.h
> +++ b/tools/lib/bpf/bpf.h
> @@ -637,9 +637,10 @@ struct bpf_prog_query_opts {
> __u32 *link_ids;
> __u32 *link_attach_flags;
> __u64 revision;
> + __u32 type_id;
> size_t :0;
> };
> -#define bpf_prog_query_opts__last_field revision
> +#define bpf_prog_query_opts__last_field type_id
>
> /**
> * @brief **bpf_prog_query_opts()** queries the BPF programs and BPF links
> diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c
> index 7162146280a8..50a83b9217e4 100644
> --- a/tools/lib/bpf/libbpf.c
> +++ b/tools/lib/bpf/libbpf.c
> @@ -14104,6 +14104,70 @@ struct bpf_link *bpf_map__attach_struct_ops(const struct bpf_map *map)
> return &link->link;
> }
>
> +struct bpf_link *bpf_map__attach_cgroup_opts(const struct bpf_map *map, int cgroup_fd,
> + const struct bpf_cgroup_opts *opts)
> +{
> + LIBBPF_OPTS(bpf_link_create_opts, link_create_opts);
> + struct bpf_link_struct_ops *link;
> + __u32 relative_id, zero = 0;
> + int err, fd, relative_fd;
> +
> + if (!OPTS_VALID(opts, bpf_cgroup_opts))
> + return libbpf_err_ptr(-EINVAL);
> +
> + if (!bpf_map__is_struct_ops(map)) {
> + pr_warn("map '%s': can't attach non-struct_ops map\n", map->name);
> + return libbpf_err_ptr(-EINVAL);
> + }
> +
> + if (map->fd < 0) {
> + pr_warn("map '%s': can't attach BPF map without FD (was it created?)\n", map->name);
> + return libbpf_err_ptr(-EINVAL);
> + }
> +
> + if (!(map->def.map_flags & BPF_F_LINK)) {
> + pr_warn("map '%s': can't attach to cgroup without BPF_F_LINK\n", map->name);
> + return libbpf_err_ptr(-EINVAL);
> + }
> +
> + relative_id = OPTS_GET(opts, relative_id, 0);
> + relative_fd = OPTS_GET(opts, relative_fd, 0);
> +
> + if (relative_fd && relative_id) {
> + pr_warn("map '%s': relative_fd and relative_id cannot be set at the same time\n",
> + map->name);
> + return libbpf_err_ptr(-EINVAL);
> + }
> +
> + link_create_opts.cgroup.expected_revision = OPTS_GET(opts, expected_revision, 0);
> + link_create_opts.cgroup.relative_fd = relative_fd;
> + link_create_opts.cgroup.relative_id = relative_id;
> + link_create_opts.flags = OPTS_GET(opts, flags, 0);
> +
> + link = calloc(1, sizeof(*link));
> + if (!link)
> + return libbpf_err_ptr(-ENOMEM);
> +
> + err = bpf_map_update_elem(map->fd, &zero, map->st_ops->kern_vdata, 0);
> + if (err && err != -EBUSY) {
> + free(link);
> + return libbpf_err_ptr(err);
> + }
> +
> + link->link.detach = bpf_link__detach_struct_ops;
> +
> + fd = bpf_link_create(map->fd, cgroup_fd, BPF_STRUCT_OPS, &link_create_opts);
> + if (fd < 0) {
> + free(link);
> + return libbpf_err_ptr(fd);
> + }
> +
> + link->link.fd = fd;
> + link->map_fd = map->fd;
> +
> + return &link->link;
> +}
> +
> /*
> * Swap the back struct_ops of a link with a new struct_ops map.
> */
> diff --git a/tools/lib/bpf/libbpf.h b/tools/lib/bpf/libbpf.h
> index b965ad571540..0e5f4e9bba41 100644
> --- a/tools/lib/bpf/libbpf.h
> +++ b/tools/lib/bpf/libbpf.h
> @@ -960,6 +960,9 @@ bpf_program__attach_cgroup_opts(const struct bpf_program *prog, int cgroup_fd,
> struct bpf_map;
>
> LIBBPF_API struct bpf_link *bpf_map__attach_struct_ops(const struct bpf_map *map);
> +LIBBPF_API struct bpf_link *bpf_map__attach_cgroup_opts(const struct bpf_map *map,
> + int cgroup_fd,
> + const struct bpf_cgroup_opts *opts);
> LIBBPF_API int bpf_link__update_map(struct bpf_link *link, const struct bpf_map *map);
>
> struct bpf_iter_attach_opts {
> diff --git a/tools/lib/bpf/libbpf.map b/tools/lib/bpf/libbpf.map
> index b731df19ae69..5131fdb979b7 100644
> --- a/tools/lib/bpf/libbpf.map
> +++ b/tools/lib/bpf/libbpf.map
> @@ -461,4 +461,5 @@ LIBBPF_1.8.0 {
> bpf_program__attach_tracing_multi;
> bpf_program__clone;
> btf__new_empty_opts;
> + bpf_map__attach_cgroup_opts;
> } LIBBPF_1.7.0;
next prev parent reply other threads:[~2026-07-14 6:48 UTC|newest]
Thread overview: 37+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-06 17:19 [PATCH bpf-next v3 00/15] bpf: A common way to attach struct_ops to a cgroup Amery Hung
2026-07-06 17:19 ` [PATCH bpf-next v3 01/15] bpf: Remove __rcu tagging in st_link->map Amery Hung
2026-07-13 19:02 ` Emil Tsalapatis
2026-07-06 17:19 ` [PATCH bpf-next v3 02/15] bpf: Make struct_ops tasks_rcu grace period optional Amery Hung
2026-07-06 17:44 ` sashiko-bot
2026-07-13 19:01 ` Emil Tsalapatis
2026-07-06 17:19 ` [PATCH bpf-next v3 03/15] bpf: Add bpf_struct_ops accessor helpers Amery Hung
2026-07-06 17:34 ` sashiko-bot
2026-07-06 18:16 ` Amery Hung
2026-07-13 20:36 ` Emil Tsalapatis
2026-07-06 17:19 ` [PATCH bpf-next v3 04/15] bpf: Remove unnecessary prog_list_prog() check Amery Hung
2026-07-13 20:35 ` Emil Tsalapatis
2026-07-06 17:19 ` [PATCH bpf-next v3 05/15] bpf: Replace prog_list_prog() check with direct pl->prog and pl->link check Amery Hung
2026-07-13 21:27 ` Emil Tsalapatis
2026-07-06 17:19 ` [PATCH bpf-next v3 06/15] bpf: Add prog_list_init_item(), prog_list_replace_item(), and prog_list_id() Amery Hung
2026-07-13 21:56 ` Emil Tsalapatis
2026-07-06 17:19 ` [PATCH bpf-next v3 07/15] bpf: Move LSM trampoline unlink into bpf_cgroup_link_auto_detach() Amery Hung
2026-07-13 21:57 ` Emil Tsalapatis
2026-07-06 17:19 ` [PATCH bpf-next v3 08/15] bpf: Add a few bpf_cgroup_array_* helper functions Amery Hung
2026-07-13 21:57 ` Emil Tsalapatis
2026-07-06 17:19 ` [PATCH bpf-next v3 09/15] bpf: Add infrastructure to support attaching struct_ops to cgroups Amery Hung
2026-07-06 17:47 ` sashiko-bot
2026-07-14 6:21 ` Emil Tsalapatis
2026-07-06 17:19 ` [PATCH bpf-next v3 10/15] bpf: Allow all struct_ops to use bpf_dynptr_from_skb() Amery Hung
2026-07-14 6:23 ` Emil Tsalapatis
2026-07-06 17:19 ` [PATCH bpf-next v3 11/15] bpf: tcp: Support selected sock_ops callbacks as struct_ops Amery Hung
2026-07-06 18:28 ` bot+bpf-ci
2026-07-06 23:11 ` Amery Hung
2026-07-06 17:19 ` [PATCH bpf-next v3 12/15] bpf: tcp: Support parse/len/write header option hooks in bpf_tcp_ops Amery Hung
2026-07-06 17:45 ` sashiko-bot
2026-07-06 22:31 ` Amery Hung
2026-07-06 17:19 ` [PATCH bpf-next v3 13/15] libbpf: Support attaching struct_ops to a cgroup Amery Hung
2026-07-14 6:48 ` Emil Tsalapatis [this message]
2026-07-06 17:19 ` [PATCH bpf-next v3 14/15] selftests/bpf: Test " Amery Hung
2026-07-06 17:19 ` [PATCH bpf-next v3 15/15] selftests/bpf: Add test for bpf_tcp_ops header option hooks Amery Hung
2026-07-06 17:47 ` sashiko-bot
2026-07-06 18:18 ` Amery Hung
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=DJY3DJSWEMPW.3ODE44OQVL7J3@etsalapatis.com \
--to=emil@etsalapatis.com \
--cc=alexei.starovoitov@gmail.com \
--cc=ameryhung@gmail.com \
--cc=andrii@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=daniel@iogearbox.net \
--cc=eddyz87@gmail.com \
--cc=kernel-team@meta.com \
--cc=kerneljasonxing@gmail.com \
--cc=kuniyu@google.com \
--cc=martin.lau@kernel.org \
--cc=memxor@gmail.com \
--cc=netdev@vger.kernel.org \
--cc=roman.gushchin@linux.dev \
--cc=shakeel.butt@linux.dev \
/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.