Message ID | 20220722021313.3150035-2-yosryahmed@google.com (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | BPF |
Headers | show |
Series | bpf: rstat: cgroup hierarchical stats | expand |
Context | Check | Description |
---|---|---|
netdev/tree_selection | success | Clearly marked for bpf-next, async |
netdev/apply | fail | Patch does not apply to bpf-next |
bpf/vmtest-bpf-next-PR | fail | PR summary |
bpf/vmtest-bpf-next-VM_Test-1 | success | Logs for Kernel LATEST on ubuntu-latest with gcc |
bpf/vmtest-bpf-next-VM_Test-2 | success | Logs for Kernel LATEST on ubuntu-latest with llvm-15 |
bpf/vmtest-bpf-next-VM_Test-3 | fail | Logs for Kernel LATEST on z15 with gcc |
On Thu, Jul 21, 2022 at 7:13 PM Yosry Ahmed <yosryahmed@google.com> wrote: > > From: Benjamin Tissoires <benjamin.tissoires@redhat.com> > > This allows to declare a kfunc as sleepable and prevents its use in > a non sleepable program. > > Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com> > Signed-off-by: Yosry Ahmed <yosryahmed@google.com> > --- > include/linux/btf.h | 2 ++ > kernel/bpf/btf.c | 13 +++++++++++-- > 2 files changed, 13 insertions(+), 2 deletions(-) > > diff --git a/include/linux/btf.h b/include/linux/btf.h > index 1bfed7fa0428..6e7517573d9e 100644 > --- a/include/linux/btf.h > +++ b/include/linux/btf.h > @@ -18,6 +18,7 @@ enum btf_kfunc_type { > BTF_KFUNC_TYPE_RELEASE, > BTF_KFUNC_TYPE_RET_NULL, > BTF_KFUNC_TYPE_KPTR_ACQUIRE, > + BTF_KFUNC_TYPE_SLEEPABLE, > BTF_KFUNC_TYPE_MAX, > }; This patch needs refactoring using the new BTF_ID_FLAGS scheme. When you do that please update the Documentation/bpf/kfuncs.rst as well. Thanks!
On Fri, Jul 22, 2022 at 9:20 AM Alexei Starovoitov <alexei.starovoitov@gmail.com> wrote: > > On Thu, Jul 21, 2022 at 7:13 PM Yosry Ahmed <yosryahmed@google.com> wrote: > > > > From: Benjamin Tissoires <benjamin.tissoires@redhat.com> > > > > This allows to declare a kfunc as sleepable and prevents its use in > > a non sleepable program. > > > > Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com> > > Signed-off-by: Yosry Ahmed <yosryahmed@google.com> > > --- > > include/linux/btf.h | 2 ++ > > kernel/bpf/btf.c | 13 +++++++++++-- > > 2 files changed, 13 insertions(+), 2 deletions(-) > > > > diff --git a/include/linux/btf.h b/include/linux/btf.h > > index 1bfed7fa0428..6e7517573d9e 100644 > > --- a/include/linux/btf.h > > +++ b/include/linux/btf.h > > @@ -18,6 +18,7 @@ enum btf_kfunc_type { > > BTF_KFUNC_TYPE_RELEASE, > > BTF_KFUNC_TYPE_RET_NULL, > > BTF_KFUNC_TYPE_KPTR_ACQUIRE, > > + BTF_KFUNC_TYPE_SLEEPABLE, > > BTF_KFUNC_TYPE_MAX, > > }; > > This patch needs refactoring using the new BTF_ID_FLAGS scheme. > When you do that please update the Documentation/bpf/kfuncs.rst as well. > > Thanks! Sent v5 rebased on top of the new kfunc flags infrastructure, and added documentation for sleepable kfuncs.
diff --git a/include/linux/btf.h b/include/linux/btf.h index 1bfed7fa0428..6e7517573d9e 100644 --- a/include/linux/btf.h +++ b/include/linux/btf.h @@ -18,6 +18,7 @@ enum btf_kfunc_type { BTF_KFUNC_TYPE_RELEASE, BTF_KFUNC_TYPE_RET_NULL, BTF_KFUNC_TYPE_KPTR_ACQUIRE, + BTF_KFUNC_TYPE_SLEEPABLE, BTF_KFUNC_TYPE_MAX, }; @@ -37,6 +38,7 @@ struct btf_kfunc_id_set { struct btf_id_set *release_set; struct btf_id_set *ret_null_set; struct btf_id_set *kptr_acquire_set; + struct btf_id_set *sleepable_set; }; struct btf_id_set *sets[BTF_KFUNC_TYPE_MAX]; }; diff --git a/kernel/bpf/btf.c b/kernel/bpf/btf.c index 5869f03bcb6e..2040e440f347 100644 --- a/kernel/bpf/btf.c +++ b/kernel/bpf/btf.c @@ -6178,7 +6178,7 @@ static int btf_check_func_arg_match(struct bpf_verifier_env *env, struct bpf_verifier_log *log = &env->log; u32 i, nargs, ref_id, ref_obj_id = 0; bool is_kfunc = btf_is_kernel(btf); - bool rel = false, kptr_get = false; + bool rel = false, kptr_get = false, sleepable = false; const char *func_name, *ref_tname; const struct btf_type *t, *ref_t; const struct btf_param *args; @@ -6209,11 +6209,13 @@ static int btf_check_func_arg_match(struct bpf_verifier_env *env, } if (is_kfunc) { - /* Only kfunc can be release func */ + /* Only kfunc can be release, kptr acquire, or sleepable func */ rel = btf_kfunc_id_set_contains(btf, resolve_prog_type(env->prog), BTF_KFUNC_TYPE_RELEASE, func_id); kptr_get = btf_kfunc_id_set_contains(btf, resolve_prog_type(env->prog), BTF_KFUNC_TYPE_KPTR_ACQUIRE, func_id); + sleepable = btf_kfunc_id_set_contains(btf, resolve_prog_type(env->prog), + BTF_KFUNC_TYPE_SLEEPABLE, func_id); } /* check that BTF function arguments match actual types that the @@ -6411,6 +6413,13 @@ static int btf_check_func_arg_match(struct bpf_verifier_env *env, func_name); return -EINVAL; } + + if (sleepable && !env->prog->aux->sleepable) { + bpf_log(log, "kernel function %s is sleepable but the program is not\n", + func_name); + return -EINVAL; + } + /* returns argument register number > 0 in case of reference release kfunc */ return rel ? ref_regno : 0; }