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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.