• Andrii Nakryiko's avatar
    selftests/bpf: add generic BPF program tester-loader · 537c3f66
    Andrii Nakryiko authored
    It's become a common pattern to have a collection of small BPF programs
    in one BPF object file, each representing one test case. On user-space
    side of such tests we maintain a table of program names and expected
    failure or success, along with optional expected verifier log message.
    
    This works, but each set of tests reimplement this mundane code over and
    over again, which is a waste of time for anyone trying to add a new set
    of tests. Furthermore, it's quite error prone as it's way too easy to miss
    some entries in these manually maintained test tables (as evidences by
    dynptr_fail tests, in which ringbuf_release_uninit_dynptr subtest was
    accidentally missed; this is fixed in next patch).
    
    So this patch implements generic test_loader, which accepts skeleton
    name and handles the rest of details: opens and loads BPF object file,
    making sure each program is tested in isolation. Optionally each test
    case can specify expected BPF verifier log message. In case of failure,
    tester makes sure to report verifier log, but it also reports verifier
    log in verbose mode unconditionally.
    
    Now, the interesting deviation from existing custom implementations is
    the use of btf_decl_tag attribute to specify expected-to-fail vs
    expected-to-succeed markers and, optionally, expected log message
    directly next to BPF program source code, eliminating the need to
    manually create and update table of tests.
    
    We define few macros wrapping btf_decl_tag with a convention that all
    values of btf_decl_tag start with "comment:" prefix, and then utilizing
    a very simple "just_some_text_tag" or "some_key_name=<value>" pattern to
    define things like expected success/failure, expected verifier message,
    extra verifier log level (if necessary). This approach is demonstrated
    by next patch in which two existing sets of failure tests are converted.
    
    Tester supports both expected-to-fail and expected-to-succeed programs,
    though this patch set didn't convert any existing expected-to-succeed
    programs yet, as existing tests couple BPF program loading with their
    further execution through attach or test_prog_run. One way to allow
    testing scenarios like this would be ability to specify custom callback,
    executed for each successfully loaded BPF program. This is left for
    follow up patches, after some more analysis of existing test cases.
    
    This test_loader is, hopefully, a start of a test_verifier-like runner,
    but integrated into test_progs infrastructure. It will allow much better
    "user experience" of defining low-level verification tests that can take
    advantage of all the libbpf-provided nicety features on BPF side: global
    variables, declarative maps, etc.  All while having a choice of defining
    it in C or as BPF assembly (through __attribute__((naked)) functions and
    using embedded asm), depending on what makes most sense in each
    particular case. This will be explored in follow up patches as well.
    Acked-by: default avatarJohn Fastabend <john.fastabend@gmail.com>
    Signed-off-by: default avatarAndrii Nakryiko <andrii@kernel.org>
    Link: https://lore.kernel.org/r/20221207201648.2990661-1-andrii@kernel.orgSigned-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
    537c3f66
Makefile 24.3 KB