• Tejun Heo's avatar
    sched_ext: Fix SCX_TASK_INIT -> SCX_TASK_READY transitions in scx_ops_enable() · 9753358a
    Tejun Heo authored
    scx_ops_enable() has two task iteration loops. The first one calls
    scx_ops_init_task() on every task and the latter switches the eligible ones
    into SCX. The first loop left the tasks in SCX_TASK_INIT state and then the
    second loop switched it into READY before switching the task into SCX.
    
    The distinction between INIT and READY is only meaningful in the fork path
    where it's used to tell whether the task finished forking so that we can
    tell ops.exit_task() accordingly. Leaving task in INIT state between the two
    loops is incosistent with the fork path and incorrect. The following can be
    triggered by running a program which keeps toggling a task between
    SCHED_OTHER and SCHED_SCX while enabling a task:
    
      sched_ext: Invalid task state transition 1 -> 3 for fish[1526]
      WARNING: CPU: 2 PID: 1615 at kernel/sched/ext.c:3393 scx_ops_enable_task+0x1a1/0x200
      ...
      Sched_ext: qmap (enabling+all)
      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 transitioning to READY in the first loop right after
    scx_ops_init_task() succeeds.
    Signed-off-by: default avatarTejun Heo <tj@kernel.org>
    Cc: David Vernet <void@manifault.com>
    9753358a
ext.c 204 KB