Commit 0ba0ef01 authored by Ihor Solodrai's avatar Ihor Solodrai Committed by Andrii Nakryiko
Browse files

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: default avatarIhor Solodrai <ihor.solodrai@linux.dev>
Signed-off-by: default avatarAndrii Nakryiko <andrii@kernel.org>
Reviewed-by: default avatarJiri Olsa <jolsa@kernel.org>
Link: https://lore.kernel.org/bpf/20250224235756.2612606-2-ihor.solodrai@linux.dev
parent b62dff14
Loading
Loading
Loading
Loading
+10 −1
Original line number Diff line number Diff line
@@ -45,7 +45,7 @@ static void subtest_basic_usdt(void)
	LIBBPF_OPTS(bpf_usdt_opts, opts);
	struct test_usdt *skel;
	struct test_usdt__bss *bss;
	int err;
	int err, i;

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

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

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

	int usdt12_expected_arg_sizes[12] = { 4, 4, 8, 8, 4, 8, 8, 8, 4, 2, 2, 1 };

	for (i = 0; i < 12; i++)
		ASSERT_EQ(bss->usdt12_arg_sizes[i], usdt12_expected_arg_sizes[i], "usdt12_arg_size");

	/* trigger_func() is marked __always_inline, so USDT invocations will be
	 * inlined in two different places, meaning that each USDT will have
	 * at least 2 different places to be attached to. This verifies that
+14 −0
Original line number Diff line number Diff line
@@ -11,6 +11,7 @@ int usdt0_called;
u64 usdt0_cookie;
int usdt0_arg_cnt;
int usdt0_arg_ret;
int usdt0_arg_size;

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

@@ -34,6 +36,7 @@ u64 usdt3_cookie;
int usdt3_arg_cnt;
int usdt3_arg_rets[3];
u64 usdt3_args[3];
int usdt3_arg_sizes[3];

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

	usdt3_arg_rets[0] = bpf_usdt_arg(ctx, 0, &tmp);
	usdt3_args[0] = (int)tmp;
	usdt3_arg_sizes[0] = bpf_usdt_arg_size(ctx, 0);

	usdt3_arg_rets[1] = bpf_usdt_arg(ctx, 1, &tmp);
	usdt3_args[1] = (long)tmp;
	usdt3_arg_sizes[1] = bpf_usdt_arg_size(ctx, 1);

	usdt3_arg_rets[2] = bpf_usdt_arg(ctx, 2, &tmp);
	usdt3_args[2] = (uintptr_t)tmp;
	usdt3_arg_sizes[2] = bpf_usdt_arg_size(ctx, 2);

	return 0;
}
@@ -64,12 +70,15 @@ int usdt12_called;
u64 usdt12_cookie;
int usdt12_arg_cnt;
u64 usdt12_args[12];
int usdt12_arg_sizes[12];

SEC("usdt//proc/self/exe:test:usdt12")
int BPF_USDT(usdt12, int a1, int a2, long a3, long a4, unsigned a5,
		     long a6, __u64 a7, uintptr_t a8, int a9, short a10,
		     short a11, signed char a12)
{
	int i;

	if (my_pid != (bpf_get_current_pid_tgid() >> 32))
		return 0;

@@ -90,6 +99,11 @@ int BPF_USDT(usdt12, int a1, int a2, long a3, long a4, unsigned a5,
	usdt12_args[9] = a10;
	usdt12_args[10] = a11;
	usdt12_args[11] = a12;

	bpf_for(i, 0, 12) {
		usdt12_arg_sizes[i] = bpf_usdt_arg_size(ctx, i);
	}

	return 0;
}