• Alexei Starovoitov's avatar
    bpf: Add bpf_core_add_cands() and wire it into bpf_core_apply_relo_insn(). · 1e89106d
    Alexei Starovoitov authored
    Given BPF program's BTF root type name perform the following steps:
    . search in vmlinux candidate cache.
    . if (present in cache and candidate list >= 1) return candidate list.
    . do a linear search through kernel BTFs for possible candidates.
    . regardless of number of candidates found populate vmlinux cache.
    . if (candidate list >= 1) return candidate list.
    . search in module candidate cache.
    . if (present in cache) return candidate list (even if list is empty).
    . do a linear search through BTFs of all kernel modules
      collecting candidates from all of them.
    . regardless of number of candidates found populate module cache.
    . return candidate list.
    Then wire the result into bpf_core_apply_relo_insn().
    
    When BPF program is trying to CO-RE relocate a type
    that doesn't exist in either vmlinux BTF or in modules BTFs
    these steps will perform 2 cache lookups when cache is hit.
    
    Note the cache doesn't prevent the abuse by the program that might
    have lots of relocations that cannot be resolved. Hence cond_resched().
    
    CO-RE in the kernel requires CAP_BPF, since BTF loading requires it.
    Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
    Signed-off-by: default avatarAndrii Nakryiko <andrii@kernel.org>
    Acked-by: default avatarAndrii Nakryiko <andrii@kernel.org>
    Link: https://lore.kernel.org/bpf/20211201181040.23337-9-alexei.starovoitov@gmail.com
    1e89106d
btf.c 174 KB