]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
sched_ext: Release cpus_read_lock on scx_link_sched() failure in root enable
authorTejun Heo <tj@kernel.org>
Sat, 25 Apr 2026 00:31:36 +0000 (14:31 -1000)
committerTejun Heo <tj@kernel.org>
Sat, 25 Apr 2026 00:31:36 +0000 (14:31 -1000)
scx_root_enable_workfn() takes cpus_read_lock() before
scx_link_sched(sch), but the `if (ret) goto err_disable` on failure
skips the matching cpus_read_unlock() - all other err_disable gotos
along this path drop the lock first.

scx_link_sched() only returns non-zero on the sub-sched path
(parent != NULL), so the leak path is unreachable via the root
caller today. Still, the unwind is out of line with the surrounding
paths.

Drop cpus_read_lock() before goto err_disable.

v2: Correct Fixes: tag (Andrea Righi).

Fixes: 25037af712eb ("sched_ext: Add rhashtable lookup for sub-schedulers")
Reported-by: Chris Mason <clm@meta.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
kernel/sched/ext.c

index f333fd0cb83f60db21688492de90c7b2ea11e56b..9eda20e5fdb8a3c55a31a24e5e612fba494fd945 100644 (file)
@@ -6736,8 +6736,10 @@ static void scx_root_enable_workfn(struct kthread_work *work)
        rcu_assign_pointer(scx_root, sch);
 
        ret = scx_link_sched(sch);
-       if (ret)
+       if (ret) {
+               cpus_read_unlock();
                goto err_disable;
+       }
 
        scx_idle_enable(ops);