Have you considered using GCC's __attribute__((optimize("O2"))) attribute. It seems like Clang doesn't have support for something like that, but we'll still have this covered in BPF CI for GCC-built selftests. Then I'd just add this as another subtest to existing usdt tests.
Can you please try that?
Done
Is semaphore essential to this test?
It's no essential. I've already removed it in the new patch.
At 2025-08-14 08:04:35, "Andrii Nakryiko" andrii.nakryiko@gmail.com wrote:
On Wed, Aug 6, 2025 at 7:35 PM Jiawei Zhao phoenix500526@163.com wrote:
When using GCC on x86-64 to compile an usdt prog with -O1 or higher optimization, the compiler will generate SIB addressing mode for global array and PC-relative addressing mode for global variable, e.g. "1@-96(%rbp,%rax,8)" and "-1@4+t1(%rip)".
In this patch:
- add usdt_o2 test case to cover SIB addressing usdt argument spec handling logic
Signed-off-by: Jiawei Zhao phoenix500526@163.com
tools/testing/selftests/bpf/Makefile | 8 +++ .../selftests/bpf/prog_tests/usdt_o2.c | 71 +++++++++++++++++++ .../selftests/bpf/progs/test_usdt_o2.c | 37 ++++++++++ 3 files changed, 116 insertions(+) create mode 100644 tools/testing/selftests/bpf/prog_tests/usdt_o2.c create mode 100644 tools/testing/selftests/bpf/progs/test_usdt_o2.c
diff --git a/tools/testing/selftests/bpf/Makefile b/tools/testing/selftests/bpf/Makefile index 910d8d6402ef..68cf6a9cf05f 100644 --- a/tools/testing/selftests/bpf/Makefile +++ b/tools/testing/selftests/bpf/Makefile @@ -759,6 +759,14 @@ TRUNNER_BPF_BUILD_RULE := $$(error no BPF objects should be built) TRUNNER_BPF_CFLAGS := $(eval $(call DEFINE_TEST_RUNNER,test_maps))
+# Use -O2 optimization to generate SIB addressing usdt argument spec +# Only apply on x86 architecture where SIB addressing is relevant +ifeq ($(ARCH), x86) +$(OUTPUT)/usdt_o2.test.o: CFLAGS:=$(subst O0,O2,$(CFLAGS)) +$(OUTPUT)/cpuv4/usdt_o2.test.o: CFLAGS:=$(subst O0,O2,$(CFLAGS)) +$(OUTPUT)/no_alu32/usdt_o2.test.o: CFLAGS:=$(subst O0,O2,$(CFLAGS)) +endif
Have you considered using GCC's __attribute__((optimize("O2"))) attribute. It seems like Clang doesn't have support for something like that, but we'll still have this covered in BPF CI for GCC-built selftests. Then I'd just add this as another subtest to existing usdt tests.
Can you please try that?
# Define test_verifier test runner. # It is much simpler than test_maps/test_progs and sufficiently different from # them (e.g., test.h is using completely pattern), that it's worth just diff --git a/tools/testing/selftests/bpf/prog_tests/usdt_o2.c b/tools/testing/selftests/bpf/prog_tests/usdt_o2.c new file mode 100644 index 000000000000..f04b756b3640 --- /dev/null +++ b/tools/testing/selftests/bpf/prog_tests/usdt_o2.c @@ -0,0 +1,71 @@ +// SPDX-License-Identifier: GPL-2.0 +/* Copyright (c) 2025 Jiawei Zhao phoenix500526@163.com. */ +#include <test_progs.h>
+#define _SDT_HAS_SEMAPHORES 1 +#include "../sdt.h" +#include "test_usdt_o2.skel.h"
+int lets_test_this(int);
+#define test_value 0xFEDCBA9876543210ULL +#define SEC(name) __attribute__((section(name), used))
+static volatile __u64 array[1] = {test_value}; +unsigned short test_usdt1_semaphore SEC(".probes");
Is semaphore essential to this test?
+static __always_inline void trigger_func(void) +{
/* Base address + offset + (index * scale) */
if (test_usdt1_semaphore) {
for (volatile int i = 0; i <= 0; i++)
STAP_PROBE1(test, usdt1, array[i]);
}
+}
[...]