Re: [PATCH v2 4/4] selftests/bpf: ringbuf, mmap: bump up page size to 64K

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Fri, Mar 26, 2021 at 5:24 AM Yauheni Kaliuta
<yauheni.kaliuta@xxxxxxxxxx> wrote:
>
> Both ringbuf and mmap need PAGE_SIZE, but it's not available during
> bpf program compile time. 4K size was hardcoded (page shift 12 bits)
> which makes the tests fail on systems, configured for larger pages.
>
> Bump it up to 64K which at the first glance look reasonable at the
> moment for most of the systems.
>
> Use define to make it clear.
>
> Signed-off-by: Yauheni Kaliuta <yauheni.kaliuta@xxxxxxxxxx>
> ---
>  tools/testing/selftests/bpf/prog_tests/ringbuf.c       |  9 +++++++--
>  tools/testing/selftests/bpf/progs/map_ptr_kern.c       |  9 +++++++--
>  tools/testing/selftests/bpf/progs/test_mmap.c          | 10 ++++++++--
>  tools/testing/selftests/bpf/progs/test_ringbuf.c       |  8 +++++++-
>  tools/testing/selftests/bpf/progs/test_ringbuf_multi.c |  7 ++++++-
>  5 files changed, 35 insertions(+), 8 deletions(-)
>
> diff --git a/tools/testing/selftests/bpf/prog_tests/ringbuf.c b/tools/testing/selftests/bpf/prog_tests/ringbuf.c
> index fddbc5db5d6a..9057654da957 100644
> --- a/tools/testing/selftests/bpf/prog_tests/ringbuf.c
> +++ b/tools/testing/selftests/bpf/prog_tests/ringbuf.c
> @@ -15,6 +15,11 @@
>  #include "test_ringbuf.skel.h"
>
>  #define EDONE 7777
> +#ifdef PAGE_SIZE
> +#undef PAGE_SIZE
> +#endif
> +/* this is not actual page size, but the value used for ringbuf */
> +#define PAGE_SIZE 65536
>
>  static int duration = 0;
>
> @@ -110,9 +115,9 @@ void test_ringbuf(void)
>         CHECK(skel->bss->avail_data != 3 * rec_sz,
>               "err_avail_size", "exp %ld, got %ld\n",
>               3L * rec_sz, skel->bss->avail_data);
> -       CHECK(skel->bss->ring_size != 4096,
> +       CHECK(skel->bss->ring_size != PAGE_SIZE,
>               "err_ring_size", "exp %ld, got %ld\n",
> -             4096L, skel->bss->ring_size);
> +             (long)PAGE_SIZE, skel->bss->ring_size);
>         CHECK(skel->bss->cons_pos != 0,
>               "err_cons_pos", "exp %ld, got %ld\n",
>               0L, skel->bss->cons_pos);
> diff --git a/tools/testing/selftests/bpf/progs/map_ptr_kern.c b/tools/testing/selftests/bpf/progs/map_ptr_kern.c
> index d8850bc6a9f1..c1460f27af78 100644
> --- a/tools/testing/selftests/bpf/progs/map_ptr_kern.c
> +++ b/tools/testing/selftests/bpf/progs/map_ptr_kern.c
> @@ -8,6 +8,11 @@
>  #define MAX_ENTRIES 8
>  #define HALF_ENTRIES (MAX_ENTRIES >> 1)
>
> +#ifndef PAGE_SIZE
> +/* use reasonable value for various configurations */
> +#define PAGE_SIZE 65536
> +#endif
> +
>  _Static_assert(MAX_ENTRIES < LOOP_BOUND, "MAX_ENTRIES must be < LOOP_BOUND");
>
>  enum bpf_map_type g_map_type = BPF_MAP_TYPE_UNSPEC;
> @@ -635,7 +640,7 @@ struct bpf_ringbuf_map {
>
>  struct {
>         __uint(type, BPF_MAP_TYPE_RINGBUF);
> -       __uint(max_entries, 1 << 12);
> +       __uint(max_entries, PAGE_SIZE);
>  } m_ringbuf SEC(".maps");
>
>  static inline int check_ringbuf(void)
> @@ -643,7 +648,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;
>  }
> diff --git a/tools/testing/selftests/bpf/progs/test_mmap.c b/tools/testing/selftests/bpf/progs/test_mmap.c
> index 4eb42cff5fe9..c22fcfea0767 100644
> --- a/tools/testing/selftests/bpf/progs/test_mmap.c
> +++ b/tools/testing/selftests/bpf/progs/test_mmap.c
> @@ -5,11 +5,16 @@
>  #include <stdint.h>
>  #include <bpf/bpf_helpers.h>
>
> +#ifndef PAGE_SIZE
> +/* use reasonable value for various configurations */
> +#define PAGE_SIZE 65536
> +#endif
> +
>  char _license[] SEC("license") = "GPL";
>
>  struct {
>         __uint(type, BPF_MAP_TYPE_ARRAY);
> -       __uint(max_entries, 4096);
> +       __uint(max_entries, PAGE_SIZE);


so you can set map size at runtime before bpf_object__load (or
skeleton's load) with bpf_map__set_max_entries. That way you don't
have to do any assumptions. Just omit max_entries in BPF source code,
and always set it in userspace.

>         __uint(map_flags, BPF_F_MMAPABLE | BPF_F_RDONLY_PROG);
>         __type(key, __u32);
>         __type(value, char);
> @@ -17,7 +22,8 @@ struct {
>
>  struct {
>         __uint(type, BPF_MAP_TYPE_ARRAY);
> -       __uint(max_entries, 512 * 4); /* at least 4 pages of data */
> +       /* at least 4 pages of data */
> +       __uint(max_entries, 4 * (PAGE_SIZE / sizeof (__u64)));
>         __uint(map_flags, BPF_F_MMAPABLE);
>         __type(key, __u32);
>         __type(value, __u64);
> diff --git a/tools/testing/selftests/bpf/progs/test_ringbuf.c b/tools/testing/selftests/bpf/progs/test_ringbuf.c
> index 8ba9959b036b..6e645babdc18 100644
> --- a/tools/testing/selftests/bpf/progs/test_ringbuf.c
> +++ b/tools/testing/selftests/bpf/progs/test_ringbuf.c
> @@ -4,6 +4,12 @@
>  #include <linux/bpf.h>
>  #include <bpf/bpf_helpers.h>
>
> +#ifndef PAGE_SIZE
> +/* use reasonable value for various configurations */
> +#define PAGE_SIZE 65536
> +#endif
> +
> +
>  char _license[] SEC("license") = "GPL";
>
>  struct sample {
> @@ -15,7 +21,7 @@ struct sample {
>
>  struct {
>         __uint(type, BPF_MAP_TYPE_RINGBUF);
> -       __uint(max_entries, 1 << 12);
> +       __uint(max_entries, PAGE_SIZE);
>  } ringbuf SEC(".maps");
>
>  /* inputs */
> diff --git a/tools/testing/selftests/bpf/progs/test_ringbuf_multi.c b/tools/testing/selftests/bpf/progs/test_ringbuf_multi.c
> index edf3b6953533..13bcf095e06c 100644
> --- a/tools/testing/selftests/bpf/progs/test_ringbuf_multi.c
> +++ b/tools/testing/selftests/bpf/progs/test_ringbuf_multi.c
> @@ -4,6 +4,11 @@
>  #include <linux/bpf.h>
>  #include <bpf/bpf_helpers.h>
>
> +#ifndef PAGE_SIZE
> +/* use reasonable value for various configurations */
> +#define PAGE_SIZE 65536
> +#endif
> +
>  char _license[] SEC("license") = "GPL";
>
>  struct sample {
> @@ -15,7 +20,7 @@ struct sample {
>
>  struct ringbuf_map {
>         __uint(type, BPF_MAP_TYPE_RINGBUF);
> -       __uint(max_entries, 1 << 12);
> +       __uint(max_entries, PAGE_SIZE);
>  } ringbuf1 SEC(".maps"),
>    ringbuf2 SEC(".maps");
>
> --
> 2.29.2
>



[Index of Archives]     [Linux Samsung SoC]     [Linux Rockchip SoC]     [Linux Actions SoC]     [Linux for Synopsys ARC Processors]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]


  Powered by Linux