• Joanne Koong's avatar
    bpf: Add bpf_loop helper · e6f2dd0f
    Joanne Koong authored
    This patch adds the kernel-side and API changes for a new helper
    function, bpf_loop:
    
    long bpf_loop(u32 nr_loops, void *callback_fn, void *callback_ctx,
    u64 flags);
    
    where long (*callback_fn)(u32 index, void *ctx);
    
    bpf_loop invokes the "callback_fn" **nr_loops** times or until the
    callback_fn returns 1. The callback_fn can only return 0 or 1, and
    this is enforced by the verifier. The callback_fn index is zero-indexed.
    
    A few things to please note:
    ~ The "u64 flags" parameter is currently unused but is included in
    case a future use case for it arises.
    ~ In the kernel-side implementation of bpf_loop (kernel/bpf/bpf_iter.c),
    bpf_callback_t is used as the callback function cast.
    ~ A program can have nested bpf_loop calls but the program must
    still adhere to the verifier constraint of its stack depth (the stack depth
    cannot exceed MAX_BPF_STACK))
    ~ Recursive callback_fns do not pass the verifier, due to the call stack
    for these being too deep.
    ~ The next patch will include the tests and benchmark
    Signed-off-by: default avatarJoanne Koong <joannekoong@fb.com>
    Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
    Acked-by: default avatarAndrii Nakryiko <andrii@kernel.org>
    Link: https://lore.kernel.org/bpf/20211130030622.4131246-2-joannekoong@fb.com
    e6f2dd0f
verifier.c 402 KB