On 6/16/25 1:33 AM, Jiri Olsa wrote:
On Sun, Jun 15, 2025 at 11:53:51AM -0700, Yonghong Song wrote:
SNIP
There are total 301 locations for usdt_300. For gcc11 built binary, there are
300 spec's. But for clang20 built binary, there are 3 spec's. The libbpf default
BPF_USDT_MAX_SPEC_CNT is 256. So for gcc11, the above bpf_program__attach_usdt() will
fail, but the function will succeed for clang20.
Note that we cannot just change BPF_USDT_MAX_SPEC_CNT from 256 to 2 (through overwriting
BPF_USDT_MAX_SPEC_CNT before usdt.bpf.h) since it will cause other test failures.
We cannot just set BPF_USDT_MAX_SPEC_CNT to 2 for test_usdt_multispec.c since we
have below in the Makefile:
test_usdt.skel.h-deps := test_usdt.bpf.o test_usdt_multispec.bpf.o
and the linker will enforce that BPF_USDT_MAX_SPEC_CNT values for both progs must
be the same.
The refactoring does not change existing test result. But the future change will
allow to set BPF_USDT_MAX_SPEC_CNT to be 2 for arm64/clang20 case, which will have
the same attachment failure as in gcc11.
Signed-off-by: Yonghong Song <yonghong.song@xxxxxxxxx>
---
tools/testing/selftests/bpf/prog_tests/usdt.c | 35 +++++++++++++------
1 file changed, 25 insertions(+), 10 deletions(-)
diff --git a/tools/testing/selftests/bpf/prog_tests/usdt.c b/tools/testing/selftests/bpf/prog_tests/usdt.c
index 495d66414b57..dc29ef94312a 100644
--- a/tools/testing/selftests/bpf/prog_tests/usdt.c
+++ b/tools/testing/selftests/bpf/prog_tests/usdt.c
@@ -270,18 +270,8 @@ static void subtest_multispec_usdt(void)
*/
trigger_300_usdts();
should above line (plus the comment) ...
- /* we'll reuse usdt_100 BPF program for usdt_300 test */
bpf_link__destroy(skel->links.usdt_100);
- skel->links.usdt_100 = bpf_program__attach_usdt(skel->progs.usdt_100, -1, "/proc/self/exe",
- "test", "usdt_300", NULL);
- err = -errno;
- if (!ASSERT_ERR_PTR(skel->links.usdt_100, "usdt_300_bad_attach"))
- goto cleanup;
- ASSERT_EQ(err, -E2BIG, "usdt_300_attach_err");
- /* let's check that there are no "dangling" BPF programs attached due
- * to partial success of the above test:usdt_300 attachment
- */
... and the code below (up to usdt_301_sum assert)
go to the new subtest_multispec_fail_usdt test as well?
Indeed, I need to move more codes related to usdt test/usdt_300 to
subtest_multispec_fail_usdt().
The following code
skel->bss->usdt_100_called = 0;
skel->bss->usdt_100_sum = 0;
should remain in function subtest_multispec_usdt() as it is needed
for test/usdt_400 usdt testing which also used usdt_100 prog.
jirka
bss->usdt_100_called = 0;
bss->usdt_100_sum = 0;
@@ -312,6 +302,29 @@ static void subtest_multispec_usdt(void)
test_usdt__destroy(skel);
}
+static void subtest_multispec_fail_usdt(void)
+{
+ LIBBPF_OPTS(bpf_usdt_opts, opts);
+ struct test_usdt *skel;
+ int err;
+
+ skel = test_usdt__open_and_load();
+ if (!ASSERT_OK_PTR(skel, "skel_open"))
+ return;
+
+ skel->bss->my_pid = getpid();
+
+ skel->links.usdt_100 = bpf_program__attach_usdt(skel->progs.usdt_100, -1, "/proc/self/exe",
+ "test", "usdt_300", NULL);
+ err = -errno;
+ if (!ASSERT_ERR_PTR(skel->links.usdt_100, "usdt_300_bad_attach"))
+ goto cleanup;
+ ASSERT_EQ(err, -E2BIG, "usdt_300_attach_err");
+
+cleanup:
+ test_usdt__destroy(skel);
+}
+
[...]