Skip to content

Commit 4925d8d

Browse files
seehearfeelKernel Patches Daemon
authored and
Kernel Patches Daemon
committed
bpf: Return -ENOTSUPP if calls are not allowed in non-JITed programs
If CONFIG_BPF_JIT_ALWAYS_ON is not set and bpf_jit_enable is 0, there exist 6 failed tests. [root@linux bpf]# echo 0 > /proc/sys/net/core/bpf_jit_enable [root@linux bpf]# echo 0 > /proc/sys/kernel/unprivileged_bpf_disabled [root@linux bpf]# ./test_verifier | grep FAIL #106/p inline simple bpf_loop call FAIL #107/p don't inline bpf_loop call, flags non-zero FAIL #108/p don't inline bpf_loop call, callback non-constant FAIL #109/p bpf_loop_inline and a dead func FAIL #110/p bpf_loop_inline stack locations for loop vars FAIL #111/p inline bpf_loop call in a big program FAIL Summary: 768 PASSED, 15 SKIPPED, 6 FAILED The test log shows that callbacks are not allowed in non-JITed programs, interpreter doesn't support them yet, thus these tests should be skipped if jit is disabled, just return -ENOTSUPP instead of -EINVAL for pseudo calls in fixup_call_args(). With this patch: [root@linux bpf]# echo 0 > /proc/sys/net/core/bpf_jit_enable [root@linux bpf]# echo 0 > /proc/sys/kernel/unprivileged_bpf_disabled [root@linux bpf]# ./test_verifier | grep FAIL Summary: 768 PASSED, 21 SKIPPED, 0 FAILED Additionally, as Eduard suggested, return -ENOTSUPP instead of -EINVAL for the other three places where "non-JITed" is used in error messages to keep consistent. Signed-off-by: Tiezhu Yang <[email protected]>
1 parent 90dc19e commit 4925d8d

File tree

1 file changed

+4
-4
lines changed

1 file changed

+4
-4
lines changed

kernel/bpf/verifier.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8908,7 +8908,7 @@ static int check_map_func_compatibility(struct bpf_verifier_env *env,
89088908
goto error;
89098909
if (env->subprog_cnt > 1 && !allow_tail_call_in_subprogs(env)) {
89108910
verbose(env, "tail_calls are not allowed in non-JITed programs with bpf-to-bpf calls\n");
8911-
return -EINVAL;
8911+
return -ENOTSUPP;
89128912
}
89138913
break;
89148914
case BPF_FUNC_perf_event_read:
@@ -19069,22 +19069,22 @@ static int fixup_call_args(struct bpf_verifier_env *env)
1906919069
#ifndef CONFIG_BPF_JIT_ALWAYS_ON
1907019070
if (has_kfunc_call) {
1907119071
verbose(env, "calling kernel functions are not allowed in non-JITed programs\n");
19072-
return -EINVAL;
19072+
return -ENOTSUPP;
1907319073
}
1907419074
if (env->subprog_cnt > 1 && env->prog->aux->tail_call_reachable) {
1907519075
/* When JIT fails the progs with bpf2bpf calls and tail_calls
1907619076
* have to be rejected, since interpreter doesn't support them yet.
1907719077
*/
1907819078
verbose(env, "tail_calls are not allowed in non-JITed programs with bpf-to-bpf calls\n");
19079-
return -EINVAL;
19079+
return -ENOTSUPP;
1908019080
}
1908119081
for (i = 0; i < prog->len; i++, insn++) {
1908219082
if (bpf_pseudo_func(insn)) {
1908319083
/* When JIT fails the progs with callback calls
1908419084
* have to be rejected, since interpreter doesn't support them yet.
1908519085
*/
1908619086
verbose(env, "callbacks are not allowed in non-JITed programs\n");
19087-
return -EINVAL;
19087+
return -ENOTSUPP;
1908819088
}
1908919089

1909019090
if (!bpf_pseudo_call(insn))

0 commit comments

Comments
 (0)