From: Yuan Chen <[email protected]>

bpf_object__probe_loading() tries to load trivial SOCKET_FILTER and
TRACEPOINT programs to verify the BPF environment works.  When a
BPF token is in use with restricted program type permissions, these
probe loads may fail because the token does not allow the specific
program types, even though BPF loading is perfectly functional.

Fix by skipping the probe when a token FD is present: BPF token
creation itself proves the kernel has a working BPF subsystem.
Real BPF issues will be caught during actual program and map loading.

Signed-off-by: Yuan Chen <[email protected]>
---
 tools/lib/bpf/libbpf.c | 10 +++-------
 1 file changed, 3 insertions(+), 7 deletions(-)

diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c
index ab2071fdd3e8..7e21c5eb9533 100644
--- a/tools/lib/bpf/libbpf.c
+++ b/tools/lib/bpf/libbpf.c
@@ -5167,12 +5167,8 @@ bpf_object__probe_loading(struct bpf_object *obj)
                BPF_EXIT_INSN(),
        };
        int ret, insn_cnt = ARRAY_SIZE(insns);
-       LIBBPF_OPTS(bpf_prog_load_opts, opts,
-               .token_fd = obj->token_fd,
-               .prog_flags = obj->token_fd ? BPF_F_TOKEN_FD : 0,
-       );
 
-       if (obj->gen_loader)
+       if (obj->gen_loader || obj->token_fd)
                return 0;
 
        ret = bump_rlimit_memlock();
@@ -5181,9 +5177,9 @@ bpf_object__probe_loading(struct bpf_object *obj)
                        errstr(ret));
 
        /* make sure basic loading works */
-       ret = bpf_prog_load(BPF_PROG_TYPE_SOCKET_FILTER, NULL, "GPL", insns, 
insn_cnt, &opts);
+       ret = bpf_prog_load(BPF_PROG_TYPE_SOCKET_FILTER, NULL, "GPL", insns, 
insn_cnt, NULL);
        if (ret < 0)
-               ret = bpf_prog_load(BPF_PROG_TYPE_TRACEPOINT, NULL, "GPL", 
insns, insn_cnt, &opts);
+               ret = bpf_prog_load(BPF_PROG_TYPE_TRACEPOINT, NULL, "GPL", 
insns, insn_cnt, NULL);
        if (ret < 0) {
                ret = errno;
                pr_warn("Error in %s(): %s. Couldn't load trivial BPF program. 
Make sure your kernel supports BPF (CONFIG_BPF_SYSCALL=y) and/or that 
RLIMIT_MEMLOCK is set to big enough value.\n",
-- 
2.54.0


Reply via email to