]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
selftests/bpf: Add test for DEVMAP reuse
authorYureka Lilian <yuka@yuka.dev>
Thu, 14 Aug 2025 18:01:13 +0000 (20:01 +0200)
committerAndrii Nakryiko <andrii@kernel.org>
Fri, 15 Aug 2025 23:52:52 +0000 (16:52 -0700)
The test covers basic re-use of a pinned DEVMAP map,
with both matching and mismatching parameters.

Signed-off-by: Yureka Lilian <yuka@yuka.dev>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Acked-by: Eduard Zingerman <eddyz87@gmail.com>
Link: https://lore.kernel.org/bpf/20250814180113.1245565-4-yuka@yuka.dev
tools/testing/selftests/bpf/prog_tests/pinning_devmap_reuse.c [new file with mode: 0644]
tools/testing/selftests/bpf/progs/test_pinning_devmap.c [new file with mode: 0644]

diff --git a/tools/testing/selftests/bpf/prog_tests/pinning_devmap_reuse.c b/tools/testing/selftests/bpf/prog_tests/pinning_devmap_reuse.c
new file mode 100644 (file)
index 0000000..9ae49b5
--- /dev/null
@@ -0,0 +1,50 @@
+// SPDX-License-Identifier: GPL-2.0
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <test_progs.h>
+
+
+#include "test_pinning_devmap.skel.h"
+
+void test_pinning_devmap_reuse(void)
+{
+       const char *pinpath1 = "/sys/fs/bpf/pinmap1";
+       const char *pinpath2 = "/sys/fs/bpf/pinmap2";
+       struct test_pinning_devmap *skel1 = NULL, *skel2 = NULL;
+       int err;
+       DECLARE_LIBBPF_OPTS(bpf_object_open_opts, opts);
+
+       /* load the object a first time */
+       skel1 = test_pinning_devmap__open_and_load();
+       if (!ASSERT_OK_PTR(skel1, "skel_load1"))
+               goto out;
+
+       /* load the object a second time, re-using the pinned map */
+       skel2 = test_pinning_devmap__open_and_load();
+       if (!ASSERT_OK_PTR(skel2, "skel_load2"))
+               goto out;
+
+       /* we can close the reference safely without
+        * the map's refcount falling to 0
+        */
+       test_pinning_devmap__destroy(skel1);
+       skel1 = NULL;
+
+       /* now, swap the pins */
+       err = renameat2(0, pinpath1, 0, pinpath2, RENAME_EXCHANGE);
+       if (!ASSERT_OK(err, "swap pins"))
+               goto out;
+
+       /* load the object again, this time the re-use should fail */
+       skel1 = test_pinning_devmap__open_and_load();
+       if (!ASSERT_ERR_PTR(skel1, "skel_load3"))
+               goto out;
+
+out:
+       unlink(pinpath1);
+       unlink(pinpath2);
+       test_pinning_devmap__destroy(skel1);
+       test_pinning_devmap__destroy(skel2);
+}
diff --git a/tools/testing/selftests/bpf/progs/test_pinning_devmap.c b/tools/testing/selftests/bpf/progs/test_pinning_devmap.c
new file mode 100644 (file)
index 0000000..c855f8f
--- /dev/null
@@ -0,0 +1,20 @@
+// SPDX-License-Identifier: GPL-2.0
+
+#include <linux/bpf.h>
+#include <bpf/bpf_helpers.h>
+
+struct {
+       __uint(type, BPF_MAP_TYPE_DEVMAP);
+       __uint(max_entries, 1);
+       __type(key, __u32);
+       __type(value, __u32);
+       __uint(pinning, LIBBPF_PIN_BY_NAME);
+} pinmap1 SEC(".maps");
+
+struct {
+       __uint(type, BPF_MAP_TYPE_DEVMAP);
+       __uint(max_entries, 2);
+       __type(key, __u32);
+       __type(value, __u32);
+       __uint(pinning, LIBBPF_PIN_BY_NAME);
+} pinmap2 SEC(".maps");