]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
btf: Add a new kfunc flag which allows to mark a function to be sleepable
authorBenjamin Tissoires <benjamin.tissoires@redhat.com>
Fri, 5 Aug 2022 21:48:14 +0000 (14:48 -0700)
committerAlexei Starovoitov <ast@kernel.org>
Tue, 9 Aug 2022 16:11:17 +0000 (09:11 -0700)
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>
Co-developed-by: Yosry Ahmed <yosryahmed@google.com>
Signed-off-by: Yosry Ahmed <yosryahmed@google.com>
Signed-off-by: Hao Luo <haoluo@google.com>
Link: https://lore.kernel.org/r/20220805214821.1058337-2-haoluo@google.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Documentation/bpf/kfuncs.rst
include/linux/btf.h
kernel/bpf/btf.c

index c0b7dae6dbf549d1fd34b77e2d945521d320bde0..c8b21de1c772697c35a711437eae0a4091dbeb89 100644 (file)
@@ -146,6 +146,12 @@ that operate (change some property, perform some operation) on an object that
 was obtained using an acquire kfunc. Such kfuncs need an unchanged pointer to
 ensure the integrity of the operation being performed on the expected object.
 
+2.4.6 KF_SLEEPABLE flag
+-----------------------
+
+The KF_SLEEPABLE flag is used for kfuncs that may sleep. Such kfuncs can only
+be called by sleepable BPF programs (BPF_F_SLEEPABLE).
+
 2.5 Registering the kfuncs
 --------------------------
 
index cdb376d53238f48154547ca929f207e2681ffb46..976cbdd2981f13099e31f993838ce8eaf9d9a63c 100644 (file)
@@ -49,6 +49,7 @@
  * for this case.
  */
 #define KF_TRUSTED_ARGS (1 << 4) /* kfunc only takes trusted pointer arguments */
+#define KF_SLEEPABLE   (1 << 5) /* kfunc may sleep */
 
 struct btf;
 struct btf_member;
index 7e64447659f3db7f6b8c76905cc1a2fe34921e08..d3e4c86b8fcd7456c75336f478a26638d24aa236 100644 (file)
@@ -6175,6 +6175,7 @@ static int btf_check_func_arg_match(struct bpf_verifier_env *env,
 {
        enum bpf_prog_type prog_type = resolve_prog_type(env->prog);
        bool rel = false, kptr_get = false, trusted_arg = false;
+       bool sleepable = false;
        struct bpf_verifier_log *log = &env->log;
        u32 i, nargs, ref_id, ref_obj_id = 0;
        bool is_kfunc = btf_is_kernel(btf);
@@ -6212,6 +6213,7 @@ static int btf_check_func_arg_match(struct bpf_verifier_env *env,
                rel = kfunc_flags & KF_RELEASE;
                kptr_get = kfunc_flags & KF_KPTR_GET;
                trusted_arg = kfunc_flags & KF_TRUSTED_ARGS;
+               sleepable = kfunc_flags & KF_SLEEPABLE;
        }
 
        /* check that BTF function arguments match actual types that the
@@ -6419,6 +6421,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;
 }