• Tejun Heo's avatar
    sched_ext: Enable scx_ops_init_task() separately · 4269c603
    Tejun Heo authored
    scx_ops_init_task() and the follow-up scx_ops_enable_task() in the fork path
    were gated by scx_enabled() test and thus __scx_ops_enabled had to be turned
    on before the first scx_ops_init_task() loop in scx_ops_enable(). However,
    if an external entity causes sched_class switch before the loop is complete,
    tasks which are not initialized could be switched to SCX.
    
    The following can be reproduced by running a program which keeps toggling a
    process between SCHED_OTHER and SCHED_EXT using sched_setscheduler(2).
    
      sched_ext: Invalid task state transition 0 -> 3 for fish[1623]
      WARNING: CPU: 1 PID: 1650 at kernel/sched/ext.c:3392 scx_ops_enable_task+0x1a1/0x200
      ...
      Sched_ext: simple (enabling)
      RIP: 0010:scx_ops_enable_task+0x1a1/0x200
      ...
       switching_to_scx+0x13/0xa0
       __sched_setscheduler+0x850/0xa50
       do_sched_setscheduler+0x104/0x1c0
       __x64_sys_sched_setscheduler+0x18/0x30
       do_syscall_64+0x7b/0x140
       entry_SYSCALL_64_after_hwframe+0x76/0x7e
    
    Fix it by gating scx_ops_init_task() separately using
    scx_ops_init_task_enabled. __scx_ops_enabled is now set after all tasks are
    finished with scx_ops_init_task().
    Signed-off-by: default avatarTejun Heo <tj@kernel.org>
    4269c603
ext.c 204 KB