Tweak struct_ops related APIs to allow the following features: - specify version suffixes for stuct_ops map types; - share same BPF program between several map definitions with different local BTF types, assuming only maps with same kernel BTF type would be selected for load; - toggle autocreate flag for struct_ops maps; - automatically toggle autoload for struct_ops programs referenced from struct_ops maps, depending on autocreate status of the corresponding map; - use SEC("?.struct_ops") and SEC("?.struct_ops.link") to define struct_ops maps with autocreate == false after object open. This would allow loading programs like below: SEC("struct_ops/foo") int BPF_PROG(foo) { ... } SEC("struct_ops/bar") int BPF_PROG(bar) { ... } struct bpf_testmod_ops___v1 { int (*foo)(void); }; struct bpf_testmod_ops___v2 { int (*foo)(void); int (*bar)(void); }; /* Assume kernel type name to be 'test_ops' */ SEC(".struct_ops.link") struct test_ops___v1 map_v1 = { /* Program 'foo' shared by maps with * different local BTF type */ .foo = (void *)foo }; SEC(".struct_ops.link") struct test_ops___v2 map_v2 = { .foo = (void *)foo, .bar = (void *)bar }; Assuming the following tweaks are done before loading: /* to load v1 */ bpf_map__set_autocreate(skel->maps.map_v1, true); bpf_map__set_autocreate(skel->maps.map_v2, false); /* to load v2 */ bpf_map__set_autocreate(skel->maps.map_v1, false); bpf_map__set_autocreate(skel->maps.map_v2, true); Patch #8 ties autocreate and autoload flags for struct_ops maps and programs. Changelog: - v2 [2] -> v3: - moved patch #8 logic to be fully done on load (requested by Andrii in offlist discussion); - in patch #9 added test case for shadow vars and autocreate/autoload interaction. - v1 [1] -> v2: - fixed memory leak in patch #1 (Kui-Feng); - improved error messages in patch #2 (Martin, Andrii); - in bad_struct_ops selftest from patch #6 added .test_2 map member setup (David); - added utility functions to capture libbpf log from selftests (David) - in selftests replaced usage of ...__open_and_load by separate calls to ..._open() and ..._load() (Andrii); - removed serial_... in selftest definitions (Andrii); - improved comments in selftest struct_ops_autocreate from patch #7 (David); - removed autoload toggling logic incompatible with shadow variables from bpf_map__set_autocreate(), instead struct_ops programs autoload property is computed at struct_ops maps load phase, see patch #8 (Kui-Feng, Martin, Andrii); - added support for SEC("?.struct_ops") and SEC("?.struct_ops.link") (Andrii). [1] https://lore.kernel.org/bpf/20240227204556.17524-1-eddyz87@xxxxxxxxx/ [2] https://lore.kernel.org/bpf/20240302011920.15302-1-eddyz87@xxxxxxxxx/ Eduard Zingerman (15): libbpf: allow version suffixes (___smth) for struct_ops types libbpf: tie struct_ops programs to kernel BTF ids, not to local ids libbpf: honor autocreate flag for struct_ops maps selftests/bpf: test struct_ops map definition with type suffix selftests/bpf: utility functions to capture libbpf log in test_progs selftests/bpf: bad_struct_ops test selftests/bpf: test autocreate behavior for struct_ops maps libbpf: sync progs autoload with maps autocreate for struct_ops maps selftests/bpf: verify struct_ops autoload/autocreate sync libbpf: replace elf_state->st_ops_* fields with SEC_ST_OPS sec_type libbpf: struct_ops in SEC("?.struct_ops") and SEC("?.struct_ops.link") libbpf: rewrite btf datasec names starting from '?' selftests/bpf: test case for SEC("?.struct_ops") bpf: allow '?' at the beginning of DATASEC names selftests/bpf: test cases for '?' in BTF names kernel/bpf/btf.c | 17 +- tools/lib/bpf/features.c | 22 ++ tools/lib/bpf/libbpf.c | 214 +++++++++++++----- tools/lib/bpf/libbpf_internal.h | 2 + .../selftests/bpf/bpf_testmod/bpf_testmod.c | 25 ++ .../selftests/bpf/bpf_testmod/bpf_testmod.h | 4 + .../selftests/bpf/prog_tests/bad_struct_ops.c | 67 ++++++ tools/testing/selftests/bpf/prog_tests/btf.c | 46 ++++ .../bpf/prog_tests/struct_ops_autocreate.c | 157 +++++++++++++ .../bpf/prog_tests/test_struct_ops_module.c | 33 ++- .../selftests/bpf/progs/bad_struct_ops.c | 25 ++ .../selftests/bpf/progs/bad_struct_ops2.c | 14 ++ .../bpf/progs/struct_ops_autocreate.c | 52 +++++ .../bpf/progs/struct_ops_autocreate2.c | 32 +++ .../selftests/bpf/progs/struct_ops_module.c | 21 +- tools/testing/selftests/bpf/test_progs.c | 57 +++++ tools/testing/selftests/bpf/test_progs.h | 3 + 17 files changed, 717 insertions(+), 74 deletions(-) create mode 100644 tools/testing/selftests/bpf/prog_tests/bad_struct_ops.c create mode 100644 tools/testing/selftests/bpf/prog_tests/struct_ops_autocreate.c create mode 100644 tools/testing/selftests/bpf/progs/bad_struct_ops.c create mode 100644 tools/testing/selftests/bpf/progs/bad_struct_ops2.c create mode 100644 tools/testing/selftests/bpf/progs/struct_ops_autocreate.c create mode 100644 tools/testing/selftests/bpf/progs/struct_ops_autocreate2.c -- 2.43.0