selftests/bpf: Pass page size from userspace in map_ptr
authorYauheni Kaliuta <yauheni.kaliuta@redhat.com>
Thu, 8 Apr 2021 06:13:05 +0000 (09:13 +0300)
committerAndrii Nakryiko <andrii@kernel.org>
Fri, 9 Apr 2021 06:54:47 +0000 (23:54 -0700)
Use ASSERT to check result but keep CHECK where format was used to
report error.

Use bpf_map__set_max_entries() to set map size dynamically from
userspace according to page size.

Zero-initialize the variable in bpf prog, otherwise it will cause
problems on some versions of Clang.

Signed-off-by: Yauheni Kaliuta <yauheni.kaliuta@redhat.com>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Link: https://lore.kernel.org/bpf/20210408061310.95877-4-yauheni.kaliuta@redhat.com
tools/testing/selftests/bpf/prog_tests/map_ptr.c
tools/testing/selftests/bpf/progs/map_ptr_kern.c

index c230a57..4972f92 100644 (file)
@@ -12,11 +12,22 @@ void test_map_ptr(void)
        __u32 duration = 0, retval;
        char buf[128];
        int err;
+       int page_size = getpagesize();
 
-       skel = map_ptr_kern__open_and_load();
-       if (CHECK(!skel, "skel_open_load", "open_load failed\n"))
+       skel = map_ptr_kern__open();
+       if (!ASSERT_OK_PTR(skel, "skel_open"))
                return;
 
+       err = bpf_map__set_max_entries(skel->maps.m_ringbuf, page_size);
+       if (!ASSERT_OK(err, "bpf_map__set_max_entries"))
+               goto cleanup;
+
+       err = map_ptr_kern__load(skel);
+       if (!ASSERT_OK(err, "skel_load"))
+               goto cleanup;
+
+       skel->bss->page_size = page_size;
+
        err = bpf_prog_test_run(bpf_program__fd(skel->progs.cg_skb), 1, &pkt_v4,
                                sizeof(pkt_v4), buf, NULL, &retval, NULL);
 
index d8850bc..d1d304c 100644 (file)
@@ -12,6 +12,7 @@ _Static_assert(MAX_ENTRIES < LOOP_BOUND, "MAX_ENTRIES must be < LOOP_BOUND");
 
 enum bpf_map_type g_map_type = BPF_MAP_TYPE_UNSPEC;
 __u32 g_line = 0;
+int page_size = 0; /* userspace should set it */
 
 #define VERIFY_TYPE(type, func) ({     \
        g_map_type = type;              \
@@ -635,7 +636,6 @@ struct bpf_ringbuf_map {
 
 struct {
        __uint(type, BPF_MAP_TYPE_RINGBUF);
-       __uint(max_entries, 1 << 12);
 } m_ringbuf SEC(".maps");
 
 static inline int check_ringbuf(void)
@@ -643,7 +643,7 @@ static inline int check_ringbuf(void)
        struct bpf_ringbuf_map *ringbuf = (struct bpf_ringbuf_map *)&m_ringbuf;
        struct bpf_map *map = (struct bpf_map *)&m_ringbuf;
 
-       VERIFY(check(&ringbuf->map, map, 0, 0, 1 << 12));
+       VERIFY(check(&ringbuf->map, map, 0, 0, page_size));
 
        return 1;
 }