linux/tools/lib/bpf
D. Wythe 3b6a86058e libbpf: Fix error when st-prefix_ops and ops from differ btf
[ Upstream commit 0cc114dc35 ]

When a module registers a struct_ops, the struct_ops type and its
corresponding map_value type ("bpf_struct_ops_") may reside in different
btf objects, here are four possible case:

+--------+---------------+-------------+---------------------------------+
|        |bpf_struct_ops_| xxx_ops     |                                 |
+--------+---------------+-------------+---------------------------------+
| case 0 | btf_vmlinux   | btf_vmlinux | be used and reg only in vmlinux |
+--------+---------------+-------------+---------------------------------+
| case 1 | btf_vmlinux   | mod_btf     | INVALID                         |
+--------+---------------+-------------+---------------------------------+
| case 2 | mod_btf       | btf_vmlinux | reg in mod but be used both in  |
|        |               |             | vmlinux and mod.                |
+--------+---------------+-------------+---------------------------------+
| case 3 | mod_btf       | mod_btf     | be used and reg only in mod     |
+--------+---------------+-------------+---------------------------------+

Currently we figure out the mod_btf by searching with the struct_ops type,
which makes it impossible to figure out the mod_btf when the struct_ops
type is in btf_vmlinux while it's corresponding map_value type is in
mod_btf (case 2).

The fix is to use the corresponding map_value type ("bpf_struct_ops_")
as the lookup anchor instead of the struct_ops type to figure out the
`btf` and `mod_btf` via find_ksym_btf_id(), and then we can locate
the kern_type_id via btf__find_by_name_kind() with the `btf` we just
obtained from find_ksym_btf_id().

With this change the lookup obtains the correct btf and mod_btf for case 2,
preserves correct behavior for other valid cases, and still fails as
expected for the invalid scenario (case 1).

