• Chuyi Zhou's avatar
    bpf: Let bpf_iter_task_new accept null task ptr · cb3ecf79
    Chuyi Zhou authored
    When using task_iter to iterate all threads of a specific task, we enforce
    that the user must pass a valid task pointer to ensure safety. However,
    when iterating all threads/process in the system, BPF verifier still
    require a valid ptr instead of "nullable" pointer, even though it's
    pointless, which is a kind of surprising from usability standpoint. It
    would be nice if we could let that kfunc accept a explicit null pointer
    when we are using BPF_TASK_ITER_ALL_{PROCS, THREADS} and a valid pointer
    when using BPF_TASK_ITER_THREAD.
    
    Given a trival kfunc:
    	__bpf_kfunc void FN(struct TYPE_A *obj);
    
    BPF Prog would reject a nullptr for obj. The error info is:
    "arg#x pointer type xx xx must point to scalar, or struct with scalar"
    reported by get_kfunc_ptr_arg_type(). The reg->type is SCALAR_VALUE and
    the btf type of ref_t is not scalar or scalar_struct which leads to the
    rejection of get_kfunc_ptr_arg_type.
    
    This patch add "__nullable" annotation:
    	__bpf_kfunc void FN(struct TYPE_A *obj__nullable);
    Here __nullable indicates obj can be optional, user can pass a explicit
    nullptr or a normal TYPE_A pointer. In get_kfunc_ptr_arg_type(), we will
    detect whether the current arg is optional and register is null, If so,
    return a new kfunc_ptr_arg_type KF_ARG_PTR_TO_NULL and skip to the next
    arg in check_kfunc_args().
    Signed-off-by: default avatarChuyi Zhou <zhouchuyi@bytedance.com>
    Acked-by: default avatarAndrii Nakryiko <andrii@kernel.org>
    Link: https://lore.kernel.org/r/20231018061746.111364-7-zhouchuyi@bytedance.comSigned-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
    cb3ecf79
task_iter.c 26.2 KB