• Andrii Nakryiko's avatar
    selftests/bpf: Fix btfgen tests · b03e1946
    Andrii Nakryiko authored
    There turned out to be a few problems with btfgen selftests.
    
    First, core_btfgen tests are failing in BPF CI due to the use of
    full-featured bpftool, which has extra dependencies on libbfd, libcap,
    etc, which are present in BPF CI's build environment, but those shared
    libraries are missing in QEMU image in which test_progs is running.
    
    To fix this problem, use minimal bootstrap version of bpftool instead.
    It only depend on libelf and libz, same as libbpf, so doesn't add any
    new requirements (and bootstrap bpftool still implementes entire
    `bpftool gen` functionality, which is quite convenient).
    
    Second problem is even more interesting. Both core_btfgen and core_reloc
    reuse the same set of struct core_reloc_test_case array of test case
    definitions. That in itself is not a problem, but btfgen test replaces
    test_case->btf_src_file property with the path to temporary file into
    which minimized BTF is output by bpftool. This interferes with original
    core_reloc tests, depending on order of tests execution (core_btfgen is
    run first in sequential mode and skrews up subsequent core_reloc run by
    pointing to already deleted temporary file, instead of the original BTF
    files) and whether those two runs share the same process (in parallel
    mode the chances are high for them to run in two separate processes and
    so not interfere with each other).
    
    To prevent this interference, create and use local copy of a test
    definition. Mark original array as constant to catch accidental
    modifcations. Note that setup_type_id_case_success() and
    setup_type_id_case_success() still modify common test_case->output
    memory area, but it is ok as each setup function has to re-initialize it
    completely anyways. In sequential mode it leads to deterministic and
    correct initialization. In parallel mode they will either each have
    their own process, or if core_reloc and core_btfgen happen to be run by
    the same worker process, they will still do that sequentially within the
    worker process. If they are sharded across multiple processes, they
    don't really share anything anyways.
    
    Also, rename core_btfgen into core_reloc_btfgen, as it is indeed just
    a "flavor" of core_reloc test, not an independent set of tests. So make
    it more obvious.
    
    Last problem that needed solving was that location of bpftool differs
    between test_progs and test_progs' flavors (e.g., test_progs-no_alu32).
    To keep it simple, create a symlink to bpftool both inside
    selftests/bpf/ directory and selftests/bpf/<flavor> subdirectory. That
    way, from inside core_reloc test, location to bpftool is just "./bpftool".
    
    v2->v3:
      - fix bpftool location relative the test_progs-no_alu32;
    v1->v2:
      - fix corruption of core_reloc_test_case.
    
    Fixes: 704c91e5 ("selftests/bpf: Test "bpftool gen min_core_btf")
    Signed-off-by: default avatarAndrii Nakryiko <andrii@kernel.org>
    Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
    Acked-by: default avatarYucong Sun <sunyucong@gmail.com>
    Link: https://lore.kernel.org/bpf/20220220042720.3336684-1-andrii@kernel.org
    b03e1946
Makefile 21.1 KB