[PATCH] sched_ext: Fix stale errno in scx_sub_enable_workfn()
From: Cui Jian
Date: Sat Jul 18 2026 - 16:18:19 EST
scx_sub_enable_workfn() drops the return value of validate_ops().
When validate_ops() fails, the function jumps to err_disable with
ret still holding 0 from the previous call, so the fallback error
added by commit db4e9defd2e8 ("sched_ext: Record an error on
errno-only sub-enable failure") reports "scx_sub_enable() failed
(0)".
This is currently harmless because validate_ops() records its own
scx_error() first and the first error wins, but it leaves the
fallback broken for this path. Save the return value into ret,
like scx_root_enable_workfn() already does.
The nesting depth check and the cgroup online check also reach
err_disable without setting ret. Set -EINVAL and -ENODEV there so
the fallback always reports a real errno.
Signed-off-by: Cui Jian <cjian720@xxxxxxx>
---
kernel/sched/ext/ext.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/kernel/sched/ext/ext.c b/kernel/sched/ext/ext.c
index e3fa7b2fac9d..e623d6375f66 100644
--- a/kernel/sched/ext/ext.c
+++ b/kernel/sched/ext/ext.c
@@ -7559,6 +7559,7 @@ static void scx_sub_enable_workfn(struct kthread_work *work)
if (sch->level >= SCX_SUB_MAX_DEPTH) {
scx_error(sch, "max nesting depth %d violated",
SCX_SUB_MAX_DEPTH);
+ ret = -EINVAL;
goto err_disable;
}
@@ -7580,7 +7581,8 @@ static void scx_sub_enable_workfn(struct kthread_work *work)
if (ret)
goto err_disable;
- if (validate_ops(sch, ops))
+ ret = validate_ops(sch, ops);
+ if (ret)
goto err_disable;
struct scx_sub_attach_args sub_attach_args = {
@@ -7613,6 +7615,7 @@ static void scx_sub_enable_workfn(struct kthread_work *work)
set_cgroup_sched(sch_cgroup(sch), sch);
if (!(cgrp->self.flags & CSS_ONLINE)) {
scx_error(sch, "cgroup is not online");
+ ret = -ENODEV;
goto err_unlock_and_disable;
}
base-commit: 1229e2e57a5c2980ccd457b9b53ea0eed5a22ab3
--
2.34.1