Commit ce6dc74a authored by Andrii Nakryiko's avatar Andrii Nakryiko Committed by Alexei Starovoitov
Browse files

selftests/bpf: add test of __weak unknown virtual __kconfig extern



Exercise libbpf's logic for unknown __weak virtual __kconfig externs.
USDT selftests are already excercising non-weak known virtual extern
already (LINUX_HAS_BPF_COOKIE), so no need to add explicit tests for it.

Tested-by: default avatarAlan Maguire <alan.maguire@oracle.com>
Signed-off-by: default avatarAndrii Nakryiko <andrii@kernel.org>
Link: https://lore.kernel.org/r/20220714070755.3235561-3-andrii@kernel.org


Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
parent 55d00c37
Loading
Loading
Loading
Loading
+7 −10
Original line number Diff line number Diff line
@@ -39,6 +39,7 @@ static struct test_case {
		       "CONFIG_STR=\"abracad\"\n"
		       "CONFIG_MISSING=0",
		.data = {
			.unkn_virt_val = 0,
			.bpf_syscall = false,
			.tristate_val = TRI_MODULE,
			.bool_val = true,
@@ -121,7 +122,7 @@ static struct test_case {
void test_core_extern(void)
{
	const uint32_t kern_ver = get_kernel_version();
	int err, duration = 0, i, j;
	int err, i, j;
	struct test_core_extern *skel = NULL;
	uint64_t *got, *exp;
	int n = sizeof(*skel->data) / sizeof(uint64_t);
@@ -136,19 +137,17 @@ void test_core_extern(void)
			continue;

		skel = test_core_extern__open_opts(&opts);
		if (CHECK(!skel, "skel_open", "skeleton open failed\n"))
		if (!ASSERT_OK_PTR(skel, "skel_open"))
			goto cleanup;
		err = test_core_extern__load(skel);
		if (t->fails) {
			CHECK(!err, "skel_load",
			      "shouldn't succeed open/load of skeleton\n");
			ASSERT_ERR(err, "skel_load_should_fail");
			goto cleanup;
		} else if (CHECK(err, "skel_load",
				 "failed to open/load skeleton\n")) {
		} else if (!ASSERT_OK(err, "skel_load")) {
			goto cleanup;
		}
		err = test_core_extern__attach(skel);
		if (CHECK(err, "attach_raw_tp", "failed attach: %d\n", err))
		if (!ASSERT_OK(err, "attach_raw_tp"))
			goto cleanup;

		usleep(1);
@@ -158,9 +157,7 @@ void test_core_extern(void)
		got = (uint64_t *)skel->data;
		exp = (uint64_t *)&t->data;
		for (j = 0; j < n; j++) {
			CHECK(got[j] != exp[j], "check_res",
			      "result #%d: expected %llx, but got %llx\n",
			       j, (__u64)exp[j], (__u64)got[j]);
			ASSERT_EQ(got[j], exp[j], "result");
		}
cleanup:
		test_core_extern__destroy(skel);
+3 −0
Original line number Diff line number Diff line
@@ -11,6 +11,7 @@
static int (*bpf_missing_helper)(const void *arg1, int arg2) = (void *) 999;

extern int LINUX_KERNEL_VERSION __kconfig;
extern int LINUX_UNKNOWN_VIRTUAL_EXTERN __kconfig __weak;
extern bool CONFIG_BPF_SYSCALL __kconfig; /* strong */
extern enum libbpf_tristate CONFIG_TRISTATE __kconfig __weak;
extern bool CONFIG_BOOL __kconfig __weak;
@@ -22,6 +23,7 @@ extern const char CONFIG_STR[8] __kconfig __weak;
extern uint64_t CONFIG_MISSING __kconfig __weak;

uint64_t kern_ver = -1;
uint64_t unkn_virt_val = -1;
uint64_t bpf_syscall = -1;
uint64_t tristate_val = -1;
uint64_t bool_val = -1;
@@ -38,6 +40,7 @@ int handle_sys_enter(struct pt_regs *ctx)
	int i;

	kern_ver = LINUX_KERNEL_VERSION;
	unkn_virt_val = LINUX_UNKNOWN_VIRTUAL_EXTERN;
	bpf_syscall = CONFIG_BPF_SYSCALL;
	tristate_val = CONFIG_TRISTATE;
	bool_val = CONFIG_BOOL;