• Kumar Kartikeya Dwivedi's avatar
    bpf: Allow calling static subprogs while holding a bpf_spin_lock · a44b1334
    Kumar Kartikeya Dwivedi authored
    Currently, calling any helpers, kfuncs, or subprogs except the graph
    data structure (lists, rbtrees) API kfuncs while holding a bpf_spin_lock
    is not allowed. One of the original motivations of this decision was to
    force the BPF programmer's hand into keeping the bpf_spin_lock critical
    section small, and to ensure the execution time of the program does not
    increase due to lock waiting times. In addition to this, some of the
    helpers and kfuncs may be unsafe to call while holding a bpf_spin_lock.
    
    However, when it comes to subprog calls, atleast for static subprogs,
    the verifier is able to explore their instructions during verification.
    Therefore, it is similar in effect to having the same code inlined into
    the critical section. Hence, not allowing static subprog calls in the
    bpf_spin_lock critical section is mostly an annoyance that needs to be
    worked around, without providing any tangible benefit.
    
    Unlike static subprog calls, global subprog calls are not safe to permit
    within the critical section, as the verifier does not explore them
    during verification, therefore whether the same lock will be taken
    again, or unlocked, cannot be ascertained.
    
    Therefore, allow calling static subprogs within a bpf_spin_lock critical
    section, and only reject it in case the subprog linkage is global.
    Acked-by: default avatarYonghong Song <yonghong.song@linux.dev>
    Acked-by: default avatarDavid Vernet <void@manifault.com>
    Signed-off-by: default avatarKumar Kartikeya Dwivedi <memxor@gmail.com>
    Link: https://lore.kernel.org/r/20240204222349.938118-2-memxor@gmail.comSigned-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
    a44b1334
verifier.c 629 KB