[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <CAEf4BzaYuX5V65Ty=RXnQeZV_DegNrFTM-dtRQPHdv4i2k0s4A@mail.gmail.com>
Date: Mon, 13 Oct 2025 17:10:34 -0700
From: Andrii Nakryiko <andrii.nakryiko@...il.com>
To: Amery Hung <ameryhung@...il.com>
Cc: bpf@...r.kernel.org, netdev@...r.kernel.org, alexei.starovoitov@...il.com,
andrii@...nel.org, daniel@...earbox.net, tj@...nel.org, martin.lau@...nel.org,
kernel-team@...a.com
Subject: Re: [RFC PATCH v1 bpf-next 3/4] libbpf: Add bpf_struct_ops_associate_prog()
API
On Fri, Oct 10, 2025 at 10:50 AM Amery Hung <ameryhung@...il.com> wrote:
>
> Add low-level wrapper API for BPF_STRUCT_OPS_ASSOCIATE_PROG command in
> bpf() syscall.
>
> Signed-off-by: Amery Hung <ameryhung@...il.com>
> ---
> tools/lib/bpf/bpf.c | 18 ++++++++++++++++++
> tools/lib/bpf/bpf.h | 19 +++++++++++++++++++
> tools/lib/bpf/libbpf.map | 1 +
> 3 files changed, 38 insertions(+)
>
> diff --git a/tools/lib/bpf/bpf.c b/tools/lib/bpf/bpf.c
> index 339b19797237..230fc2fa98f9 100644
> --- a/tools/lib/bpf/bpf.c
> +++ b/tools/lib/bpf/bpf.c
> @@ -1397,3 +1397,21 @@ int bpf_prog_stream_read(int prog_fd, __u32 stream_id, void *buf, __u32 buf_len,
> err = sys_bpf(BPF_PROG_STREAM_READ_BY_FD, &attr, attr_sz);
> return libbpf_err_errno(err);
> }
> +
> +int bpf_struct_ops_associate_prog(int map_fd, int prog_fd,
> + struct bpf_struct_ops_associate_prog_opts *opts)
> +{
> + const size_t attr_sz = offsetofend(union bpf_attr, struct_ops_assoc_prog);
> + union bpf_attr attr;
> + int err;
> +
> + if (!OPTS_VALID(opts, bpf_struct_ops_associate_prog_opts))
> + return libbpf_err(-EINVAL);
> +
> + memset(&attr, 0, attr_sz);
> + attr.struct_ops_assoc_prog.map_fd = map_fd;
> + attr.struct_ops_assoc_prog.prog_fd = prog_fd;
> +
> + err = sys_bpf(BPF_STRUCT_OPS_ASSOCIATE_PROG, &attr, attr_sz);
> + return libbpf_err_errno(err);
> +}
> diff --git a/tools/lib/bpf/bpf.h b/tools/lib/bpf/bpf.h
> index e983a3e40d61..99fe189ca7c6 100644
> --- a/tools/lib/bpf/bpf.h
> +++ b/tools/lib/bpf/bpf.h
> @@ -733,6 +733,25 @@ struct bpf_prog_stream_read_opts {
> LIBBPF_API int bpf_prog_stream_read(int prog_fd, __u32 stream_id, void *buf, __u32 buf_len,
> struct bpf_prog_stream_read_opts *opts);
>
> +struct bpf_struct_ops_associate_prog_opts {
> + size_t sz;
there will be flags, justifying this struct :)
> + size_t :0;
> +};
> +#define bpf_struct_ops_associate_prog_opts__last_field sz
> +/**
> + * @brief **bpf_struct_ops_associate_prog** associate a BPF program with a
> + * struct_ops map.
> + *
> + * @param map_fd FD for the struct_ops map to be associated with a BPF progam
> + * @param prog_fd FD for the BPF program
> + * @param opts optional options, can be NULL
> + *
> + * @return 0 on success; negative error code, otherwise (errno is also set to
> + * the error code)
> + */
> +LIBBPF_API int bpf_struct_ops_associate_prog(int map_fd, int prog_fd,
> + struct bpf_struct_ops_associate_prog_opts *opts);
> +
> #ifdef __cplusplus
> } /* extern "C" */
> #endif
> diff --git a/tools/lib/bpf/libbpf.map b/tools/lib/bpf/libbpf.map
> index 8ed8749907d4..3a156a663210 100644
> --- a/tools/lib/bpf/libbpf.map
> +++ b/tools/lib/bpf/libbpf.map
> @@ -451,4 +451,5 @@ LIBBPF_1.7.0 {
> global:
> bpf_map__set_exclusive_program;
> bpf_map__exclusive_program;
> + bpf_struct_ops_associate_prog;
> } LIBBPF_1.6.0;
> --
> 2.47.3
>
Powered by blists - more mailing lists