On Fri, Jun 3, 2022 at 7:11 AM Eduard Zingerman <eddyz87@xxxxxxxxx> wrote: > > Two new test BPF programs for test_prog selftests checking bpf_loop > behavior. Both are corner cases for bpf_loop inlinig transformation: > - check that bpf_loop behaves correctly when callback function is not > a compile time constant > - check that local function variables are not affected by allocating > additional stack storage for registers spilled by loop inlining > > Signed-off-by: Eduard Zingerman <eddyz87@xxxxxxxxx> Acked-by: Song Liu <songliubraving@xxxxxx> With some nitpick below. [...] > +static void check_stack(struct bpf_loop *skel) > +{ > + const int max_key = 12; > + struct bpf_link *link = bpf_program__attach(skel->progs.stack_check); > + int map_fd; > + > + if (!ASSERT_OK_PTR(link, "link")) > + return; > + > + map_fd = bpf_map__fd(skel->maps.map1); > + > + if (!ASSERT_GE(map_fd, 0, "bpf_map__fd")) > + goto out; > + > + for (int key = 1; key <= max_key; ++key) { Let's move the definition of i to the beginning of the function. > + int val = key; > + int err = bpf_map_update_elem(map_fd, &key, &val, BPF_NOEXIST); > + > + if (!ASSERT_OK(err, "bpf_map_update_elem")) > + goto out; > + } > + > + usleep(1); > + > + for (int key = 1; key <= max_key; ++key) { ditto. > + int val; > + int err = bpf_map_lookup_elem(map_fd, &key, &val); > + > + if (!ASSERT_OK(err, "bpf_map_lookup_elem")) > + goto out; > + if (!ASSERT_EQ(val, key + 1, "bad value in the map")) > + goto out; > + } > + > +out: > + bpf_link__destroy(link); > +} > + [...]