On Mon, 29 Apr 2024 at 18:57, Siddharth Chintamaneni <sidchintamaneni@xxxxxxxxx> wrote: > > From: Siddharth Chintamaneni <sidchintamaneni@xxxxxx> > > Added selftests to check for nested deadlocks in queue > and stack maps. > > Signed-off-by: Siddharth Chintamaneni <sidchintamaneni@xxxxxx> > --- Forgot to remind in the previous reply, but: For the patch subject, use 'bpf:' prefix for kernel patches, and 'selftests/bpf:' for selftests, see the commit logs in bpf-next for examples. > .../prog_tests/test_queue_stack_nested_map.c | 48 ++++++++++++++ > .../bpf/progs/test_queue_stack_nested_map.c | 62 +++++++++++++++++++ > 2 files changed, 110 insertions(+) > create mode 100644 tools/testing/selftests/bpf/prog_tests/test_queue_stack_nested_map.c > create mode 100644 tools/testing/selftests/bpf/progs/test_queue_stack_nested_map.c > > diff --git a/tools/testing/selftests/bpf/prog_tests/test_queue_stack_nested_map.c b/tools/testing/selftests/bpf/prog_tests/test_queue_stack_nested_map.c > new file mode 100644 > index 000000000000..731e958419eb > --- /dev/null > +++ b/tools/testing/selftests/bpf/prog_tests/test_queue_stack_nested_map.c > @@ -0,0 +1,48 @@ > +// SPDX-License-Identifier: GPL-2.0 > +#include <test_progs.h> > +#include <network_helpers.h> > + > +#include "test_queue_stack_nested_map.skel.h" > + > + > +static void test_map_queue_stack_nesting_success(bool is_map_queue) > +{ > + struct test_queue_stack_nested_map *skel; > + int err; > + int prog_fd; > + > + LIBBPF_OPTS(bpf_test_run_opts, ropts); > + > + skel = test_queue_stack_nested_map__open_and_load(); > + if (!ASSERT_OK_PTR(skel, "test_queue_stack_nested_map__open_and_load")) > + goto out; > + > + err = test_queue_stack_nested_map__attach(skel); > + if (!ASSERT_OK(err, "test_queue_stack_nested_map__attach")) > + goto out; > + > + if (is_map_queue) { > + prog_fd = bpf_program__fd(skel->progs.test_queue_nesting); > + err = bpf_prog_test_run_opts(prog_fd, &ropts); > + ASSERT_OK(err, "test_nested_queue_map_run"); Maybe you can also check the ropts.optval to ensure we get -EBUSY? I.e. return the value of map push/pop from the program and then check it here? It can be set in a global variable from the program triggering the deadlock, and then you could return the value back as the return value of the program. If fentry has restrictions on the return code, you could try other program types which work in test_run_opts (like SEC("tc")), there are many examples in selftests using such programs. > [...] > >