FAILED: patch "[PATCH] sched_ext: Skip ops.set_weight() for disabled tasks" failed to apply to 7.1-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 7.1-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-7.1.y
git checkout FETCH_HEAD
git cherry-pick -x 0e2f4ab68a89fad42e0f5a9ff4b740738e7aa1d6
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2026072131-citation-reshape-587c@gregkh' --subject-prefix 'PATCH 7.1.y' 'HEAD^..'
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 0e2f4ab68a89fad42e0f5a9ff4b740738e7aa1d6 Mon Sep 17 00:00:00 2001
From: Kuba Piecuch <[email protected]>
Date: Fri, 10 Jul 2026 14:43:41 +0000
Subject: [PATCH] sched_ext: Skip ops.set_weight() for disabled tasks
When switching a task's sched_class away from sched_ext, we get the following sequence of events in __sched_setscheduler():
sched_change_begin()
switched_from_scx()
scx_disable_task(p)
ops.disable(p)__setscheduler_params()
set_load_weight()
reweight_task_scx(p)
ops.set_weight(p)p->sched_class = next_class;sched_change_end()
...
Notably, ops.set_weight() is called _after_ ops.disable(). This violates the expected semantics of the callbacks, the expectation being that ops.disable() can only be followed by ops.exit_task() or ops.enable().
Skipping the weight adjustment for disabled tasks should be harmless since the weight will be recalculated in scx_enable_task() if the task ever rejoins SCX.
kernel/sched/ext/ext.c +11 -0
@@ -3967,6 +3967,17 @@ static void reweight_task_scx(struct rq *rq, struct task_struct *p,if (task_dead_and_done (p))return ; +/* +* When switching sched_class away from SCX, reweight_task_scx() +* is called _after_ scx_disable_task(). Skip calling ops.set_weight() +* since the BPF scheduler may have already forgotten the task in +* ops.disable(). +* p->scx.weight will be recalculated in scx_enable_task() if the task +* ever returns to SCX class. +*/ +if (scx_get_task_state (p) !=SCX_TASK_ENABLED ) +return ; + p->scx.weight =sched_weight_to_cgroup (scale_load_down (lw->weight));if (SCX_HAS_OP (sch, set_weight))SCX_CALL_OP_TASK (sch, set_weight, rq, p, p->scx.weight);
Hi Greg,
I'm unable to reproduce the failure using the steps provided. The patch applies cleanly. The code compiles and tests are passing.
FWIW, below is the patch after cherry-picking the commit:
Thanks,
Kuba
------------------------ 8< ----------------------------
From adc748e669cc1564255430299abf086b9ecd9b45 Mon Sep 17 00:00:00 2001
From: Kuba Piecuch <[email protected]>
Date: Fri, 10 Jul 2026 14:43:41 +0000
Subject: [PATCH] sched_ext: Skip ops.set_weight() for disabled tasks
When switching a task's sched_class away from sched_ext, we get the following sequence of events in __sched_setscheduler():
sched_change_begin()
switched_from_scx()
scx_disable_task(p)
ops.disable(p)__setscheduler_params()
set_load_weight()
reweight_task_scx(p)
ops.set_weight(p)p->sched_class = next_class;sched_change_end()
...
Notably, ops.set_weight() is called _after_ ops.disable(). This violates the expected semantics of the callbacks, the expectation being that ops.disable() can only be followed by ops.exit_task() or ops.enable().
Skipping the weight adjustment for disabled tasks should be harmless since the weight will be recalculated in scx_enable_task() if the task ever rejoins SCX.
--- kernel/sched/ext.c | 11 +++++++++++ 1 file changed, 11 insertions(+)
kernel/sched/ext.c +11 -0
@@ -3904,6 +3904,17 @@ static void reweight_task_scx(struct rq *rq, struct task_struct *p,if (task_dead_and_done (p))return ; +/* +* When switching sched_class away from SCX, reweight_task_scx() +* is called _after_ scx_disable_task(). Skip calling ops.set_weight() +* since the BPF scheduler may have already forgotten the task in +* ops.disable(). +* p->scx.weight will be recalculated in scx_enable_task() if the task +* ever returns to SCX class. +*/ +if (scx_get_task_state (p) !=SCX_TASK_ENABLED ) +return ; + p->scx.weight =sched_weight_to_cgroup (scale_load_down (lw->weight));if (SCX_HAS_OP (sch, set_weight))SCX_CALL_OP_TASK (sch, set_weight, rq, p, p->scx.weight);
Greg KH
maintainerQuoted 41 lines · Kuba Piecuch
Hi Greg,
I'm unable to reproduce the failure using the steps provided. The patch applies cleanly. The code compiles and tests are passing.
FWIW, below is the patch after cherry-picking the commit:
Thanks,
Kuba------------------------ 8< ----------------------------
Quoted 1 line
From
adc748e669cc1564255430299abf086b9ecd9b45Mon Sep 17 00:00:00 2001From: Kuba Piecuch <[email protected]>
Date: Fri, 10 Jul 2026 14:43:41 +0000
Subject: [PATCH]sched_ext: Skipops.set_weight()for disabled tasksWhen switching a task's
sched_classaway fromsched_ext, we get the following sequence of events in__sched_setscheduler():
sched_change_begin()
switched_from_scx()
scx_disable_task(p)
ops.disable(p)__setscheduler_params()
set_load_weight()
reweight_task_scx(p)
ops.set_weight(p)p->sched_class=next_class;sched_change_end()
...Notably,
ops.set_weight()is called _after_ops.disable(). This violates the expected semantics of the callbacks, the expectation being thatops.disable()can only be followed byops.exit_task()orops.enable().Skipping the weight adjustment for disabled tasks should be harmless since the weight will be recalculated in
scx_enable_task()if the task ever rejoins SCX.
Quoted 7 lines
Fixes 637b0682821b ("sched: Fold sched_class::switch{ing,ed}_{to,from}() into the change pattern")Cc [email protected] # v6.19+Signed-off-by Kuba Piecuch <[email protected]>Signed-off-by Tejun Heo <[email protected]>(cherry picked from commit 0e2f4ab68a89fad42e0f5a9ff4b740738e7aa1d6)--- kernel/sched/ext.c | 11 +++++++++++
If you look, the original file was:
kernel/sched/ext/ext.c
your cherry-pick fixed that.
I'll take this, thanks.
greg k-h
Greg KH
maintainerQuoted 50 lines · Greg KH
Quoted 41 lines · Kuba Piecuch
Hi Greg,
I'm unable to reproduce the failure using the steps provided. The patch applies cleanly. The code compiles and tests are passing.
FWIW, below is the patch after cherry-picking the commit:
Thanks,
Kuba------------------------ 8< ----------------------------
Quoted 1 line
From
adc748e669cc1564255430299abf086b9ecd9b45Mon Sep 17 00:00:00 2001From: Kuba Piecuch <[email protected]>
Date: Fri, 10 Jul 2026 14:43:41 +0000
Subject: [PATCH]sched_ext: Skipops.set_weight()for disabled tasksWhen switching a task's
sched_classaway fromsched_ext, we get the following sequence of events in__sched_setscheduler():
sched_change_begin()
switched_from_scx()
scx_disable_task(p)
ops.disable(p)__setscheduler_params()
set_load_weight()
reweight_task_scx(p)
ops.set_weight(p)p->sched_class=next_class;sched_change_end()
...Notably,
ops.set_weight()is called _after_ops.disable(). This violates the expected semantics of the callbacks, the expectation being thatops.disable()can only be followed byops.exit_task()orops.enable().Skipping the weight adjustment for disabled tasks should be harmless since the weight will be recalculated in
scx_enable_task()if the task ever rejoins SCX.Quoted 7 lines
Fixes 637b0682821b ("sched: Fold sched_class::switch{ing,ed}_{to,from}() into the change pattern")Cc [email protected] # v6.19+Signed-off-by Kuba Piecuch <[email protected]>Signed-off-by Tejun Heo <[email protected]>(cherry picked from commit 0e2f4ab68a89fad42e0f5a9ff4b740738e7aa1d6)--- kernel/sched/ext.c | 11 +++++++++++
Quoted 5 lines
If you look, the original file was:
kernel/sched/ext/ext.c
your cherry-pick fixed that.I'll take this, thanks.
Nope, the whitespace is corrupted, please send a good copy.
thanks,
greg k-h
PATCH 1/1 sched_ext: Skip ops.set_weight() for disabled tasks
When switching a task's sched_class away from sched_ext, we get the following sequence of events in __sched_setscheduler():
sched_change_begin()
switched_from_scx()
scx_disable_task(p)
ops.disable(p)__setscheduler_params()
set_load_weight()
reweight_task_scx(p)
ops.set_weight(p)p->sched_class = next_class;sched_change_end()
...
Notably, ops.set_weight() is called _after_ ops.disable(). This violates the expected semantics of the callbacks, the expectation being that ops.disable() can only be followed by ops.exit_task() or ops.enable().
Skipping the weight adjustment for disabled tasks should be harmless since the weight will be recalculated in scx_enable_task() if the task ever rejoins SCX.
--- kernel/sched/ext.c | 11 +++++++++++ 1 file changed, 11 insertions(+)
kernel/sched/ext.c +11 -0
@@ -3904,6 +3904,17 @@ static void reweight_task_scx(struct rq *rq, struct task_struct *p,if (task_dead_and_done (p))return ; +/* +* When switching sched_class away from SCX, reweight_task_scx() +* is called _after_ scx_disable_task(). Skip calling ops.set_weight() +* since the BPF scheduler may have already forgotten the task in +* ops.disable(). +* p->scx.weight will be recalculated in scx_enable_task() if the task +* ever returns to SCX class. +*/ +if (scx_get_task_state (p) !=SCX_TASK_ENABLED ) +return ; + p->scx.weight =sched_weight_to_cgroup (scale_load_down (lw->weight));if (SCX_HAS_OP (sch, set_weight))SCX_CALL_OP_TASK (sch, set_weight, rq, p, p->scx.weight);
Signature · 1 line
2.55.0.229.g6434b31f56-goog
Re: [PATCH 7.1.y] sched_ext: Skip ops.set_weight() for disabled tasks
Quoted 4 lines
Notably,
ops.set_weight()is called _after_ops.disable(). This violates the expected semantics of the callbacks, the expectation being thatops.disable()can only be followed byops.exit_task()orops.enable().
Queued for 7.1, thanks.
Signature · 2 lines
Thanks, Sasha