On Mon, Feb 10, 2025 at 01:59:44PM +0800, Tao Chen wrote: SNIP > diff --git a/tools/lib/bpf/libbpf_probes.c b/tools/lib/bpf/libbpf_probes.c > index e142130cb83c..53f1196394bf 100644 > --- a/tools/lib/bpf/libbpf_probes.c > +++ b/tools/lib/bpf/libbpf_probes.c > @@ -433,6 +433,54 @@ static bool can_probe_prog_type(enum bpf_prog_type prog_type) > return true; > } > > +int libbpf_probe_bpf_kfunc(enum bpf_prog_type prog_type, int kfunc_id, int btf_fd, > + const void *opts) > +{ > + struct bpf_insn insns[] = { > + BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, BPF_PSEUDO_KFUNC_CALL, 1, kfunc_id), > + BPF_EXIT_INSN(), > + }; > + const size_t insn_cnt = ARRAY_SIZE(insns); > + char buf[4096]; > + int fd_array[2] = {-1}; > + int ret; > + > + if (opts) > + return libbpf_err(-EINVAL); > + > + if (!can_probe_prog_type(prog_type)) > + return -EOPNOTSUPP; > + > + if (btf_fd >= 0) { > + fd_array[1] = btf_fd; > + } else if (btf_fd == -1) { > + /* insn.off = 0, means vmlinux btf */ > + insns[0].off = 0; > + } else { > + return libbpf_err(-EINVAL); > + } > + > + buf[0] = '\0'; > + ret = probe_prog_load(prog_type, insns, insn_cnt, btf_fd >= 0 ? fd_array : NULL, > + 0, buf, sizeof(buf)); hum, you pass fd_array_cnt as 0, which IIUC will work properly but I guess then we don't need to have fd_array_cnt argument in probe_prog_load if all callers pass 0 ? jirka > + if (ret < 0) > + return libbpf_err(ret); > + > + /* If BPF verifier recognizes BPF kfunc but it's not supported for > + * given BPF program type, it will emit "calling kernel function > + * bpf_cpumask_create is not allowed", if the kfunc id is invalid, > + * it will emit "kernel btf_id 4294967295 is not a function". If btf fd > + * invalid in module btf, it will emit "invalid module BTF fd specified" or > + * "negative offset disallowed for kernel module function call" > + */ > + if (ret == 0 && (strstr(buf, "not allowed") || strstr(buf, "not a function") || > + (strstr(buf, "invalid module BTF fd")) || > + (strstr(buf, "negative offset disallowed")))) > + return 0; > + > + return 1; /* assume supported */ > +} > + > int libbpf_probe_bpf_helper(enum bpf_prog_type prog_type, enum bpf_func_id helper_id, > const void *opts) > { > -- > 2.43.0 >