[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <aMSG-N9MiySZX6UQ@krava>
Date: Fri, 12 Sep 2025 22:47:52 +0200
From: Jiri Olsa <olsajiri@...il.com>
To: Stephen Rothwell <sfr@...b.auug.org.au>
Cc: Thomas Gleixner <tglx@...utronix.de>, Ingo Molnar <mingo@...nel.org>,
"H. Peter Anvin" <hpa@...or.com>,
Peter Zijlstra <peterz@...radead.org>,
Daniel Borkmann <daniel@...earbox.net>,
Alexei Starovoitov <ast@...nel.org>,
Andrii Nakryiko <andrii@...nel.org>,
Jiawei Zhao <phoenix500526@....com>, bpf <bpf@...r.kernel.org>,
Networking <netdev@...r.kernel.org>,
Linux Kernel Mailing List <linux-kernel@...r.kernel.org>,
Linux Next Mailing List <linux-next@...r.kernel.org>
Subject: Re: linux-next: manual merge of the tip tree with the bpf-next tree
On Fri, Sep 12, 2025 at 12:40:59PM +1000, Stephen Rothwell wrote:
> Hi all,
>
> Today's linux-next merge of the tip tree got a conflict in:
>
> tools/testing/selftests/bpf/prog_tests/usdt.c
>
> between commit:
>
> 69424097ee10 ("selftests/bpf: Enrich subtest_basic_usdt case in selftests to cover SIB handling logic")
>
> from the bpf-next tree and commit:
>
> 875e1705ad99 ("selftests/bpf: Add optimized usdt variant for basic usdt test")
>
> from the tip tree.
>
> I fixed it up (see below) and can carry the fix as necessary. This
> is now fixed as far as linux-next is concerned, but any non trivial
> conflicts should be mentioned to your upstream maintainer when your tree
> is submitted for merging. You may also want to consider cooperating
> with the maintainer of the conflicting tree to minimise any particularly
> complex conflicts.
hi,
fwiw the conflict was mentioned in here:
https://lore.kernel.org/bpf/aMAiMrLlfmG9FbQ3@krava/
the fix looks good, thanks
jirka
>
> --
> Cheers,
> Stephen Rothwell
>
> diff --cc tools/testing/selftests/bpf/prog_tests/usdt.c
> index 615e9c3e93bf,833eb87483a1..000000000000
> --- a/tools/testing/selftests/bpf/prog_tests/usdt.c
> +++ b/tools/testing/selftests/bpf/prog_tests/usdt.c
> @@@ -40,73 -40,20 +40,80 @@@ static void __always_inline trigger_fun
> }
> }
>
> +#if defined(__x86_64__) || defined(__i386__)
> +/*
> + * SIB (Scale-Index-Base) addressing format: "size@(base_reg, index_reg, scale)"
> + * - 'size' is the size in bytes of the array element, and its sign indicates
> + * whether the type is signed (negative) or unsigned (positive).
> + * - 'base_reg' is the register holding the base address, normally rdx or edx
> + * - 'index_reg' is the register holding the index, normally rax or eax
> + * - 'scale' is the scaling factor (typically 1, 2, 4, or 8), which matches the
> + * size of the element type.
> + *
> + * For example, for an array of 'short' (signed 2-byte elements), the SIB spec would be:
> + * - size: -2 (negative because 'short' is signed)
> + * - scale: 2 (since sizeof(short) == 2)
> + *
> + * The resulting SIB format: "-2@(%%rdx,%%rax,2)" for x86_64, "-2@(%%edx,%%eax,2)" for i386
> + */
> +static volatile short array[] = {-1, -2, -3, -4};
> +
> +#if defined(__x86_64__)
> +#define USDT_SIB_ARG_SPEC -2@(%%rdx,%%rax,2)
> +#else
> +#define USDT_SIB_ARG_SPEC -2@(%%edx,%%eax,2)
> +#endif
> +
> +unsigned short test_usdt_sib_semaphore SEC(".probes");
> +
> +static void trigger_sib_spec(void)
> +{
> + /*
> + * Force SIB addressing with inline assembly.
> + *
> + * You must compile with -std=gnu99 or -std=c99 to use the
> + * STAP_PROBE_ASM macro.
> + *
> + * The STAP_PROBE_ASM macro generates a quoted string that gets
> + * inserted between the surrounding assembly instructions. In this
> + * case, USDT_SIB_ARG_SPEC is embedded directly into the instruction
> + * stream, creating a probe point between the asm statement boundaries.
> + * It works fine with gcc/clang.
> + *
> + * Register constraints:
> + * - "d"(array): Binds the 'array' variable to %rdx or %edx register
> + * - "a"(0): Binds the constant 0 to %rax or %eax register
> + * These ensure that when USDT_SIB_ARG_SPEC references %%rdx(%edx) and
> + * %%rax(%eax), they contain the expected values for SIB addressing.
> + *
> + * The "memory" clobber prevents the compiler from reordering memory
> + * accesses around the probe point, ensuring that the probe behavior
> + * is predictable and consistent.
> + */
> + asm volatile(
> + STAP_PROBE_ASM(test, usdt_sib, USDT_SIB_ARG_SPEC)
> + :
> + : "d"(array), "a"(0)
> + : "memory"
> + );
> +}
> +#endif
> +
> - static void subtest_basic_usdt(void)
> + static void subtest_basic_usdt(bool optimized)
> {
> LIBBPF_OPTS(bpf_usdt_opts, opts);
> struct test_usdt *skel;
> struct test_usdt__bss *bss;
> - int err, i;
> + int err, i, called;
> + const __u64 expected_cookie = 0xcafedeadbeeffeed;
>
> + #define TRIGGER(x) ({ \
> + trigger_func(x); \
> + if (optimized) \
> + trigger_func(x); \
> + optimized ? 2 : 1; \
> + })
> +
> skel = test_usdt__open_and_load();
> if (!ASSERT_OK_PTR(skel, "skel_open"))
> return;
> @@@ -126,22 -73,13 +133,22 @@@
> if (!ASSERT_OK_PTR(skel->links.usdt0, "usdt0_link"))
> goto cleanup;
>
> +#if defined(__x86_64__) || defined(__i386__)
> + opts.usdt_cookie = expected_cookie;
> + skel->links.usdt_sib = bpf_program__attach_usdt(skel->progs.usdt_sib,
> + 0 /*self*/, "/proc/self/exe",
> + "test", "usdt_sib", &opts);
> + if (!ASSERT_OK_PTR(skel->links.usdt_sib, "usdt_sib_link"))
> + goto cleanup;
> +#endif
> +
> - trigger_func(1);
> + called = TRIGGER(1);
>
> - ASSERT_EQ(bss->usdt0_called, 1, "usdt0_called");
> - ASSERT_EQ(bss->usdt3_called, 1, "usdt3_called");
> - ASSERT_EQ(bss->usdt12_called, 1, "usdt12_called");
> + ASSERT_EQ(bss->usdt0_called, called, "usdt0_called");
> + ASSERT_EQ(bss->usdt3_called, called, "usdt3_called");
> + ASSERT_EQ(bss->usdt12_called, called, "usdt12_called");
>
> - ASSERT_EQ(bss->usdt0_cookie, 0xcafedeadbeeffeed, "usdt0_cookie");
> + ASSERT_EQ(bss->usdt0_cookie, expected_cookie, "usdt0_cookie");
> ASSERT_EQ(bss->usdt0_arg_cnt, 0, "usdt0_arg_cnt");
> ASSERT_EQ(bss->usdt0_arg_ret, -ENOENT, "usdt0_arg_ret");
> ASSERT_EQ(bss->usdt0_arg_size, -ENOENT, "usdt0_arg_size");
> @@@ -225,18 -163,9 +232,19 @@@
> ASSERT_EQ(bss->usdt3_args[1], 42, "usdt3_arg2");
> ASSERT_EQ(bss->usdt3_args[2], (uintptr_t)&bla, "usdt3_arg3");
>
> +#if defined(__x86_64__) || defined(__i386__)
> + trigger_sib_spec();
> + ASSERT_EQ(bss->usdt_sib_called, 1, "usdt_sib_called");
> + ASSERT_EQ(bss->usdt_sib_cookie, expected_cookie, "usdt_sib_cookie");
> + ASSERT_EQ(bss->usdt_sib_arg_cnt, 1, "usdt_sib_arg_cnt");
> + ASSERT_EQ(bss->usdt_sib_arg, nums[0], "usdt_sib_arg");
> + ASSERT_EQ(bss->usdt_sib_arg_ret, 0, "usdt_sib_arg_ret");
> + ASSERT_EQ(bss->usdt_sib_arg_size, sizeof(nums[0]), "usdt_sib_arg_size");
> +#endif
> +
> cleanup:
> test_usdt__destroy(skel);
> + #undef TRIGGER
> }
>
> unsigned short test_usdt_100_semaphore SEC(".probes");
Powered by blists - more mailing lists