]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
bpf: add is_async_callback_calling_insn() helper
authorBenjamin Tissoires <bentiss@kernel.org>
Wed, 21 Feb 2024 16:25:19 +0000 (17:25 +0100)
committerAlexei Starovoitov <ast@kernel.org>
Fri, 23 Feb 2024 01:48:53 +0000 (17:48 -0800)
Currently we have a special case for BPF_FUNC_timer_set_callback,
let's introduce a helper we can extend for the kfunc that will come in
a later patch

Signed-off-by: Benjamin Tissoires <bentiss@kernel.org>
Link: https://lore.kernel.org/r/20240221-hid-bpf-sleepable-v3-3-1fb378ca6301@kernel.org
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
kernel/bpf/verifier.c

index b787a6d676967b1561f74d50b58b507121fec4cd..1c34b91b95838332abd96b0995601974b34d9750 100644 (file)
@@ -528,6 +528,11 @@ static bool is_sync_callback_calling_insn(struct bpf_insn *insn)
               (bpf_pseudo_kfunc_call(insn) && is_sync_callback_calling_kfunc(insn->imm));
 }
 
+static bool is_async_callback_calling_insn(struct bpf_insn *insn)
+{
+       return bpf_helper_call(insn) && is_async_callback_calling_function(insn->imm);
+}
+
 static bool is_storage_get_function(enum bpf_func_id func_id)
 {
        return func_id == BPF_FUNC_sk_storage_get ||
@@ -9445,9 +9450,7 @@ static int push_callback_call(struct bpf_verifier_env *env, struct bpf_insn *ins
                return -EFAULT;
        }
 
-       if (insn->code == (BPF_JMP | BPF_CALL) &&
-           insn->src_reg == 0 &&
-           insn->imm == BPF_FUNC_timer_set_callback) {
+       if (is_async_callback_calling_insn(insn)) {
                struct bpf_verifier_state *async_cb;
 
                /* there is no real recursion here. timer callbacks are async */
@@ -15588,7 +15591,7 @@ static int visit_insn(int t, struct bpf_verifier_env *env)
                return DONE_EXPLORING;
 
        case BPF_CALL:
-               if (insn->src_reg == 0 && insn->imm == BPF_FUNC_timer_set_callback)
+               if (is_async_callback_calling_insn(insn))
                        /* Mark this call insn as a prune point to trigger
                         * is_state_visited() check before call itself is
                         * processed by __check_func_call(). Otherwise new