Re: [PATCH bpf-next 8/8] selftests/bpf: add arraymap test for bpf_for_each_map_elem() helper

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

 



On Mon, Feb 8, 2021 at 10:50 PM Yonghong Song <yhs@xxxxxx> wrote:
>
>
>
> On 2/8/21 10:35 AM, Andrii Nakryiko wrote:
> > On Thu, Feb 4, 2021 at 5:53 PM Yonghong Song <yhs@xxxxxx> wrote:
> >>
> >> A test is added for arraymap and percpu arraymap. The test also
> >> exercises the early return for the helper which does not
> >> traverse all elements.
> >>      $ ./test_progs -n 44
> >>      #44/1 hash_map:OK
> >>      #44/2 array_map:OK
> >>      #44 for_each:OK
> >>      Summary: 1/2 PASSED, 0 SKIPPED, 0 FAILED
> >>
> >> Signed-off-by: Yonghong Song <yhs@xxxxxx>
> >> ---
> >>   .../selftests/bpf/prog_tests/for_each.c       | 54 ++++++++++++++
> >>   .../bpf/progs/for_each_array_map_elem.c       | 71 +++++++++++++++++++
> >>   2 files changed, 125 insertions(+)
> >>   create mode 100644 tools/testing/selftests/bpf/progs/for_each_array_map_elem.c
> >>
> >
> > [...]
> >
> >> +
> >> +       arraymap_fd = bpf_map__fd(skel->maps.arraymap);
> >> +       expected_total = 0;
> >> +       max_entries = bpf_map__max_entries(skel->maps.arraymap);
> >> +       for (i = 0; i < max_entries; i++) {
> >> +               key = i;
> >> +               val = i + 1;
> >> +               /* skip the last iteration for expected total */
> >> +               if (i != max_entries - 1)
> >> +                       expected_total += val;
> >> +               err = bpf_map_update_elem(arraymap_fd, &key, &val, BPF_ANY);
> >> +               if (CHECK(err, "map_update", "map_update failed\n"))
> >> +                       goto out;
> >> +       }
> >> +
> >> +       num_cpus = bpf_num_possible_cpus();
> >> +        percpu_map_fd = bpf_map__fd(skel->maps.percpu_map);
> >
> > formatting is off, please check with checkfile.pl
>
> Sure. will do.
>
> >
> >
> >> +        percpu_valbuf = malloc(sizeof(__u64) * num_cpus);
> >> +        if (CHECK_FAIL(!percpu_valbuf))
> >
> > please don't use CHECK_FAIL, ASSERT_PTR_OK would work nicely here
>
> Okay.
>
> >
> >> +                goto out;
> >> +
> >> +       key = 0;
> >> +        for (i = 0; i < num_cpus; i++)
> >> +                percpu_valbuf[i] = i + 1;
> >> +       err = bpf_map_update_elem(percpu_map_fd, &key, percpu_valbuf, BPF_ANY);
> >> +       if (CHECK(err, "percpu_map_update", "map_update failed\n"))
> >> +               goto out;
> >> +
> >> +       do_dummy_read(skel->progs.dump_task);
> >
> > see previous patch, iter/tasks seems like an overkill for these tests
>
> Yes, will use bpf_prog_test_run() in v2.
>
> >
> >> +
> >> +       ASSERT_EQ(skel->bss->called, 1, "called");
> >> +       ASSERT_EQ(skel->bss->arraymap_output, expected_total, "array_output");
> >> +       ASSERT_EQ(skel->bss->cpu + 1, skel->bss->percpu_val, "percpu_val");
> >> +
> >> +out:
> >> +       free(percpu_valbuf);
> >> +       for_each_array_map_elem__destroy(skel);
> >> +}
> >> +
> >
> > [...]
> >
> >> +SEC("iter/task")
> >> +int dump_task(struct bpf_iter__task *ctx)
> >> +{
> >> +       struct seq_file *seq =  ctx->meta->seq;
> >> +       struct task_struct *task = ctx->task;
> >> +       struct callback_ctx data;
> >> +
> >> +       /* only call once */
> >> +       if (called > 0)
> >> +               return 0;
> >> +
> >> +       called++;
> >> +
> >> +       data.output = 0;
> >> +       bpf_for_each_map_elem(&arraymap, check_array_elem, &data, 0);
> >> +       arraymap_output = data.output;
> >> +
> >> +       bpf_for_each_map_elem(&percpu_map, check_percpu_elem, 0, 0);
> >
> > nit: NULL, 0 ?
>
> We do not NULL defined in vmlinux.h or bpf_helpers.h. Hence I am using
> 0, I should at least use (void *)0 here, I think.

yeah, this NULL problem is annoying. Let's just add NULL to vmlinux.h,
you are not the first one to complain. We can do that separately from
this patch set, of course.

>
> >
> >> +
> >> +       return 0;
> >> +}
> >> --
> >> 2.24.1
> >>



[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