Skip to content

Commit 7b6216b

Browse files
Saket Kumar Bhaskarhtejun
authored andcommitted
sched_ext: Fix scx_enable() crash on helper kthread creation failure
A crash was observed when the sched_ext selftests runner was terminated with Ctrl+\ while test 15 was running: NIP [c00000000028fa58] scx_enable.constprop.0+0x358/0x12b0 LR [c00000000028fa2c] scx_enable.constprop.0+0x32c/0x12b0 Call Trace: scx_enable.constprop.0+0x32c/0x12b0 (unreliable) bpf_struct_ops_link_create+0x18c/0x22c __sys_bpf+0x23f8/0x3044 sys_bpf+0x2c/0x6c system_call_exception+0x124/0x320 system_call_vectored_common+0x15c/0x2ec kthread_run_worker() returns an ERR_PTR() on failure rather than NULL, but the current code in scx_alloc_and_add_sched() only checks for a NULL helper. Incase of failure on SIGQUIT, the error is not handled in scx_alloc_and_add_sched() and scx_enable() ends up dereferencing an error pointer. Error handling is fixed in scx_alloc_and_add_sched() to propagate PTR_ERR() into ret, so that scx_enable() jumps to the existing error path, avoiding random dereference on failure. Fixes: bff3b5a ("sched_ext: Move disable machinery into scx_sched") Cc: [email protected] # v6.16+ Reported-and-tested-by: Samir Mulani <[email protected]> Signed-off-by: Saket Kumar Bhaskar <[email protected]> Reviewed-by: Emil Tsalapatis <[email protected]> Reviewed-by: Andrea Righi <[email protected]> Reviewed-by: Vishal Chourasia <[email protected]> Signed-off-by: Tejun Heo <[email protected]>
1 parent 36c6f3c commit 7b6216b

File tree

1 file changed

+4
-1
lines changed

1 file changed

+4
-1
lines changed

kernel/sched/ext.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4479,8 +4479,11 @@ static struct scx_sched *scx_alloc_and_add_sched(struct sched_ext_ops *ops)
44794479
goto err_free_gdsqs;
44804480

44814481
sch->helper = kthread_run_worker(0, "sched_ext_helper");
4482-
if (!sch->helper)
4482+
if (IS_ERR(sch->helper)) {
4483+
ret = PTR_ERR(sch->helper);
44834484
goto err_free_pcpu;
4485+
}
4486+
44844487
sched_set_fifo(sch->helper->task);
44854488

44864489
atomic_set(&sch->exit_kind, SCX_EXIT_NONE);

0 commit comments

Comments
 (0)