On Tue, Sep 14, 2021 at 3:23 AM Andrii Nakryiko <andrii.nakryiko@xxxxxxxxx> wrote: > > On Mon, Sep 13, 2021 at 12:39 PM Yucong Sun <fallentree@xxxxxx> wrote: > > > > From: Yucong Sun <sunyucong@xxxxxxxxx> > > > > This patch adds a simple name list to pin some tests that fail to run in > > parallel to worker 0. On encountering these tests, all other threads will wait > > on a conditional variable, which worker 0 will signal once the tests has > > finished running. > > > > Additionally, before running the test, thread 0 also check and wait until all > > other threads has finished their work, to make sure the pinned test really are > > the only test running in the system. > > > > After this change, all tests should pass in '-j' mode. > > > > Signed-off-by: Yucong Sun <sunyucong@xxxxxxxxx> > > --- > > tools/testing/selftests/bpf/test_progs.c | 109 ++++++++++++++++++++--- > > 1 file changed, 97 insertions(+), 12 deletions(-) > > > > diff --git a/tools/testing/selftests/bpf/test_progs.c b/tools/testing/selftests/bpf/test_progs.c > > index f0eeb17c348d..dc72b3f526a6 100644 > > --- a/tools/testing/selftests/bpf/test_progs.c > > +++ b/tools/testing/selftests/bpf/test_progs.c > > @@ -18,6 +18,16 @@ > > #include <sys/socket.h> > > #include <sys/un.h> > > > > +char *TESTS_MUST_SERIALIZE[] = { > > + "netcnt", > > + "select_reuseport", > > + "sockmap_listen", > > + "tc_redirect", > > + "xdp_bonding", > > + "xdp_info", > > + NULL, > > +}; > > + > > I was actually thinking to encode this as part of the test function > name itself. I.e., > > void test_vmlinux(void) for parallelizable tests > > and > > void serial_test_vmlinux(void) > > > Then we can use weak symbols to "detect" which one is actually defined > for any given test.: > > struct prog_test_def { > void (*run_test)(void); > void (*run_test_serial)(void); > ... > }; > > then test_progs.c will define > > #define DEFINE_TEST(name) extern void test_##name(void) __weak; extern > void serial_test_##name(void) __weak; > > and that prog_test_def (though another DEFINE_TEST macro definition) > will be initialized as > > { > .test_name = #name, > .run_test = &test_##name, > .run_test_serial = &serial_test_##name, > } > > > After all that checking which of .run_test or .run_test_serial isn't > NULL (and erroring out if both or neither) will determine whether the > test is serial or parallel. Keeping this knowledge next to test itself > is nice in that it will never get out of sync, will never be > mismatched, etc (and it's very obvious when looking at the test file > itself). > > Thoughts? Great idea! I ended up doing "serial_test_NAME()" and "run_serial_test()", but the idea is the same. > > > [...]