• David Vernet's avatar
    scx: Allow calling sleepable kfuncs from BPF_PROG_TYPE_SYSCALL · 298dec19
    David Vernet authored
    We currently only allow calling sleepable scx kfuncs (i.e.
    scx_bpf_create_dsq()) from BPF_PROG_TYPE_STRUCT_OPS progs. The idea here
    was that we'd never have to call scx_bpf_create_dsq() outside of a
    sched_ext struct_ops callback, but that might not actually be true. For
    example, a scheduler could do something like the following:
    
    1. Open and load (not yet attach) a scheduler skel
    
    2. Synchronously call into a BPF_PROG_TYPE_SYSCALL prog from user space.
       For example, to initialize an LLC domain, or some other global,
       read-only state.
    
    3. Attach the skel, which actually enables the scheduler
    
    The advantage of doing this is that it can preclude having to do pretty
    ugly boilerplate like initializing a read-only, statically sized array of
    u64[]'s which the kernel consumes literally once at init time to then
    create struct bpf_cpumask objects which are actually queried at runtime.
    
    Doing the above is already possible given that we can invoke core BPF
    kfuncs, such as bpf_cpumask_create(), from BPF_PROG_TYPE_SYSCALL progs. We
    already allow many scx kfuncs to be called from BPF_PROG_TYPE_SYSCALL progs
    (e.g. scx_bpf_kick_cpu()). Let's allow the sleepable kfuncs as well.
    Signed-off-by: default avatarDavid Vernet <void@manifault.com>
    Signed-off-by: default avatarTejun Heo <tj@kernel.org>
    298dec19
ext.c 184 KB