From: Jiri Olsa <olsajiri@gmail.com>
To: Sun Jian <sun.jian.kdev@gmail.com>
Cc: bpf@vger.kernel.org, ast@kernel.org, daniel@iogearbox.net,
andrii@kernel.org, shuah@kernel.org, martin.lau@kernel.org,
eddyz87@gmail.com, song@kernel.org, yonghong.song@linux.dev,
john.fastabend@gmail.com, kpsingh@kernel.org, sdf@fomichev.me,
haoluo@google.com, paul.chaignon@gmail.com,
linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v3] selftests/bpf: move trampoline_count to dedicated bpf_testmod target
Date: Mon, 23 Mar 2026 12:17:26 +0100 [thread overview]
Message-ID: <acEhRhymOUw78d3_@krava> (raw)
In-Reply-To: <20260320074150.628094-1-sun.jian.kdev@gmail.com>
On Fri, Mar 20, 2026 at 03:41:50PM +0800, Sun Jian wrote:
> trampoline_count fills all trampoline attachment slots for a single
> target function and verifies that one extra attach fails with -E2BIG.
>
> It currently targets bpf_modify_return_test, which is also used by
> other selftests such as modify_return, get_func_ip_test, and
> get_func_args_test. When such tests run in parallel, they can contend
> for the same per-function trampoline quota and cause unexpected attach
> failures. This issue is currently masked by harness serialization.
>
> Move trampoline_count to a dedicated bpf_testmod target and register it
> for fmod_ret attachment. Also route the final trigger through
> trigger_module_test_read, so the execution path exercises the same
> dedicated target.
>
> This keeps the test semantics unchanged while isolating it from other
> selftests, so it no longer needs to run in serial mode. Remove the
> TODO comment as well.
>
> Tested:
> ./test_progs -t trampoline_count -vv
> ./test_progs -t modify_return -vv
> ./test_progs -t get_func_ip_test -vv
> ./test_progs -t get_func_args_test -vv
> ./test_progs -j$(nproc) -t trampoline_count -vv
> ./test_progs -j$(nproc) -t
> trampoline_count,modify_return,get_func_ip_test,get_func_args_test,\
> kprobe_multi_test -vv
> 20 runs of:
> ./test_progs -j$(nproc) -t
> trampoline_count,modify_return,get_func_ip_test,get_func_args_test,\
> kprobe_multi_test
>
> Suggested-by: Jiri Olsa <jolsa@kernel.org>
I only suggested change as part of review, not the change itself ;-)
you can drop the tag
> Signed-off-by: Sun Jian <sun.jian.kdev@gmail.com>
> ---
> Link:https://lore.kernel.org/bpf/abicUI4YQ5KkQ_Ro@mail.gmail.com/T/#m6253b7fe96fe1a4df65b274c95aac786598a9857
>
> v3:
> - route the final trigger through trigger_module_test_read() and make
> bpf_testmod_test_read() call the dedicated trampoline_count target,
> as suggested by Jiri
>
> v2:
> - rewrite the subject to describe the change
> - resend with the correct patch content
>
> .../bpf/prog_tests/trampoline_count.c | 17 ++++----------
> .../bpf/progs/test_trampoline_count.c | 6 ++---
> .../selftests/bpf/test_kmods/bpf_testmod.c | 23 +++++++++++++++++++
> 3 files changed, 30 insertions(+), 16 deletions(-)
>
> diff --git a/tools/testing/selftests/bpf/prog_tests/trampoline_count.c b/tools/testing/selftests/bpf/prog_tests/trampoline_count.c
> index 6cd7349d4a2b..dd2e5c84a4b5 100644
> --- a/tools/testing/selftests/bpf/prog_tests/trampoline_count.c
> +++ b/tools/testing/selftests/bpf/prog_tests/trampoline_count.c
> @@ -30,16 +30,14 @@ static struct bpf_program *load_prog(char *file, char *name, struct inst *inst)
> return prog;
> }
>
> -/* TODO: use different target function to run in concurrent mode */
> -void serial_test_trampoline_count(void)
> +void test_trampoline_count(void)
> {
> char *file = "test_trampoline_count.bpf.o";
> char *const progs[] = { "fentry_test", "fmod_ret_test", "fexit_test" };
> - int bpf_max_tramp_links, err, i, prog_fd;
> + int bpf_max_tramp_links, i;
> struct bpf_program *prog;
> struct bpf_link *link;
> struct inst *inst;
> - LIBBPF_OPTS(bpf_test_run_opts, opts);
>
> bpf_max_tramp_links = get_bpf_max_tramp_links();
> if (!ASSERT_GE(bpf_max_tramp_links, 1, "bpf_max_tramp_links"))
> @@ -80,17 +78,10 @@ void serial_test_trampoline_count(void)
> goto cleanup;
>
> /* and finally execute the probe */
> - prog_fd = bpf_program__fd(prog);
> - if (!ASSERT_GE(prog_fd, 0, "bpf_program__fd"))
> + if (!ASSERT_OK(trigger_module_test_read(256),
> + "trigger_module_test_read"))
could be just single line, also no need for the condition and
goto cleanup, just this will do:
ASSERT_OK(trigger_module_test_read....)
> goto cleanup;
>
> - err = bpf_prog_test_run_opts(prog_fd, &opts);
> - if (!ASSERT_OK(err, "bpf_prog_test_run_opts"))
> - goto cleanup;
> -
> - ASSERT_EQ(opts.retval & 0xffff, 33, "bpf_modify_return_test.result");
> - ASSERT_EQ(opts.retval >> 16, 2, "bpf_modify_return_test.side_effect");
> -
> cleanup:
> for (; i >= 0; i--) {
> bpf_link__destroy(inst[i].link);
> diff --git a/tools/testing/selftests/bpf/progs/test_trampoline_count.c b/tools/testing/selftests/bpf/progs/test_trampoline_count.c
> index 7765720da7d5..14ad2f53cf33 100644
> --- a/tools/testing/selftests/bpf/progs/test_trampoline_count.c
> +++ b/tools/testing/selftests/bpf/progs/test_trampoline_count.c
> @@ -3,19 +3,19 @@
> #include <bpf/bpf_helpers.h>
> #include <bpf/bpf_tracing.h>
>
> -SEC("fentry/bpf_modify_return_test")
> +SEC("fentry/bpf_testmod_trampoline_count_test")
> int BPF_PROG(fentry_test, int a, int *b)
> {
> return 0;
> }
>
> -SEC("fmod_ret/bpf_modify_return_test")
> +SEC("fmod_ret/bpf_testmod_trampoline_count_test")
> int BPF_PROG(fmod_ret_test, int a, int *b, int ret)
> {
> return 0;
> }
>
> -SEC("fexit/bpf_modify_return_test")
> +SEC("fexit/bpf_testmod_trampoline_count_test")
> int BPF_PROG(fexit_test, int a, int *b, int ret)
> {
> return 0;
> diff --git a/tools/testing/selftests/bpf/test_kmods/bpf_testmod.c b/tools/testing/selftests/bpf/test_kmods/bpf_testmod.c
> index e62c6b78657f..47583577e021 100644
> --- a/tools/testing/selftests/bpf/test_kmods/bpf_testmod.c
> +++ b/tools/testing/selftests/bpf/test_kmods/bpf_testmod.c
> @@ -470,6 +470,8 @@ noinline void bpf_testmod_stacktrace_test_1(void)
>
> int bpf_testmod_fentry_ok;
>
> +noinline int bpf_testmod_trampoline_count_test(int a, int *b);
we could define bpf_testmod_trampoline_count_test in here,
so we would go without the declaration
> +
> noinline ssize_t
> bpf_testmod_test_read(struct file *file, struct kobject *kobj,
> const struct bin_attribute *bin_attr,
> @@ -548,6 +550,10 @@ bpf_testmod_test_read(struct file *file, struct kobject *kobj,
> 21, 22, 23, 24, 25, 26) != 231)
> goto out;
>
> + i = 2;
> + if (bpf_testmod_trampoline_count_test(1, &i) != 4 || i != 3)
> + goto out;
do we need all those arguments? progs don't do anything with them..
I'd stick with just simple module function used by trampoline_count test
jirka
prev parent reply other threads:[~2026-03-23 11:17 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-20 7:41 [PATCH v3] selftests/bpf: move trampoline_count to dedicated bpf_testmod target Sun Jian
2026-03-20 14:01 ` Mykyta Yatsenko
2026-03-23 8:08 ` sun jian
2026-03-23 11:17 ` Jiri Olsa [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=acEhRhymOUw78d3_@krava \
--to=olsajiri@gmail.com \
--cc=andrii@kernel.org \
--cc=ast@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=daniel@iogearbox.net \
--cc=eddyz87@gmail.com \
--cc=haoluo@google.com \
--cc=john.fastabend@gmail.com \
--cc=kpsingh@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=martin.lau@kernel.org \
--cc=paul.chaignon@gmail.com \
--cc=sdf@fomichev.me \
--cc=shuah@kernel.org \
--cc=song@kernel.org \
--cc=sun.jian.kdev@gmail.com \
--cc=yonghong.song@linux.dev \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox