From: Geliang Tang <[email protected]>
Run bloom_filter_map selftests (./test_progs -t bloom_filter_map) on a
Loongarch platform, an error message "JIT doesn't support bpf-to-bpf calls"
is got in user space, together with an unexpected errno EINVAL (22), not
ENOTSUPP (524):
libbpf: prog 'inner_map': BPF program load failed: Invalid argument
libbpf: prog 'inner_map': -- BEGIN PROG LOAD LOG --
JIT doesn't support bpf-to-bpf calls
callbacks are not allowed in non-JITed programs
processed 37 insns (limit 1000000) max_states_per_insn 1 total_states
-- END PROG LOAD LOG --
libbpf: prog 'inner_map': failed to load: -22
libbpf: failed to load object 'bloom_filter_map'
libbpf: failed to load BPF skeleton 'bloom_filter_map': -22
setup_progs:FAIL:bloom_filter_map__open_and_load unexpected error: -22
#16 bloom_filter_map:FAIL
Although the return value of jit_subprogs() does be set as "ENOTSUPP":
verbose(env, "JIT doesn't support bpf-to-bpf calls\n");
err = -ENOTSUPP;
goto out_free;
But afterwards in fixup_call_args(), the return value of jit_subprogs()
is ignored, and overwritten as "-EINVAL":
verbose(env, "callbacks are not allowed in non-JITed programs\n");
return -EINVAL;
This patch fixes this by changing return values of fixup_call_args() from
"-EINVAL" to "err ?: -EINVAL". With this change, errno 524 is got in user
space now:
libbpf: prog 'inner_map': BPF program load failed: unknown error (-524)
libbpf: prog 'inner_map': -- BEGIN PROG LOAD LOG --
JIT doesn't support bpf-to-bpf calls
processed 37 insns (limit 1000000) max_states_per_insn 1 total_states
-- END PROG LOAD LOG --
libbpf: prog 'inner_map': failed to load: -524
libbpf: failed to load object 'bloom_filter_map'
libbpf: failed to load BPF skeleton 'bloom_filter_map': -524
setup_progs:FAIL:bloom_filter_map__open_and_load unexpected error: -524
Signed-off-by: Geliang Tang <[email protected]>
---
kernel/bpf/verifier.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c
index c0263fb5ca4b..aa589fedd036 100644
--- a/kernel/bpf/verifier.c
+++ b/kernel/bpf/verifier.c
@@ -19717,14 +19717,14 @@ static int fixup_call_args(struct bpf_verifier_env
*env)
#ifndef CONFIG_BPF_JIT_ALWAYS_ON
if (has_kfunc_call) {
verbose(env, "calling kernel functions are not allowed in
non-JITed programs\n");
- return -EINVAL;
+ return err ?: -EINVAL;
}
if (env->subprog_cnt > 1 && env->prog->aux->tail_call_reachable) {
/* When JIT fails the progs with bpf2bpf calls and tail_calls
* have to be rejected, since interpreter doesn't support them
yet.
*/
verbose(env, "tail_calls are not allowed in non-JITed programs
with bpf-to-bpf calls\n");
- return -EINVAL;
+ return err ?: -EINVAL;
}
for (i = 0; i < prog->len; i++, insn++) {
if (bpf_pseudo_func(insn)) {
@@ -19732,7 +19732,7 @@ static int fixup_call_args(struct bpf_verifier_env *env)
* have to be rejected, since interpreter doesn't
support them yet.
*/
verbose(env, "callbacks are not allowed in non-JITed
programs\n");
- return -EINVAL;
+ return err ?: -EINVAL;
}
if (!bpf_pseudo_call(insn))
--
2.43.0