Skip to content

Commit 0ba0ef0

Browse files
theihoranakryiko
authored andcommitted
selftests/bpf: Test bpf_usdt_arg_size() function
Update usdt tests to also check for correct behavior of bpf_usdt_arg_size(). Signed-off-by: Ihor Solodrai <[email protected]> Signed-off-by: Andrii Nakryiko <[email protected]> Reviewed-by: Jiri Olsa <[email protected]> Link: https://lore.kernel.org/bpf/[email protected]
1 parent b62dff1 commit 0ba0ef0

File tree

2 files changed

+24
-1
lines changed

2 files changed

+24
-1
lines changed

tools/testing/selftests/bpf/prog_tests/usdt.c

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ static void subtest_basic_usdt(void)
4545
LIBBPF_OPTS(bpf_usdt_opts, opts);
4646
struct test_usdt *skel;
4747
struct test_usdt__bss *bss;
48-
int err;
48+
int err, i;
4949

5050
skel = test_usdt__open_and_load();
5151
if (!ASSERT_OK_PTR(skel, "skel_open"))
@@ -75,6 +75,7 @@ static void subtest_basic_usdt(void)
7575
ASSERT_EQ(bss->usdt0_cookie, 0xcafedeadbeeffeed, "usdt0_cookie");
7676
ASSERT_EQ(bss->usdt0_arg_cnt, 0, "usdt0_arg_cnt");
7777
ASSERT_EQ(bss->usdt0_arg_ret, -ENOENT, "usdt0_arg_ret");
78+
ASSERT_EQ(bss->usdt0_arg_size, -ENOENT, "usdt0_arg_size");
7879

7980
/* auto-attached usdt3 gets default zero cookie value */
8081
ASSERT_EQ(bss->usdt3_cookie, 0, "usdt3_cookie");
@@ -86,6 +87,9 @@ static void subtest_basic_usdt(void)
8687
ASSERT_EQ(bss->usdt3_args[0], 1, "usdt3_arg1");
8788
ASSERT_EQ(bss->usdt3_args[1], 42, "usdt3_arg2");
8889
ASSERT_EQ(bss->usdt3_args[2], (uintptr_t)&bla, "usdt3_arg3");
90+
ASSERT_EQ(bss->usdt3_arg_sizes[0], 4, "usdt3_arg1_size");
91+
ASSERT_EQ(bss->usdt3_arg_sizes[1], 8, "usdt3_arg2_size");
92+
ASSERT_EQ(bss->usdt3_arg_sizes[2], 8, "usdt3_arg3_size");
8993

9094
/* auto-attached usdt12 gets default zero cookie value */
9195
ASSERT_EQ(bss->usdt12_cookie, 0, "usdt12_cookie");
@@ -104,6 +108,11 @@ static void subtest_basic_usdt(void)
104108
ASSERT_EQ(bss->usdt12_args[10], nums[idx], "usdt12_arg11");
105109
ASSERT_EQ(bss->usdt12_args[11], t1.y, "usdt12_arg12");
106110

111+
int usdt12_expected_arg_sizes[12] = { 4, 4, 8, 8, 4, 8, 8, 8, 4, 2, 2, 1 };
112+
113+
for (i = 0; i < 12; i++)
114+
ASSERT_EQ(bss->usdt12_arg_sizes[i], usdt12_expected_arg_sizes[i], "usdt12_arg_size");
115+
107116
/* trigger_func() is marked __always_inline, so USDT invocations will be
108117
* inlined in two different places, meaning that each USDT will have
109118
* at least 2 different places to be attached to. This verifies that

tools/testing/selftests/bpf/progs/test_usdt.c

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ int usdt0_called;
1111
u64 usdt0_cookie;
1212
int usdt0_arg_cnt;
1313
int usdt0_arg_ret;
14+
int usdt0_arg_size;
1415

1516
SEC("usdt")
1617
int usdt0(struct pt_regs *ctx)
@@ -26,6 +27,7 @@ int usdt0(struct pt_regs *ctx)
2627
usdt0_arg_cnt = bpf_usdt_arg_cnt(ctx);
2728
/* should return -ENOENT for any arg_num */
2829
usdt0_arg_ret = bpf_usdt_arg(ctx, bpf_get_prandom_u32(), &tmp);
30+
usdt0_arg_size = bpf_usdt_arg_size(ctx, bpf_get_prandom_u32());
2931
return 0;
3032
}
3133

@@ -34,6 +36,7 @@ u64 usdt3_cookie;
3436
int usdt3_arg_cnt;
3537
int usdt3_arg_rets[3];
3638
u64 usdt3_args[3];
39+
int usdt3_arg_sizes[3];
3740

3841
SEC("usdt//proc/self/exe:test:usdt3")
3942
int usdt3(struct pt_regs *ctx)
@@ -50,12 +53,15 @@ int usdt3(struct pt_regs *ctx)
5053

5154
usdt3_arg_rets[0] = bpf_usdt_arg(ctx, 0, &tmp);
5255
usdt3_args[0] = (int)tmp;
56+
usdt3_arg_sizes[0] = bpf_usdt_arg_size(ctx, 0);
5357

5458
usdt3_arg_rets[1] = bpf_usdt_arg(ctx, 1, &tmp);
5559
usdt3_args[1] = (long)tmp;
60+
usdt3_arg_sizes[1] = bpf_usdt_arg_size(ctx, 1);
5661

5762
usdt3_arg_rets[2] = bpf_usdt_arg(ctx, 2, &tmp);
5863
usdt3_args[2] = (uintptr_t)tmp;
64+
usdt3_arg_sizes[2] = bpf_usdt_arg_size(ctx, 2);
5965

6066
return 0;
6167
}
@@ -64,12 +70,15 @@ int usdt12_called;
6470
u64 usdt12_cookie;
6571
int usdt12_arg_cnt;
6672
u64 usdt12_args[12];
73+
int usdt12_arg_sizes[12];
6774

6875
SEC("usdt//proc/self/exe:test:usdt12")
6976
int BPF_USDT(usdt12, int a1, int a2, long a3, long a4, unsigned a5,
7077
long a6, __u64 a7, uintptr_t a8, int a9, short a10,
7178
short a11, signed char a12)
7279
{
80+
int i;
81+
7382
if (my_pid != (bpf_get_current_pid_tgid() >> 32))
7483
return 0;
7584

@@ -90,6 +99,11 @@ int BPF_USDT(usdt12, int a1, int a2, long a3, long a4, unsigned a5,
9099
usdt12_args[9] = a10;
91100
usdt12_args[10] = a11;
92101
usdt12_args[11] = a12;
102+
103+
bpf_for(i, 0, 12) {
104+
usdt12_arg_sizes[i] = bpf_usdt_arg_size(ctx, i);
105+
}
106+
93107
return 0;
94108
}
95109

0 commit comments

Comments
 (0)