On Thu, Feb 25, 2021 at 1:35 AM Yonghong Song <yhs@xxxxxx> wrote: > > A test case is added for hashmap and percpu hashmap. The test > also exercises nested bpf_for_each_map_elem() calls like > bpf_prog: > bpf_for_each_map_elem(func1) > func1: > bpf_for_each_map_elem(func2) > func2: > > $ ./test_progs -n 45 > #45/1 hash_map:OK > #45 for_each:OK > Summary: 1/1 PASSED, 0 SKIPPED, 0 FAILED > > Signed-off-by: Yonghong Song <yhs@xxxxxx> > --- I think I'll just add all the variants of ASSERT_XXX and will enforce their use :) For now: Acked-by: Andrii Nakryiko <andrii@xxxxxxxxxx> > .../selftests/bpf/prog_tests/for_each.c | 74 +++++++++++++++ > .../bpf/progs/for_each_hash_map_elem.c | 95 +++++++++++++++++++ > 2 files changed, 169 insertions(+) > create mode 100644 tools/testing/selftests/bpf/prog_tests/for_each.c > create mode 100644 tools/testing/selftests/bpf/progs/for_each_hash_map_elem.c > [...] > + > + ASSERT_EQ(skel->bss->hashmap_output, 4, "hashmap_output"); > + ASSERT_EQ(skel->bss->hashmap_elems, max_entries, "hashmap_elems"); > + > + key = 1; > + err = bpf_map_lookup_elem(hashmap_fd, &key, &val); > + ASSERT_ERR(err, "hashmap_lookup"); > + > + ASSERT_EQ(skel->bss->percpu_called, 1, "percpu_called"); > + ASSERT_EQ(skel->bss->cpu < num_cpus, 1, "num_cpus"); well, this is cheating (it will print something like "0 != 1" on error) :) why didn't you just add ASSERT_LT? > + ASSERT_EQ(skel->bss->percpu_map_elems, 1, "percpu_map_elems"); > + ASSERT_EQ(skel->bss->percpu_key, 1, "percpu_key"); > + ASSERT_EQ(skel->bss->percpu_val, skel->bss->cpu + 1, "percpu_val"); > + ASSERT_EQ(skel->bss->percpu_output, 100, "percpu_output"); > +out: > + free(percpu_valbuf); > + for_each_hash_map_elem__destroy(skel); > +} > + > +void test_for_each(void) > +{ > + if (test__start_subtest("hash_map")) > + test_hash_map(); > +} [...] > +int hashmap_output = 0; > +int hashmap_elems = 0; > +int percpu_map_elems = 0; > + > +SEC("classifier/") nit: just "classifier" didn't work? > +int test_pkt_access(struct __sk_buff *skb) > +{ > + struct callback_ctx data; > + > + data.ctx = skb; > + data.input = 10; > + data.output = 0; > + hashmap_elems = bpf_for_each_map_elem(&hashmap, check_hash_elem, &data, 0); > + hashmap_output = data.output; > + > + percpu_map_elems = bpf_for_each_map_elem(&percpu_map, check_percpu_elem, > + (void *)0, 0); > + return 0; > +} > -- > 2.24.1 >