• Kumar Kartikeya Dwivedi's avatar
    bpf: Introduce mem, size argument pair support for kfunc · d583691c
    Kumar Kartikeya Dwivedi authored
    BPF helpers can associate two adjacent arguments together to pass memory
    of certain size, using ARG_PTR_TO_MEM and ARG_CONST_SIZE arguments.
    Since we don't use bpf_func_proto for kfunc, we need to leverage BTF to
    implement similar support.
    
    The ARG_CONST_SIZE processing for helpers is refactored into a common
    check_mem_size_reg helper that is shared with kfunc as well. kfunc
    ptr_to_mem support follows logic similar to global functions, where
    verification is done as if pointer is not null, even when it may be
    null.
    
    This leads to a simple to follow rule for writing kfunc: always check
    the argument pointer for NULL, except when it is PTR_TO_CTX. Also, the
    PTR_TO_CTX case is also only safe when the helper expecting pointer to
    program ctx is not exposed to other programs where same struct is not
    ctx type. In that case, the type check will fall through to other cases
    and would permit passing other types of pointers, possibly NULL at
    runtime.
    
    Currently, we require the size argument to be suffixed with "__sz" in
    the parameter name. This information is then recorded in kernel BTF and
    verified during function argument checking. In the future we can use BTF
    tagging instead, and modify the kernel function definitions. This will
    be a purely kernel-side change.
    
    This allows us to have some form of backwards compatibility for
    structures that are passed in to the kernel function with their size,
    and allow variable length structures to be passed in if they are
    accompanied by a size parameter.
    Signed-off-by: default avatarKumar Kartikeya Dwivedi <memxor@gmail.com>
    Link: https://lore.kernel.org/r/20220114163953.1455836-5-memxor@gmail.comSigned-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
    d583691c
btf.c 182 KB