• Martin KaFai Lau's avatar
    bpf: btf: Introduce BTF ID · 78958fca
    Martin KaFai Lau authored
    This patch gives an ID to each loaded BTF.  The ID is allocated by
    the idr like the existing prog-id and map-id.
    
    The bpf_put(map->btf) is moved to __bpf_map_put() so that the
    userspace can stop seeing the BTF ID ASAP when the last BTF
    refcnt is gone.
    
    It also makes BTF accessible from userspace through the
    1. new BPF_BTF_GET_FD_BY_ID command.  It is limited to CAP_SYS_ADMIN
       which is inline with the BPF_BTF_LOAD cmd and the existing
       BPF_[MAP|PROG]_GET_FD_BY_ID cmd.
    2. new btf_id (and btf_key_id + btf_value_id) in "struct bpf_map_info"
    
    Once the BTF ID handler is accessible from userspace, freeing a BTF
    object has to go through a rcu period.  The BPF_BTF_GET_FD_BY_ID cmd
    can then be done under a rcu_read_lock() instead of taking
    spin_lock.
    [Note: A similar rcu usage can be done to the existing
           bpf_prog_get_fd_by_id() in a follow up patch]
    
    When processing the BPF_BTF_GET_FD_BY_ID cmd,
    refcount_inc_not_zero() is needed because the BTF object
    could be already in the rcu dead row .  btf_get() is
    removed since its usage is currently limited to btf.c
    alone.  refcount_inc() is used directly instead.
    Signed-off-by: default avatarMartin KaFai Lau <kafai@fb.com>
    Acked-by: default avatarAlexei Starovoitov <ast@fb.com>
    Acked-by: default avatarSong Liu <songliubraving@fb.com>
    Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
    78958fca
btf.c 53.2 KB