@@ -82,7 +82,7 @@ TEST_PROGS_EXTENDED := with_addr.sh \
TEST_GEN_PROGS_EXTENDED = test_sock_addr test_skb_cgroup_id_user \
flow_dissector_load test_flow_dissector test_tcp_check_syncookie_user \
test_lirc_mode2_user xdping test_cpp runqslower bench bpf_testmod.ko \
- xdpxceiver xdp_redirect_multi
+ xdpxceiver xdp_redirect_multi bpf_testmod_preload.ko
TEST_CUSTOM_PROGS = $(OUTPUT)/urandom_read
@@ -110,6 +110,7 @@ override define CLEAN
$(Q)$(RM) -r $(TEST_GEN_FILES)
$(Q)$(RM) -r $(EXTRA_CLEAN)
$(Q)$(MAKE) -C bpf_testmod clean
+ $(Q)$(MAKE) -C bpf_testmod_preload clean
$(Q)$(MAKE) docs-clean
endef
@@ -502,7 +503,7 @@ TRUNNER_EXTRA_SOURCES := test_progs.c cgroup_helpers.c trace_helpers.c \
btf_helpers.c flow_dissector_load.h \
cap_helpers.c
TRUNNER_EXTRA_FILES := $(OUTPUT)/urandom_read $(OUTPUT)/bpf_testmod.ko \
- ima_setup.sh \
+ ima_setup.sh $(OUTPUT)/bpf_testmod_preload.ko \
$(wildcard progs/btf_dump_test_case_*.c)
TRUNNER_BPF_BUILD_RULE := CLANG_BPF_BUILD_RULE
TRUNNER_BPF_CFLAGS := $(BPF_CFLAGS) $(CLANG_CFLAGS) -DENABLE_ATOMICS_TESTS
@@ -575,9 +576,19 @@ $(OUTPUT)/bench: $(OUTPUT)/bench.o \
$(call msg,BINARY,,$@)
$(Q)$(CC) $(CFLAGS) $(LDFLAGS) $(filter %.a %.o,$^) $(LDLIBS) -o $@
+bpf_testmod_preload/bpf_testmod_preload.c: $(OUTPUT)/gen_preload_methods.preload.lskel.h $(BPFTOOL) $(TRUNNER_BPF_LSKELSP)
+ $(call msg,GEN-MOD,,$@)
+ $(BPFTOOL) gen module $< > $@
+
+$(OUTPUT)/bpf_testmod_preload.ko: bpf_testmod_preload/bpf_testmod_preload.c
+ $(call msg,MOD,,$@)
+ $(Q)$(RM) bpf_testmod_preload/bpf_testmod_preload.ko # force re-compilation
+ $(Q)$(MAKE) $(submake_extras) -C bpf_testmod_preload
+ $(Q)cp bpf_testmod_preload/bpf_testmod_preload.ko $@
+
EXTRA_CLEAN := $(TEST_CUSTOM_PROGS) $(SCRATCH_DIR) $(HOST_SCRATCH_DIR) \
prog_tests/tests.h map_tests/tests.h verifier/tests.h \
feature bpftool \
- $(addprefix $(OUTPUT)/,*.o *.skel.h *.lskel.h *.subskel.h no_alu32 bpf_gcc bpf_testmod.ko)
+ $(addprefix $(OUTPUT)/,*.o *.skel.h *.lskel.h *.subskel.h no_alu32 bpf_gcc bpf_testmod.ko bpf_testmod_preload.ko)
.PHONY: docs docs-clean
new file mode 100644
@@ -0,0 +1,7 @@
+*.mod
+*.mod.c
+*.o
+.ko
+/Module.symvers
+/modules.order
+bpf_testmod_preload.c
new file mode 100644
@@ -0,0 +1,20 @@
+BPF_TESTMOD_PRELOAD_DIR := $(realpath $(dir $(abspath $(lastword $(MAKEFILE_LIST)))))
+KDIR ?= $(abspath $(BPF_TESTMOD_PRELOAD_DIR)/../../../../..)
+
+ifeq ($(V),1)
+Q =
+else
+Q = @
+endif
+
+MODULES = bpf_testmod_preload.ko
+
+obj-m += bpf_testmod_preload.o
+CFLAGS_bpf_testmod_preload.o = -I$(BPF_TESTMOD_PRELOAD_DIR)/../tools/include
+
+all:
+ +$(Q)make -C $(KDIR) M=$(BPF_TESTMOD_PRELOAD_DIR) modules
+
+clean:
+ +$(Q)make -C $(KDIR) M=$(BPF_TESTMOD_PRELOAD_DIR) clean
+
new file mode 100644
@@ -0,0 +1,69 @@
+// SPDX-License-Identifier: GPL-2.0
+
+/*
+ * Copyright (C) 2022 Huawei Technologies Duesseldorf GmbH
+ */
+
+#include <errno.h>
+#include <limits.h>
+#include <test_progs.h>
+#include <sys/mount.h>
+#include <sys/stat.h>
+
+#define MOUNT_FLAGS (MS_NOSUID | MS_NODEV | MS_NOEXEC | MS_RELATIME)
+
+static int duration;
+
+void test_test_preload_methods(void)
+{
+ char bpf_mntpoint[] = "/tmp/bpf_mntpointXXXXXX", *dir;
+ char path[PATH_MAX];
+ struct stat st;
+ int err;
+
+ system("rmmod bpf_testmod_preload 2> /dev/null");
+
+ err = system("insmod bpf_testmod_preload.ko");
+ if (CHECK(err, "insmod",
+ "cannot load bpf_testmod_preload.ko, err=%d\n", err))
+ return;
+
+ dir = mkdtemp(bpf_mntpoint);
+ if (CHECK(!dir, "mkstemp", "cannot create temp file, err=%d\n",
+ -errno))
+ goto out_rmmod;
+
+ err = mount(bpf_mntpoint, bpf_mntpoint, "bpf", MOUNT_FLAGS, NULL);
+ if (CHECK(err, "mount",
+ "cannot mount bpf filesystem to %s, err=%d\n", bpf_mntpoint,
+ err))
+ goto out_unlink;
+
+ snprintf(path, sizeof(path), "%s/gen_preload_methods_lskel",
+ bpf_mntpoint);
+
+ err = stat(path, &st);
+ if (CHECK(err, "stat", "cannot find %s\n", path))
+ goto out_unmount;
+
+ snprintf(path, sizeof(path),
+ "%s/gen_preload_methods_lskel/dump_bpf_map", bpf_mntpoint);
+
+ err = stat(path, &st);
+ if (CHECK(err, "stat", "cannot find %s\n", path))
+ goto out_unmount;
+
+ snprintf(path, sizeof(path), "%s/gen_preload_methods_lskel/ringbuf",
+ bpf_mntpoint);
+
+ err = stat(path, &st);
+ if (CHECK(err, "stat", "cannot find %s\n", path))
+ goto out_unmount;
+
+out_unmount:
+ umount(bpf_mntpoint);
+out_unlink:
+ rmdir(bpf_mntpoint);
+out_rmmod:
+ system("rmmod bpf_testmod_preload");
+}
Introduce the 'preload_methods' test, which loads the new kernel module bpf_testmod_preload.ko (with the light skeleton from gen_preload_methods.c), mounts a new instance of the bpf filesystem, and checks if the pinned objects exist. The test requires to include 'gen_preload_methods_lskel' among the list of eBPF programs to preload. Signed-off-by: Roberto Sassu <roberto.sassu@huawei.com> --- tools/testing/selftests/bpf/Makefile | 17 ++++- .../bpf/bpf_testmod_preload/.gitignore | 7 ++ .../bpf/bpf_testmod_preload/Makefile | 20 ++++++ .../bpf/prog_tests/test_preload_methods.c | 69 +++++++++++++++++++ 4 files changed, 110 insertions(+), 3 deletions(-) create mode 100644 tools/testing/selftests/bpf/bpf_testmod_preload/.gitignore create mode 100644 tools/testing/selftests/bpf/bpf_testmod_preload/Makefile create mode 100644 tools/testing/selftests/bpf/prog_tests/test_preload_methods.c