• Roberto Sassu's avatar
    btf: Export bpf_dynptr definition · 00f14641
    Roberto Sassu authored
    eBPF dynamic pointers is a new feature recently added to upstream. It binds
    together a pointer to a memory area and its size. The internal kernel
    structure bpf_dynptr_kern is not accessible by eBPF programs in user space.
    They instead see bpf_dynptr, which is then translated to the internal
    kernel structure by the eBPF verifier.
    
    The problem is that it is not possible to include at the same time the uapi
    include linux/bpf.h and the vmlinux BTF vmlinux.h, as they both contain the
    definition of some structures/enums. The compiler complains saying that the
    structures/enums are redefined.
    
    As bpf_dynptr is defined in the uapi include linux/bpf.h, this makes it
    impossible to include vmlinux.h. However, in some cases, e.g. when using
    kfuncs, vmlinux.h has to be included. The only option until now was to
    include vmlinux.h and add the definition of bpf_dynptr directly in the eBPF
    program source code from linux/bpf.h.
    
    Solve the problem by using the same approach as for bpf_timer (which also
    follows the same scheme with the _kern suffix for the internal kernel
    structure).
    
    Add the following line in one of the dynamic pointer helpers,
    bpf_dynptr_from_mem():
    
    BTF_TYPE_EMIT(struct bpf_dynptr);
    
    Cc: stable@vger.kernel.org
    Cc: Joanne Koong <joannelkoong@gmail.com>
    Fixes: 97e03f52 ("bpf: Add verifier support for dynptrs")
    Signed-off-by: default avatarRoberto Sassu <roberto.sassu@huawei.com>
    Acked-by: default avatarYonghong Song <yhs@fb.com>
    Tested-by: default avatarKP Singh <kpsingh@kernel.org>
    Link: https://lore.kernel.org/r/20220920075951.929132-3-roberto.sassu@huaweicloud.comSigned-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
    00f14641
helpers.c 41.9 KB