Linux Kernel Selftest development
 help / color / mirror / Atom feed
* [PATCH v3 1/2] selftests/bpf: filter by pid to avoid cross-test interference
@ 2026-03-06  8:33 Sun Jian
  2026-03-06  8:33 ` [PATCH v3 2/2] selftests/bpf: drop serial restriction Sun Jian
                   ` (2 more replies)
  0 siblings, 3 replies; 5+ messages in thread
From: Sun Jian @ 2026-03-06  8:33 UTC (permalink / raw)
  To: Andrii Nakryiko, Shuah Khan
  Cc: bpf, linux-kselftest, Alexei Starovoitov, Daniel Borkmann,
	Sun Jian

The test installs a kprobe on __sys_connect and checks that
bpf_probe_write_user() can modify the syscall argument. However, any
concurrent thread in any other test that calls connect() will also
trigger the kprobe and have its sockaddr silently overwritten, causing
flaky failures in unrelated tests.

Constrain the hook to the current test process by filtering on a PID
stored as a global variable in .bss. Initialize the .bss value from
user space before bpf_object__load() using bpf_map__set_initial_value(),
and validate the bss map value size to catch layout mismatches.

No new map is introduced and the test keeps the existing non-skeleton
flow.

Signed-off-by: Sun Jian <sun.jian.kdev@gmail.com>
---

v3:
- use ASSERT_*() instead of CHECK() for the new checks
- simplify patch subject as suggested by Andrii

 .../selftests/bpf/prog_tests/probe_user.c     | 26 ++++++++++++++++++-
 .../selftests/bpf/progs/test_probe_user.c     | 13 ++++++++--
 2 files changed, 36 insertions(+), 3 deletions(-)

diff --git a/tools/testing/selftests/bpf/prog_tests/probe_user.c b/tools/testing/selftests/bpf/prog_tests/probe_user.c
index 8721671321de..b3e17a329cb4 100644
--- a/tools/testing/selftests/bpf/prog_tests/probe_user.c
+++ b/tools/testing/selftests/bpf/prog_tests/probe_user.c
@@ -20,6 +20,11 @@ void serial_test_probe_user(void)
 	struct bpf_program *kprobe_progs[prog_count];
 	struct bpf_object *obj;
 	static const int zero = 0;
+	struct test_pro_bss {
+		struct sockaddr_in old;
+		__u32 test_pid;
+	};
+	struct test_pro_bss results = {};
 	size_t i;
 
 	obj = bpf_object__open_file(obj_file, &opts);
@@ -34,6 +39,23 @@ void serial_test_probe_user(void)
 			goto cleanup;
 	}
 
+	{
+		struct bpf_map *bss_map;
+		struct test_pro_bss bss_init = {};
+
+		bss_init.test_pid = getpid();
+		bss_map = bpf_object__find_map_by_name(obj, "test_pro.bss");
+		if (!ASSERT_OK_PTR(bss_map, "find_bss_map"))
+			goto cleanup;
+		if (!ASSERT_EQ(bpf_map__value_size(bss_map), sizeof(bss_init),
+			       "bss_size"))
+			goto cleanup;
+		err = bpf_map__set_initial_value(bss_map, &bss_init,
+						 sizeof(bss_init));
+		if (!ASSERT_OK(err, "set_bss_init"))
+			goto cleanup;
+	}
+
 	err = bpf_object__load(obj);
 	if (CHECK(err, "obj_load", "err %d\n", err))
 		goto cleanup;
@@ -62,11 +84,13 @@ void serial_test_probe_user(void)
 	connect(sock_fd, &curr, sizeof(curr));
 	close(sock_fd);
 
-	err = bpf_map_lookup_elem(results_map_fd, &zero, &tmp);
+	err = bpf_map_lookup_elem(results_map_fd, &zero, &results);
 	if (CHECK(err, "get_kprobe_res",
 		  "failed to get kprobe res: %d\n", err))
 		goto cleanup;
 
