On 12/13/2023 10:43 PM, Jiri Olsa wrote: > On Wed, Dec 13, 2023 at 07:25:30PM +0800, Hou Tao wrote: >> From: Hou Tao <houtao1@xxxxxxxxxx> >> >> If an abnormally huge cnt is used for multi-uprobes attachment, the >> following warning will be reported: >> >> ------------[ cut here ]------------ >> WARNING: CPU: 7 PID: 406 at mm/util.c:632 kvmalloc_node+0xd9/0xe0 >> Modules linked in: bpf_testmod(O) >> CPU: 7 PID: 406 Comm: test_progs Tainted: G ...... 6.7.0-rc3+ #32 >> Hardware name: QEMU Standard PC (i440FX + PIIX, 1996) ...... >> RIP: 0010:kvmalloc_node+0xd9/0xe0 >> ...... >> Call Trace: >> <TASK> >> ? __warn+0x89/0x150 >> ? kvmalloc_node+0xd9/0xe0 >> bpf_uprobe_multi_link_attach+0x14a/0x480 >> __sys_bpf+0x14a9/0x2bc0 >> do_syscall_64+0x36/0xb0 >> entry_SYSCALL_64_after_hwframe+0x6e/0x76 >> ...... >> </TASK> >> ---[ end trace 0000000000000000 ]--- >> >> So add a test to ensure the warning is fixed. >> >> Signed-off-by: Hou Tao <houtao1@xxxxxxxxxx> >> --- >> .../bpf/prog_tests/uprobe_multi_test.c | 33 ++++++++++++++++++- >> 1 file changed, 32 insertions(+), 1 deletion(-) >> >> diff --git a/tools/testing/selftests/bpf/prog_tests/uprobe_multi_test.c b/tools/testing/selftests/bpf/prog_tests/uprobe_multi_test.c >> index ece260cf2c0b..0d2a4510e6cf 100644 >> --- a/tools/testing/selftests/bpf/prog_tests/uprobe_multi_test.c >> +++ b/tools/testing/selftests/bpf/prog_tests/uprobe_multi_test.c >> @@ -234,6 +234,35 @@ static void test_attach_api_syms(void) >> test_attach_api("/proc/self/exe", NULL, &opts); >> } >> >> +static void test_failed_link_api(void) >> +{ >> + LIBBPF_OPTS(bpf_link_create_opts, opts); >> + const char *path = "/proc/self/exe"; >> + struct uprobe_multi *skel = NULL; >> + unsigned long offset = 0; >> + int link_fd = -1; >> + >> + skel = uprobe_multi__open_and_load(); >> + if (!ASSERT_OK_PTR(skel, "uprobe_multi__open_and_load")) >> + goto cleanup; >> + >> + /* abnormal cnt */ >> + opts.uprobe_multi.path = path; >> + opts.uprobe_multi.offsets = &offset; >> + opts.uprobe_multi.cnt = INT_MAX; >> + opts.kprobe_multi.flags = 0; > s/k/u/ ^^^ .. or best just remove the line My bad. Will remove it. Thanks for the ack. > > jirka > >> + link_fd = bpf_link_create(bpf_program__fd(skel->progs.uprobe), 0, >> + BPF_TRACE_UPROBE_MULTI, &opts); >> + if (!ASSERT_ERR(link_fd, "link_fd")) >> + goto cleanup; >> + if (!ASSERT_EQ(link_fd, -EINVAL, "invalid cnt")) >> + goto cleanup; >> +cleanup: >> + if (link_fd >= 0) >> + close(link_fd); >> + uprobe_multi__destroy(skel); >> +} >> + >> static void __test_link_api(struct child *child) >> { >> int prog_fd, link1_fd = -1, link2_fd = -1, link3_fd = -1, link4_fd = -1; >> @@ -311,7 +340,7 @@ static void __test_link_api(struct child *child) >> free(offsets); >> } >> >> -void test_link_api(void) >> +static void test_link_api(void) >> { >> struct child *child; >> >> @@ -408,6 +437,8 @@ void test_uprobe_multi_test(void) >> test_attach_api_syms(); >> if (test__start_subtest("link_api")) >> test_link_api(); >> + if (test__start_subtest("failed_link_api")) >> + test_failed_link_api(); >> if (test__start_subtest("bench_uprobe")) >> test_bench_attach_uprobe(); >> if (test__start_subtest("bench_usdt")) >> -- >> 2.29.2 >>