bpf: Pass const struct bpf_prog * to .check_member
authorDavid Vernet <void@manifault.com>
Wed, 25 Jan 2023 16:47:34 +0000 (10:47 -0600)
committerAlexei Starovoitov <ast@kernel.org>
Wed, 25 Jan 2023 18:25:57 +0000 (10:25 -0800)
The .check_member field of struct bpf_struct_ops is currently passed the
member's btf_type via const struct btf_type *t, and a const struct
btf_member *member. This allows the struct_ops implementation to check
whether e.g. an ops is supported, but it would be useful to also enforce
that the struct_ops prog being loaded for that member has other
qualities, like being sleepable (or not). This patch therefore updates
the .check_member() callback to also take a const struct bpf_prog *prog
argument.

Signed-off-by: David Vernet <void@manifault.com>
Link: https://lore.kernel.org/r/20230125164735.785732-4-void@manifault.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
include/linux/bpf.h
kernel/bpf/verifier.c
net/ipv4/bpf_tcp_ca.c

index 1bec48d..0d868ef 100644 (file)
@@ -1422,7 +1422,8 @@ struct bpf_struct_ops {
        const struct bpf_verifier_ops *verifier_ops;
        int (*init)(struct btf *btf);
        int (*check_member)(const struct btf_type *t,
-                           const struct btf_member *member);
+                           const struct btf_member *member,
+                           const struct bpf_prog *prog);
        int (*init_member)(const struct btf_type *t,
                           const struct btf_member *member,
                           void *kdata, const void *udata);
index c8907df..6bd097e 100644 (file)
@@ -16792,7 +16792,7 @@ static int check_struct_ops_btf_id(struct bpf_verifier_env *env)
        }
 
        if (st_ops->check_member) {
-               int err = st_ops->check_member(t, member);
+               int err = st_ops->check_member(t, member, prog);
 
                if (err) {
                        verbose(env, "attach to unsupported member %s of struct %s\n",
index 4517d2b..13fc0c1 100644 (file)
@@ -248,7 +248,8 @@ static int bpf_tcp_ca_init_member(const struct btf_type *t,
 }
 
 static int bpf_tcp_ca_check_member(const struct btf_type *t,
-                                  const struct btf_member *member)
+                                  const struct btf_member *member,
+                                  const struct bpf_prog *prog)
 {
        if (is_unsupported(__btf_member_bit_offset(t, member) / 8))
                return -ENOTSUPP;