Skip to contentSkip to conversation

FAILED: patch "[PATCH] sched_ext: Skip ops.set_weight() for disabled tasks" failed to apply to 7.1-stable tree

PATCH Applied [email protected] 3 participants 6 messages Jul 21 – Jul 22

Subsystems (3)
lore
Share & tools
lore

[email protected]

author maintainer
#0 lore raw

The 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.

Fixes 637b0682821b ("sched: Fold sched_class::switch{ing,ed}_{to,from}() into the change pattern")
Cc [email protected] # v6.19+
kernel/sched/ext/ext.c +11 -0
index aeee44e016ab..e3fa7b2fac9d 100644
@@ -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);
#1 lore raw

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.

Fixes 637b0682821b ("sched: Fold sched_class::switch{ing,ed}_{to,from}() into the change pattern")
Cc [email protected] # v6.19+
(cherry picked from commit 0e2f4ab68a89fad42e0f5a9ff4b740738e7aa1d6)
---
 kernel/sched/ext.c | 11 +++++++++++
 1 file changed, 11 insertions(+)
kernel/sched/ext.c +11 -0
index 5d2d19473a82..8429bebc21a1 100644
@@ -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);
author maintainer
#2 lore raw
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 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.

Quoted 7 lines
Fixes 637b0682821b ("sched: Fold sched_class::switch{ing,ed}_{to,from}() into the change pattern")
Cc [email protected] # v6.19+
(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

author maintainer
#3 lore raw
Quoted 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 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.

Quoted 7 lines
Fixes 637b0682821b ("sched: Fold sched_class::switch{ing,ed}_{to,from}() into the change pattern")
Cc [email protected] # v6.19+
(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

#4 lore raw

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.

Fixes 637b0682821b ("sched: Fold sched_class::switch{ing,ed}_{to,from}() into the change pattern")
Cc [email protected] # v6.19+
(cherry picked from commit 0e2f4ab68a89fad42e0f5a9ff4b740738e7aa1d6)
---
 kernel/sched/ext.c | 11 +++++++++++
 1 file changed, 11 insertions(+)
kernel/sched/ext.c +11 -0
index 5d2d19473a82..8429bebc21a1 100644
@@ -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
maintainer Applied
#5 lore raw

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 that ops.disable() can only be followed by ops.exit_task() or ops.enable().

Queued for 7.1, thanks.

Signature · 2 lines
Thanks,
Sasha