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


Reply via email to