• Andrii Nakryiko's avatar
    libbpf: Simplify look up by name of internal maps · 26071635
    Andrii Nakryiko authored
    Map name that's assigned to internal maps (.rodata, .data, .bss, etc)
    consist of a small prefix of bpf_object's name and ELF section name as
    a suffix. This makes it hard for users to "guess" the name to use for
    looking up by name with bpf_object__find_map_by_name() API.
    
    One proposal was to drop object name prefix from the map name and just
    use ".rodata", ".data", etc, names. One downside called out was that
    when multiple BPF applications are active on the host, it will be hard
    to distinguish between multiple instances of .rodata and know which BPF
    object (app) they belong to. Having few first characters, while quite
    limiting, still can give a bit of a clue, in general.
    
    Note, though, that btf_value_type_id for such global data maps (ARRAY)
    points to DATASEC type, which encodes full ELF name, so tools like
    bpftool can take advantage of this fact to "recover" full original name
    of the map. This is also the reason why for custom .data.* and .rodata.*
    maps libbpf uses only their ELF names and doesn't prepend object name at
    all.
    
    Another downside of such approach is that it is not backwards compatible
    and, among direct use of bpf_object__find_map_by_name() API, will break
    any BPF skeleton generated using bpftool that was compiled with older
    libbpf version.
    
    Instead of causing all this pain, libbpf will still generate map name
    using a combination of object name and ELF section name, but it will
    allow looking such maps up by their natural names, which correspond to
    their respective ELF section names. This means non-truncated ELF section
    names longer than 15 characters are going to be expected and supported.
    
    With such set up, we get the best of both worlds: leave small bits of
    a clue about BPF application that instantiated such maps, as well as
    making it easy for user apps to lookup such maps at runtime. In this
    sense it closes corresponding libbpf 1.0 issue ([0]).
    
    BPF skeletons will continue using full names for lookups.
    
      [0] Closes: https://github.com/libbpf/libbpf/issues/275Signed-off-by: default avatarAndrii Nakryiko <andrii@kernel.org>
    Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
    Acked-by: default avatarSong Liu <songliubraving@fb.com>
    Link: https://lore.kernel.org/bpf/20211021014404.2635234-10-andrii@kernel.org
    26071635
libbpf.c 295 KB