Fixes: 590a008882 ("bpf: libbpf: Add STRUCT_OPS support")
Signed-off-by: D. Wythe <alibuda@linux.alibaba.com>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Acked-by: Andrii Nakryiko <andrii@kernel.org>
Acked-by: Martin KaFai Lau <martin.lau@kernel.org>
Link: https://lore.kernel.org/bpf/20250926071751.108293-1-alibuda@linux.alibaba.com
Signed-off-by: Sasha Levin <sashal@kernel.org>
History 2025-10-15 12:03:38 +02:00
..
.gitignore tools build: Correct bpf fixdep dependencies 2024-08-05 12:19:48 -03:00
bpf.c libbpf: Introduce bpf_prog_stream_read() API 2025-07-03 19:30:07 -07:00
bpf.h libbpf: Introduce bpf_prog_stream_read() API 2025-07-03 19:30:07 -07:00
bpf_core_read.h bpf: Fix uninitialized values in BPF_{CORE,PROBE}_READ 2025-05-05 14:20:28 -07:00
bpf_endian.h libbpf: Make bpf_endian co-exist with vmlinux.h 2020-07-01 09:06:12 +02:00
bpf_gen_internal.h libbpf: Support creating light skeleton of either endianness 2024-10-03 17:47:36 -07:00
bpf_helpers.h libbpf: __arg_untrusted in bpf_helpers.h 2025-07-07 08:25:07 -07:00
bpf_prog_linfo.c libbpf: Streamline error reporting for high-level APIs 2021-05-25 17:32:35 -07:00
bpf_tracing.h libbpf: Fix some typos in comments 2024-09-09 16:05:40 -07:00
btf.c libbpf: Handle unsupported mmap-based /sys/kernel/btf/vmlinux correctly 2025-06-06 14:07:07 -07:00
btf.h libbpf: Add support for printing BTF character arrays as strings 2025-06-05 13:45:16 -07:00
btf_dump.c Merge git://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf after rc3 2025-06-26 09:49:39 -07:00
btf_iter.c libbpf,bpf: Share BTF relocate-related code with kernel 2024-06-21 14:45:07 -07:00
btf_relocate.c libbpf: Fix incorrect traversal end type ID when marking BTF_IS_EMBEDDED 2025-01-16 15:34:18 -08:00
Build libbpf: Split field iter code into its own file kernel 2024-06-21 14:45:07 -07:00
elf.c libbpf: Stringify errno in log messages in the remaining code 2024-11-11 20:29:45 -08:00
features.c libbpf: Stringify errno in log messages in the remaining code 2024-11-11 20:29:45 -08:00
gen_loader.c libbpf: Stringify errno in log messages in the remaining code 2024-11-11 20:29:45 -08:00
hashmap.c libbpf: Hashmap interface update to allow both long and void* keys/values 2022-11-09 20:45:14 -08:00
hashmap.h libbpf: Fix possible compiler warnings in hashmap 2024-10-11 12:36:59 -07:00
libbpf.c libbpf: Fix error when st-prefix_ops and ops from differ btf 2025-10-15 12:03:38 +02:00
libbpf.h libbpf: Export bpf_object__prepare symbol 2025-10-15 12:03:20 +02:00
libbpf.map libbpf: start v1.7 dev cycle 2025-07-16 18:37:27 -07:00
libbpf.pc.template libbpf: Add zlib as a dependency in pkg-config template 2019-12-16 14:55:29 -08:00
libbpf_common.h libbpf: Fix potential uninitialized tail padding with LIBBPF_OPTS_RESET 2023-11-09 19:07:51 -08:00
libbpf_errno.c libbpf: Optimized return value in libbpf_strerror when errno is libbpf errno 2022-12-14 18:39:33 +01:00
libbpf_internal.h libbpf: Fix implicit memfd_create() for bionic 2025-04-04 08:52:37 -07:00
libbpf_legacy.h libbpf: Fix some typos in comments 2024-09-09 16:05:40 -07:00
libbpf_probes.c bpf: improve error message for unsupported helper 2024-03-28 18:30:53 -07:00
libbpf_version.h libbpf: start v1.7 dev cycle 2025-07-16 18:37:27 -07:00
linker.c libbpf: Use proper errno value in linker 2025-04-30 09:04:20 -07:00
Makefile tools: Remove redundant quiet setup 2025-02-18 16:27:43 -03:00
netlink.c libbpf: Support creating and destroying qdisc 2025-04-17 10:54:41 -07:00
nlattr.c libbpf: Use proper errno value in nlattr 2025-05-12 15:22:54 -07:00
nlattr.h libbpf: add API to get XDP/XSK supported features 2023-02-02 20:48:24 -08:00
relo_core.c libbpf: fix LDX/STX/ST CO-RE relocation size adjustment logic 2025-02-14 19:58:05 -08:00
relo_core.h bpf, libbpf: Add type match support 2022-07-05 21:14:25 -07:00
ringbuf.c libbpf: Stringify errno in log messages in the remaining code 2024-11-11 20:29:45 -08:00
skel_internal.h libbpf: Support creating light skeleton of either endianness 2024-10-03 17:47:36 -07:00
str_error.c libbpf: Add namespace for errstr making it libbpf_errstr 2025-03-21 13:44:54 -07:00
str_error.h libbpf: Add namespace for errstr making it libbpf_errstr 2025-03-21 13:44:54 -07:00
strset.c libbpf: Hashmap interface update to allow both long and void* keys/values 2022-11-09 20:45:14 -08:00
strset.h libbpf: Extract internal set-of-strings datastructure APIs 2021-03-18 16:14:22 -07:00
usdt.bpf.h libbpf: Implement bpf_usdt_arg_size BPF function 2025-02-26 08:59:44 -08:00
usdt.c libbpf: Correct some typos and syntax issues in usdt doc 2025-06-05 11:45:48 -07:00
zip.c libbpf: Remove unneeded semicolon 2024-10-03 17:47:35 -07:00
zip.h libbpf: Implement basic zip archive parsing support 2023-03-01 16:05:34 -08:00