ebpf: what causes BPF_LINK_CREATE return EINVAL

51 views Asked by At

I have the following eBPF program

# other prog1 ...

# other prog2 ...

SEC("kretprobe/fuse_allow_current_process")
int handle_fuse_allow_current_process(struct pt_regs *ctx)
{   
    bpf_override_return(ctx, 1);
    return 0;
}

# other prog3 ...

then i use bpftool to generate the skeleton file for build. when lauch my_test_exe, every work fine except prog handle_fuse_allow_current_process load failed.

i get some log with strace -f -ebpf my_test

....
bpf(BPF_PROG_LOAD, {prog_type=BPF_PROG_TYPE_TRACEPOINT, insn_cnt=6, insns=0x7fff67c86060, license="GPL", log_level=0, log_size=0, log_buf=NULL, kern_version=KERNEL_VERSION(0, 0, 0), prog_flags=0, prog_name="", prog_ifindex=0, expected_attach_type=BPF_CGROUP_INET_INGRESS, prog_btf_fd=0, func_info_rec_size=0, func_info=NULL, func_info_cnt=0, line_info_rec_size=0, line_info=NULL, line_info_cnt=0, attach_btf_id=0, attach_prog_fd=0, fd_array=NULL}, 144) = 19
bpf(BPF_PROG_LOAD, {prog_type=BPF_PROG_TYPE_TRACEPOINT, insn_cnt=138, insns=0x1ef0e30, license="GPL", log_level=0, log_size=0, log_buf=NULL, kern_version=KERNEL_VERSION(6, 2, 13), prog_flags=0, prog_name="handle_getdents", prog_ifindex=0, expected_attach_type=BPF_CGROUP_INET_INGRESS, prog_btf_fd=3, func_info_rec_size=8, func_info=0x1f009a0, func_info_cnt=1, line_info_rec_size=16, line_info=0x1eeec10, line_info_cnt=55, attach_btf_id=0, attach_prog_fd=0, fd_array=NULL}, 144) = 19
bpf(BPF_MAP_CREATE, {map_type=BPF_MAP_TYPE_ARRAY, key_size=4, value_size=32, max_entries=1, map_flags=0, inner_map_fd=0, map_name="", map_ifindex=0, btf_fd=0, btf_key_type_id=0, btf_value_type_id=0, btf_vmlinux_value_type_id=0, map_extra=0}, 72) = 20
bpf(BPF_PROG_LOAD, {prog_type=BPF_PROG_TYPE_SOCKET_FILTER, insn_cnt=2, insns=0x7fff67c856b0, license="GPL", log_level=0, log_size=0, log_buf=NULL, kern_version=KERNEL_VERSION(0, 0, 0), prog_flags=0, prog_name="", prog_ifindex=0, expected_attach_type=BPF_CGROUP_INET_INGRESS, prog_btf_fd=0, func_info_rec_size=0, func_info=NULL, func_info_cnt=0, line_info_rec_size=0, line_info=NULL, line_info_cnt=0, attach_btf_id=0, attach_prog_fd=0, fd_array=NULL}, 144) = 21
bpf(BPF_PROG_BIND_MAP, 0x7fff67c85600, 144) = 0
bpf(BPF_PROG_BIND_MAP, 0x7fff67c856e0, 144) = 0
bpf(BPF_PROG_BIND_MAP, 0x7fff67c856e0, 144) = 0
bpf(BPF_PROG_LOAD, {prog_type=BPF_PROG_TYPE_TRACEPOINT, insn_cnt=45, insns=0x1ef1480, license="GPL", log_level=0, log_size=0, log_buf=NULL, kern_version=KERNEL_VERSION(6, 2, 13), prog_flags=0, prog_name="tracepoint__sys", prog_ifindex=0, expected_attach_type=BPF_CGROUP_INET_INGRESS, prog_btf_fd=3, func_info_rec_size=8, func_info=0x1eee6e0, func_info_cnt=1, line_info_rec_size=16, line_info=0x1eeef90, line_info_cnt=21, attach_btf_id=0, attach_prog_fd=0, fd_array=NULL}, 144) = 20
bpf(BPF_PROG_BIND_MAP, 0x7fff67c856e0, 144) = 0
bpf(BPF_PROG_BIND_MAP, 0x7fff67c856e0, 144) = 0
bpf(BPF_PROG_LOAD, {prog_type=BPF_PROG_TYPE_TRACEPOINT, insn_cnt=28, insns=0x1ef18a0, license="GPL", log_level=0, log_size=0, log_buf=NULL, kern_version=KERNEL_VERSION(6, 2, 13), prog_flags=0, prog_name="tracepoint__sys", prog_ifindex=0, expected_attach_type=BPF_CGROUP_INET_INGRESS, prog_btf_fd=3, func_info_rec_size=8, func_info=0x1eee700, func_info_cnt=1, line_info_rec_size=16, line_info=0x1eef1f0, line_info_cnt=15, attach_btf_id=0, attach_prog_fd=0, fd_array=NULL}, 144) = 21
bpf(BPF_PROG_BIND_MAP, 0x7fff67c856e0, 144) = 0
bpf(BPF_PROG_BIND_MAP, 0x7fff67c856e0, 144) = 0
bpf(BPF_PROG_LOAD, {prog_type=BPF_PROG_TYPE_TRACEPOINT, insn_cnt=83, insns=0x1ef1cd0, license="GPL", log_level=0, log_size=0, log_buf=NULL, kern_version=KERNEL_VERSION(6, 2, 13), prog_flags=0, prog_name="sched_process_e", prog_ifindex=0, expected_attach_type=BPF_CGROUP_INET_INGRESS, prog_btf_fd=3, func_info_rec_size=8, func_info=0x1eeea10, func_info_cnt=1, line_info_rec_size=16, line_info=0x1eef2f0, line_info_cnt=31, attach_btf_id=0, attach_prog_fd=0, fd_array=NULL}, 144) = 22
bpf(BPF_PROG_BIND_MAP, 0x7fff67c856e0, 144) = 0
bpf(BPF_PROG_BIND_MAP, 0x7fff67c856e0, 144) = 0
bpf(BPF_PROG_LOAD, {prog_type=BPF_PROG_TYPE_TRACEPOINT, insn_cnt=116, insns=0x1ef2390, license="GPL", log_level=0, log_size=0, log_buf=NULL, kern_version=KERNEL_VERSION(6, 2, 13), prog_flags=0, prog_name="handle_sys_ente", prog_ifindex=0, expected_attach_type=BPF_CGROUP_INET_INGRESS, prog_btf_fd=3, func_info_rec_size=8, func_info=0x1eeea30, func_info_cnt=1, line_info_rec_size=16, line_info=0x1eef4f0, line_info_cnt=47, attach_btf_id=0, attach_prog_fd=0, fd_array=NULL}, 144) = 23
bpf(BPF_PROG_BIND_MAP, 0x7fff67c856e0, 144) = 0
bpf(BPF_PROG_BIND_MAP, 0x7fff67c856e0, 144) = 0
bpf(BPF_PROG_LOAD, {prog_type=BPF_PROG_TYPE_KPROBE, insn_cnt=4, insns=0x1ef2c30, license="GPL", log_level=0, log_size=0, log_buf=NULL, kern_version=KERNEL_VERSION(6, 2, 13), prog_flags=0, prog_name="handle_fuse_all", prog_ifindex=0, expected_attach_type=BPF_CGROUP_INET_INGRESS, prog_btf_fd=3, func_info_rec_size=8, func_info=0x1eeeaf0, func_info_cnt=1, line_info_rec_size=16, line_info=0x1eee320, line_info_cnt=2, attach_btf_id=0, attach_prog_fd=0, fd_array=NULL}, 144) = 24
bpf(BPF_PROG_BIND_MAP, 0x7fff67c856e0, 144) = 0
bpf(BPF_PROG_BIND_MAP, 0x7fff67c856e0, 144) = 0
bpf(BPF_PROG_LOAD, {prog_type=BPF_PROG_TYPE_KPROBE, insn_cnt=44, insns=0x1ef2780, license="GPL", log_level=0, log_size=0, log_buf=NULL, kern_version=KERNEL_VERSION(6, 2, 13), prog_flags=0, prog_name="handle_sys_kill", prog_ifindex=0, expected_attach_type=BPF_CGROUP_INET_INGRESS, prog_btf_fd=3, func_info_rec_size=8, func_info=0x1eeeb10, func_info_cnt=1, line_info_rec_size=16, line_info=0x1eef7f0, line_info_cnt=20, attach_btf_id=0, attach_prog_fd=0, fd_array=NULL}, 144) = 25
bpf(BPF_PROG_BIND_MAP, 0x7fff67c856e0, 144) = 0
bpf(BPF_PROG_BIND_MAP, 0x7fff67c856e0, 144) = 0
bpf(BPF_PROG_LOAD, {prog_type=BPF_PROG_TYPE_KPROBE, insn_cnt=221, insns=0x1ef3270, license="GPL", log_level=0, log_size=0, log_buf=NULL, kern_version=KERNEL_VERSION(6, 2, 13), prog_flags=0, prog_name="handle_do_sys_o", prog_ifindex=0, expected_attach_type=BPF_CGROUP_INET_INGRESS, prog_btf_fd=3, func_info_rec_size=8, func_info=0x1eee5f0, func_info_cnt=1, line_info_rec_size=16, line_info=0x1eef940, line_info_cnt=88, attach_btf_id=0, attach_prog_fd=0, fd_array=NULL}, 144) = 26
bpf(BPF_PROG_BIND_MAP, 0x7fff67c856e0, 144) = 0
bpf(BPF_PROG_BIND_MAP, 0x7fff67c856e0, 144) = 0
bpf(BPF_PROG_LOAD, {prog_type=BPF_PROG_TYPE_KPROBE, insn_cnt=37, insns=0x1eea120, license="GPL", log_level=0, log_size=0, log_buf=NULL, kern_version=KERNEL_VERSION(6, 2, 13), prog_flags=0, prog_name="handle_do_sys_o", prog_ifindex=0, expected_attach_type=BPF_CGROUP_INET_INGRESS, prog_btf_fd=3, func_info_rec_size=8, func_info=0x1eee5d0, func_info_cnt=1, line_info_rec_size=16, line_info=0x1eefed0, line_info_cnt=19, attach_btf_id=0, attach_prog_fd=0, fd_array=NULL}, 144) = 27
bpf(BPF_PROG_BIND_MAP, 0x7fff67c856e0, 144) = 0
bpf(BPF_PROG_BIND_MAP, 0x7fff67c856e0, 144) = 0
bpf(BPF_PROG_LOAD, {prog_type=BPF_PROG_TYPE_TRACEPOINT, insn_cnt=163, insns=0x1ef2c60, license="GPL", log_level=0, log_size=0, log_buf=NULL, kern_version=KERNEL_VERSION(6, 2, 13), prog_flags=0, prog_name="handle_getdents", prog_ifindex=0, expected_attach_type=BPF_CGROUP_INET_INGRESS, prog_btf_fd=3, func_info_rec_size=8, func_info=0x1eee5b0, func_info_cnt=1, line_info_rec_size=16, line_info=0x1ef0010, line_info_cnt=74, attach_btf_id=0, attach_prog_fd=0, fd_array=NULL}, 144) = 28
bpf(BPF_PROG_BIND_MAP, 0x7fff67c856e0, 144) = 0
bpf(BPF_PROG_BIND_MAP, 0x7fff67c856e0, 144) = 0
bpf(BPF_MAP_UPDATE_ELEM, {map_fd=4, key=0x7fff67c86168, value=0x7fff67c86170, flags=BPF_ANY}, 144) = 0
libbpf: map 'map_prog_array': slot [1] set to prog 'handle_getdents_exit' fd=19
bpf(BPF_PROG_LOAD, {prog_type=BPF_PROG_TYPE_TRACEPOINT, insn_cnt=2, insns=0x7fff67c85f60, license="GPL", log_level=0, log_size=0, log_buf=NULL, kern_version=KERNEL_VERSION(0, 0, 0), prog_flags=0, prog_name="", prog_ifindex=0, expected_attach_type=BPF_CGROUP_INET_INGRESS, prog_btf_fd=0, func_info_rec_size=0, func_info=NULL, func_info_cnt=0, line_info_rec_size=0, line_info=NULL, line_info_cnt=0, attach_btf_id=0, attach_prog_fd=0, fd_array=NULL}, 144) = 30
bpf(BPF_LINK_CREATE, {link_create={prog_fd=30, target_fd=-1, attach_type=BPF_PERF_EVENT, flags=0}}, 144) = -1 EBADF (Bad file descriptor)
bpf(BPF_LINK_CREATE, {link_create={prog_fd=19, target_fd=29, attach_type=BPF_PERF_EVENT, flags=0}}, 144) = 30
bpf(BPF_LINK_CREATE, {link_create={prog_fd=20, target_fd=31, attach_type=BPF_PERF_EVENT, flags=0}}, 144) = 32
bpf(BPF_LINK_CREATE, {link_create={prog_fd=21, target_fd=33, attach_type=BPF_PERF_EVENT, flags=0}}, 144) = 34
bpf(BPF_LINK_CREATE, {link_create={prog_fd=22, target_fd=35, attach_type=BPF_PERF_EVENT, flags=0}}, 144) = 36
bpf(BPF_LINK_CREATE, {link_create={prog_fd=23, target_fd=37, attach_type=BPF_PERF_EVENT, flags=0}}, 144) = 38
bpf(BPF_LINK_CREATE, {link_create={prog_fd=24, target_fd=39, attach_type=BPF_PERF_EVENT, flags=0}}, 144) = -1 EINVAL (Invalid argument)
libbpf: prog 'handle_fuse_allow_current_process': failed to create BPF link for perf_event FD 39: -22 (Invalid argument)
libbpf: prog 'handle_fuse_allow_current_process': failed to attach to kretprobe 'fuse_allow_current_process+0x0': Invalid argument
libbpf: prog 'handle_fuse_allow_current_process': failed to auto-attach: -22
Failed to attach BPF skeleton

  • my os environment:
# uname -a
Linux soulx-machine 6.2.0-26-generic #26~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Thu Jul 13 16:27:29 UTC 2 x86_64 x86_64 x86_64 GNU/Linux

# cat /etc/issue
Ubuntu 22.04.1 LTS \n \l

i don't know what cause bpf(BPF_LINK_CREATE...) EINVAL . How do I deal with this problem?

0

There are 0 answers