+	memcpy(&tmp, &results.old, sizeof(tmp));
+
 	in = (struct sockaddr_in *)&tmp;
 	if (CHECK(memcmp(&tmp, &orig, sizeof(orig)), "check_kprobe_res",
 		  "wrong kprobe res from probe read: %s:%u\n",
diff --git a/tools/testing/selftests/bpf/progs/test_probe_user.c b/tools/testing/selftests/bpf/progs/test_probe_user.c
index a8e501af9604..4bc86c7654b1 100644
--- a/tools/testing/selftests/bpf/progs/test_probe_user.c
+++ b/tools/testing/selftests/bpf/progs/test_probe_user.c
@@ -5,13 +5,22 @@
 #include <bpf/bpf_core_read.h>
 #include "bpf_misc.h"
 
-static struct sockaddr_in old;
+struct test_pro_bss {
+	struct sockaddr_in old;
+	__u32 test_pid;
+};
+
+struct test_pro_bss bss;
 
 static int handle_sys_connect_common(struct sockaddr_in *uservaddr)
 {
 	struct sockaddr_in new;
+	__u32 cur = bpf_get_current_pid_tgid() >> 32;
+
+	if (bss.test_pid && cur != bss.test_pid)
+		return 0;
 
-	bpf_probe_read_user(&old, sizeof(old), uservaddr);
+	bpf_probe_read_user(&bss.old, sizeof(bss.old), uservaddr);
 	__builtin_memset(&new, 0xab, sizeof(new));
 	bpf_probe_write_user(uservaddr, &new, sizeof(new));
 

base-commit: 7dff99b354601dd01829e1511711846e04340a69
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH v3 2/2] selftests/bpf: drop serial restriction
  2026-03-06  8:33 [PATCH v3 1/2] selftests/bpf: filter by pid to avoid cross-test interference Sun Jian
@ 2026-03-06  8:33 ` Sun Jian
  2026-03-07  0:11   ` Kumar Kartikeya Dwivedi
  2026-03-07  0:11 ` [PATCH v3 1/2] selftests/bpf: filter by pid to avoid cross-test interference Kumar Kartikeya Dwivedi
  2026-03-11 16:40 ` patchwork-bot+netdevbpf
  2 siblings, 1 reply; 5+ messages in thread
From: Sun Jian @ 2026-03-06  8:33 UTC (permalink / raw)
  To: Andrii Nakryiko, Shuah Khan
  Cc: bpf, linux-kselftest, Alexei Starovoitov, Daniel Borkmann,
	Sun Jian

Patch 1/2 added PID filtering to the probe_user BPF program to avoid
cross-test interference from the global connect() hooks.

With the interference removed, drop the serial_ prefix and remove the
stale TODO comment so the test can run in parallel.

Tested:
  ./test_progs -t probe_user -v
  ./test_progs -j$(nproc) -t probe_user

Signed-off-by: Sun Jian <sun.jian.kdev@gmail.com>
---
 tools/testing/selftests/bpf/prog_tests/probe_user.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/tools/testing/selftests/bpf/prog_tests/probe_user.c b/tools/testing/selftests/bpf/prog_tests/probe_user.c
index b3e17a329cb4..7a9d13aa2c87 100644
--- a/tools/testing/selftests/bpf/prog_tests/probe_user.c
+++ b/tools/testing/selftests/bpf/prog_tests/probe_user.c
@@ -1,8 +1,7 @@
 // SPDX-License-Identifier: GPL-2.0
 #include <test_progs.h>
 
-/* TODO: corrupts other tests uses connect() */
-void serial_test_probe_user(void)
+void test_probe_user(void)
 {
 	static const char *const prog_names[] = {
 		"handle_sys_connect",
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH v3 1/2] selftests/bpf: filter by pid to avoid cross-test interference
  2026-03-06  8:33 [PATCH v3 1/2] selftests/bpf: filter by pid to avoid cross-test interference Sun Jian
  2026-03-06  8:33 ` [PATCH v3 2/2] selftests/bpf: drop serial restriction Sun Jian
@ 2026-03-07  0:11 ` Kumar Kartikeya Dwivedi
  2026-03-11 16:40 ` patchwork-bot+netdevbpf
  2 siblings, 0 replies; 5+ messages in thread
From: Kumar Kartikeya Dwivedi @ 2026-03-07  0:11 UTC (permalink / raw)
  To: Sun Jian
  Cc: Andrii Nakryiko, Shuah Khan, bpf, linux-kselftest,
	Alexei Starovoitov, Daniel Borkmann

On Fri, 6 Mar 2026 at 09:35, Sun Jian <sun.jian.kdev@gmail.com> wrote:
>
> The test installs a kprobe on __sys_connect and checks that
> bpf_probe_write_user() can modify the syscall argument. However, any
> concurrent thread in any other test that calls connect() will also
> trigger the kprobe and have its sockaddr silently overwritten, causing
> flaky failures in unrelated tests.
>
> Constrain the hook to the current test process by filtering on a PID
> stored as a global variable in .bss. Initialize the .bss value from
> user space before bpf_object__load() using bpf_map__set_initial_value(),
> and validate the bss map value size to catch layout mismatches.
>
> No new map is introduced and the test keeps the existing non-skeleton
> flow.
>
> Signed-off-by: Sun Jian <sun.jian.kdev@gmail.com>
> ---

Acked-by: Kumar Kartikeya Dwivedi <memxor@gmail.com>

>
> [...]

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH v3 2/2] selftests/bpf: drop serial restriction
  2026-03-06  8:33 ` [PATCH v3 2/2] selftests/bpf: drop serial restriction Sun Jian
@ 2026-03-07  0:11   ` Kumar Kartikeya Dwivedi
  0 siblings, 0 replies; 5+ messages in thread
From: Kumar Kartikeya Dwivedi @ 2026-03-07  0:11 UTC (permalink / raw)
  To: Sun Jian
  Cc: Andrii Nakryiko, Shuah Khan, bpf, linux-kselftest,
	Alexei Starovoitov, Daniel Borkmann

On Fri, 6 Mar 2026 at 09:35, Sun Jian <sun.jian.kdev@gmail.com> wrote:
>
> Patch 1/2 added PID filtering to the probe_user BPF program to avoid
> cross-test interference from the global connect() hooks.
>
> With the interference removed, drop the serial_ prefix and remove the
> stale TODO comment so the test can run in parallel.
>
> Tested:
>   ./test_progs -t probe_user -v
>   ./test_progs -j$(nproc) -t probe_user
>
> Signed-off-by: Sun Jian <sun.jian.kdev@gmail.com>
> ---
>

Acked-by: Kumar Kartikeya Dwivedi <memxor@gmail.com>

>
> [...]

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH v3 1/2] selftests/bpf: filter by pid to avoid cross-test interference
  2026-03-06  8:33 [PATCH v3 1/2] selftests/bpf: filter by pid to avoid cross-test interference Sun Jian
  2026-03-06  8:33 ` [PATCH v3 2/2] selftests/bpf: drop serial restriction Sun Jian
  2026-03-07  0:11 ` [PATCH v3 1/2] selftests/bpf: filter by pid to avoid cross-test interference Kumar Kartikeya Dwivedi
@ 2026-03-11 16:40 ` patchwork-bot+netdevbpf
  2 siblings, 0 replies; 5+ messages in thread
From: patchwork-bot+netdevbpf @ 2026-03-11 16:40 UTC (permalink / raw)
  To: sun jian; +Cc: andrii, shuah, bpf, linux-kselftest, ast, daniel

Hello:

This series was applied to bpf/bpf-next.git (master)
by Alexei Starovoitov <ast@kernel.org>:

On Fri,  6 Mar 2026 16:33:29 +0800 you wrote:
> The test installs a kprobe on __sys_connect and checks that
> bpf_probe_write_user() can modify the syscall argument. However, any
> concurrent thread in any other test that calls connect() will also
> trigger the kprobe and have its sockaddr silently overwritten, causing
> flaky failures in unrelated tests.
> 
> Constrain the hook to the current test process by filtering on a PID
> stored as a global variable in .bss. Initialize the .bss value from
> user space before bpf_object__load() using bpf_map__set_initial_value(),
> and validate the bss map value size to catch layout mismatches.
> 
> [...]

Here is the summary with links:
  - [v3,1/2] selftests/bpf: filter by pid to avoid cross-test interference
    https://git.kernel.org/bpf/bpf-next/c/70ce840d5f5b
  - [v3,2/2] selftests/bpf: drop serial restriction
    https://git.kernel.org/bpf/bpf-next/c/aa181c7d642c

You are awesome, thank you!
-- 
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html



^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2026-03-11 16:40 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-03-06  8:33 [PATCH v3 1/2] selftests/bpf: filter by pid to avoid cross-test interference Sun Jian
2026-03-06  8:33 ` [PATCH v3 2/2] selftests/bpf: drop serial restriction Sun Jian
2026-03-07  0:11   ` Kumar Kartikeya Dwivedi
2026-03-07  0:11 ` [PATCH v3 1/2] selftests/bpf: filter by pid to avoid cross-test interference Kumar Kartikeya Dwivedi
2026-03-11 16:40 ` patchwork-bot+netdevbpf

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox