Files
linux-stable-mirror/include/linux
Tejun Heo c941d7391f sched_ext: Close root-enable vs sched_ext_dead() race with SCX_TASK_INIT_BEGIN
scx_root_enable_workfn() drops the iter rq lock for ops.init_task() and a
TASK_DEAD @p can fall through sched_ext_dead() in that window. The race hits
when sched_ext_dead() observes SCX_TASK_INIT (the intermediate state before
@p->scx.sched is published) and dereferences NULL via SCX_HAS_OP(NULL,
exit_task), or observes SCX_TASK_NONE during the unlocked init window and
skips cleanup so exit_task() never runs.

Add SCX_TASK_INIT_BEGIN. The enable path writes NONE -> INIT_BEGIN under the
iter rq lock, then takes the rq lock again after init to walk INIT_BEGIN ->
INIT -> READY. sched_ext_dead() that wins the rq-lock race observes
INIT_BEGIN and sets DEAD without calling into ops; the post-init recheck
unwinds via scx_sub_init_cancel_task().

scx_fork() runs single-threaded against sched_ext_dead() (the task is not on
scx_tasks until scx_post_fork() adds it) so its INIT_BEGIN -> INIT walk
needs no rq-lock pairing; it rolls back to NONE on ops.init_task() failure.

The validation matrix grows the INIT_BEGIN row and the INIT_BEGIN -> DEAD
edge; INIT now requires INIT_BEGIN as the predecessor. scx_sub_disable()'s
migration writes INIT_BEGIN as a synthetic predecessor to satisfy the
tightened verification.

The sub-sched paths still race with sched_ext_dead() during the unlocked
init window. This will be fixed by the next patch.

Reported-by: zhidao su <suzhidao@xiaomi.com>
Link: https://lore.kernel.org/all/20260429133155.3825247-1-suzhidao@xiaomi.com/
Signed-off-by: Tejun Heo <tj@kernel.org>
Reviewed-by: Andrea Righi <arighi@nvidia.com>
2026-05-10 10:08:16 -10:00
..
2026-04-09 21:40:22 +02:00
2026-04-03 16:53:50 -04:00
2026-04-07 08:22:24 -06:00
2026-04-08 18:09:56 -07:00
2026-04-04 08:10:37 -06:00
2026-03-16 13:16:49 +01:00
2026-04-10 11:25:34 -05:00
2026-03-31 19:15:21 +02:00
2026-03-23 13:33:51 -04:00
2026-04-07 17:38:07 +02:00
2026-04-05 13:53:28 -07:00
2026-04-01 10:19:41 +02:00
2026-04-03 16:53:50 -04:00
2026-04-03 16:53:50 -04:00
2026-03-18 09:59:57 +00:00
2026-04-05 13:53:00 -07:00
2026-03-27 07:35:05 -07:00
2026-04-05 13:53:10 -07:00
2026-03-27 18:52:43 +09:00
2026-03-27 17:14:31 -07:00
2026-03-31 07:04:00 -06:00
2026-03-25 20:11:29 +01:00
2026-03-23 12:41:58 +01:00
2026-04-13 08:39:51 -07:00
2026-03-30 16:43:24 -06:00