• Andrii Nakryiko's avatar
    libbpf: Unify low-level BPF_PROG_LOAD APIs into bpf_prog_load() · d10ef2b8
    Andrii Nakryiko authored
    Add a new unified OPTS-based low-level API for program loading,
    bpf_prog_load() ([0]).  bpf_prog_load() accepts few "mandatory"
    parameters as input arguments (program type, name, license,
    instructions) and all the other optional (as in not required to specify
    for all types of BPF programs) fields into struct bpf_prog_load_opts.
    
    This makes all the other non-extensible APIs variant for BPF_PROG_LOAD
    obsolete and they are slated for deprecation in libbpf v0.7:
      - bpf_load_program();
      - bpf_load_program_xattr();
      - bpf_verify_program().
    
    Implementation-wise, internal helper libbpf__bpf_prog_load is refactored
    to become a public bpf_prog_load() API. struct bpf_prog_load_params used
    internally is replaced by public struct bpf_prog_load_opts.
    
    Unfortunately, while conceptually all this is pretty straightforward,
    the biggest complication comes from the already existing bpf_prog_load()
    *high-level* API, which has nothing to do with BPF_PROG_LOAD command.
    
    We try really hard to have a new API named bpf_prog_load(), though,
    because it maps naturally to BPF_PROG_LOAD command.
    
    For that, we rename old bpf_prog_load() into bpf_prog_load_deprecated()
    and mark it as COMPAT_VERSION() for shared library users compiled
    against old version of libbpf. Statically linked users and shared lib
    users compiled against new version of libbpf headers will get "rerouted"
    to bpf_prog_deprecated() through a macro helper that decides whether to
    use new or old bpf_prog_load() based on number of input arguments (see
    ___libbpf_overload in libbpf_common.h).
    
    To test that existing
    bpf_prog_load()-using code compiles and works as expected, I've compiled
    and ran selftests as is. I had to remove (locally) selftest/bpf/Makefile
    -Dbpf_prog_load=bpf_prog_test_load hack because it was conflicting with
    the macro-based overload approach. I don't expect anyone else to do
    something like this in practice, though. This is testing-specific way to
    replace bpf_prog_load() calls with special testing variant of it, which
    adds extra prog_flags value. After testing I kept this selftests hack,
    but ensured that we use a new bpf_prog_load_deprecated name for this.
    
    This patch also marks bpf_prog_load() and bpf_prog_load_xattr() as deprecated.
    bpf_object interface has to be used for working with struct bpf_program.
    Libbpf doesn't support loading just a bpf_program.
    
    The silver lining is that when we get to libbpf 1.0 all these
    complication will be gone and we'll have one clean bpf_prog_load()
    low-level API with no backwards compatibility hackery surrounding it.
    
      [0] Closes: https://github.com/libbpf/libbpf/issues/284Signed-off-by: default avatarAndrii Nakryiko <andrii@kernel.org>
    Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
    Link: https://lore.kernel.org/bpf/20211103220845.2676888-4-andrii@kernel.org
    d10ef2b8
libbpf.h 38.1 KB