* [PATCHSET v2 sched_ext/for-6.19-fixes] sched_ext: Fix missing post-enqueue handling in move_local_task_to_local_dsq()
[not found] <20251211224809.3383633-1-tj@kernel.org>
@ 2025-12-12 1:45 ` Tejun Heo
2025-12-12 1:45 ` [PATCH 1/2] sched_ext: Factor out local_dsq_post_enq() from dispatch_enqueue() Tejun Heo
` (2 more replies)
0 siblings, 3 replies; 6+ messages in thread
From: Tejun Heo @ 2025-12-12 1:45 UTC (permalink / raw)
To: Andrea Righi, Changwoo Min, David Vernet
Cc: Emil Tsalapatis, linux-kernel, sched-ext, stable, Tejun Heo
Hello,
move_local_task_to_local_dsq() was missing post-enqueue handling which
matters now that scx_bpf_dsq_move() can be called while the CPU is busy.
v2: Updated commit messages and added Cc stable.
v1: http://lkml.kernel.org/r/20251211224809.3383633-1-tj@kernel.org
0001-sched_ext-Factor-out-local_dsq_post_enq-from-dispatc.patch
0002-sched_ext-Fix-missing-post-enqueue-handling-in-move_.patch
Based on sched_ext/for-6.19-fixes (9f769637a93f).
diffstat:
kernel/sched/ext.c | 44 +++++++++++++++++++++++++++++---------------
1 file changed, 29 insertions(+), 15 deletions(-)
--
tejun
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH 1/2] sched_ext: Factor out local_dsq_post_enq() from dispatch_enqueue()
2025-12-12 1:45 ` [PATCHSET v2 sched_ext/for-6.19-fixes] sched_ext: Fix missing post-enqueue handling in move_local_task_to_local_dsq() Tejun Heo
@ 2025-12-12 1:45 ` Tejun Heo
2025-12-12 5:50 ` Emil Tsalapatis
2025-12-12 1:45 ` [PATCH 2/2] sched_ext: Fix missing post-enqueue handling in move_local_task_to_local_dsq() Tejun Heo
2025-12-12 16:28 ` [PATCHSET v2 sched_ext/for-6.19-fixes] " Tejun Heo
2 siblings, 1 reply; 6+ messages in thread
From: Tejun Heo @ 2025-12-12 1:45 UTC (permalink / raw)
To: Andrea Righi, Changwoo Min, David Vernet
Cc: Emil Tsalapatis, linux-kernel, sched-ext, stable, Tejun Heo
Factor out local_dsq_post_enq() which performs post-enqueue handling for
local DSQs - triggering resched_curr() if SCX_ENQ_PREEMPT is specified or if
the current CPU is idle. No functional change.
This will be used by the next patch to fix move_local_task_to_local_dsq().
Cc: stable@vger.kernel.org # v6.12+
Reviewed-by: Andrea Righi <arighi@nvidia.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
---
kernel/sched/ext.c | 34 +++++++++++++++++++---------------
1 file changed, 19 insertions(+), 15 deletions(-)
diff --git a/kernel/sched/ext.c b/kernel/sched/ext.c
index c4465ccefea4..c78efa99406f 100644
--- a/kernel/sched/ext.c
+++ b/kernel/sched/ext.c
@@ -982,6 +982,22 @@ static void refill_task_slice_dfl(struct scx_sched *sch, struct task_struct *p)
__scx_add_event(sch, SCX_EV_REFILL_SLICE_DFL, 1);
}
+static void local_dsq_post_enq(struct scx_dispatch_q *dsq, struct task_struct *p,
+ u64 enq_flags)
+{
+ struct rq *rq = container_of(dsq, struct rq, scx.local_dsq);
+ bool preempt = false;
+
+ if ((enq_flags & SCX_ENQ_PREEMPT) && p != rq->curr &&
+ rq->curr->sched_class == &ext_sched_class) {
+ rq->curr->scx.slice = 0;
+ preempt = true;
+ }
+
+ if (preempt || sched_class_above(&ext_sched_class, rq->curr->sched_class))
+ resched_curr(rq);
+}
+
static void dispatch_enqueue(struct scx_sched *sch, struct scx_dispatch_q *dsq,
struct task_struct *p, u64 enq_flags)
{
@@ -1093,22 +1109,10 @@ static void dispatch_enqueue(struct scx_sched *sch, struct scx_dispatch_q *dsq,
if (enq_flags & SCX_ENQ_CLEAR_OPSS)
atomic_long_set_release(&p->scx.ops_state, SCX_OPSS_NONE);
- if (is_local) {
- struct rq *rq = container_of(dsq, struct rq, scx.local_dsq);
- bool preempt = false;
-
- if ((enq_flags & SCX_ENQ_PREEMPT) && p != rq->curr &&
- rq->curr->sched_class == &ext_sched_class) {
- rq->curr->scx.slice = 0;
- preempt = true;
- }
-
- if (preempt || sched_class_above(&ext_sched_class,
- rq->curr->sched_class))
- resched_curr(rq);
- } else {
+ if (is_local)
+ local_dsq_post_enq(dsq, p, enq_flags);
+ else
raw_spin_unlock(&dsq->lock);
- }
}
static void task_unlink_from_dsq(struct task_struct *p,
--
2.52.0
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH 2/2] sched_ext: Fix missing post-enqueue handling in move_local_task_to_local_dsq()
2025-12-12 1:45 ` [PATCHSET v2 sched_ext/for-6.19-fixes] sched_ext: Fix missing post-enqueue handling in move_local_task_to_local_dsq() Tejun Heo
2025-12-12 1:45 ` [PATCH 1/2] sched_ext: Factor out local_dsq_post_enq() from dispatch_enqueue() Tejun Heo
@ 2025-12-12 1:45 ` Tejun Heo
2025-12-12 5:57 ` Emil Tsalapatis
2025-12-12 16:28 ` [PATCHSET v2 sched_ext/for-6.19-fixes] " Tejun Heo
2 siblings, 1 reply; 6+ messages in thread
From: Tejun Heo @ 2025-12-12 1:45 UTC (permalink / raw)
To: Andrea Righi, Changwoo Min, David Vernet
Cc: Emil Tsalapatis, linux-kernel, sched-ext, stable, Tejun Heo
move_local_task_to_local_dsq() is used when moving a task from a non-local
DSQ to a local DSQ on the same CPU. It directly manipulates the local DSQ
without going through dispatch_enqueue() and was missing the post-enqueue
handling that triggers preemption when SCX_ENQ_PREEMPT is set or the idle
task is running.
The function is used by move_task_between_dsqs() which backs
scx_bpf_dsq_move() and may be called while the CPU is busy.
Add local_dsq_post_enq() call to move_local_task_to_local_dsq(). As the
dispatch path doesn't need post-enqueue handling, add SCX_RQ_IN_BALANCE
early exit to keep consume_dispatch_q() behavior unchanged and avoid
triggering unnecessary resched when scx_bpf_dsq_move() is used from the
dispatch path.
Fixes: 4c30f5ce4f7a ("sched_ext: Implement scx_bpf_dispatch[_vtime]_from_dsq()")
Cc: stable@vger.kernel.org # v6.12+
Reviewed-by: Andrea Righi <arighi@nvidia.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
---
kernel/sched/ext.c | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/kernel/sched/ext.c b/kernel/sched/ext.c
index c78efa99406f..695503a2f7d1 100644
--- a/kernel/sched/ext.c
+++ b/kernel/sched/ext.c
@@ -988,6 +988,14 @@ static void local_dsq_post_enq(struct scx_dispatch_q *dsq, struct task_struct *p
struct rq *rq = container_of(dsq, struct rq, scx.local_dsq);
bool preempt = false;
+ /*
+ * If @rq is in balance, the CPU is already vacant and looking for the
+ * next task to run. No need to preempt or trigger resched after moving
+ * @p into its local DSQ.
+ */
+ if (rq->scx.flags & SCX_RQ_IN_BALANCE)
+ return;
+
if ((enq_flags & SCX_ENQ_PREEMPT) && p != rq->curr &&
rq->curr->sched_class == &ext_sched_class) {
rq->curr->scx.slice = 0;
@@ -1636,6 +1644,8 @@ static void move_local_task_to_local_dsq(struct task_struct *p, u64 enq_flags,
dsq_mod_nr(dst_dsq, 1);
p->scx.dsq = dst_dsq;
+
+ local_dsq_post_enq(dst_dsq, p, enq_flags);
}
/**
--
2.52.0
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH 1/2] sched_ext: Factor out local_dsq_post_enq() from dispatch_enqueue()
2025-12-12 1:45 ` [PATCH 1/2] sched_ext: Factor out local_dsq_post_enq() from dispatch_enqueue() Tejun Heo
@ 2025-12-12 5:50 ` Emil Tsalapatis
0 siblings, 0 replies; 6+ messages in thread
From: Emil Tsalapatis @ 2025-12-12 5:50 UTC (permalink / raw)
To: Tejun Heo, Andrea Righi, Changwoo Min, David Vernet
Cc: linux-kernel, sched-ext, stable
On Thu Dec 11, 2025 at 8:45 PM EST, Tejun Heo wrote:
> Factor out local_dsq_post_enq() which performs post-enqueue handling for
> local DSQs - triggering resched_curr() if SCX_ENQ_PREEMPT is specified or if
> the current CPU is idle. No functional change.
>
> This will be used by the next patch to fix move_local_task_to_local_dsq().
>
> Cc: stable@vger.kernel.org # v6.12+
> Reviewed-by: Andrea Righi <arighi@nvidia.com>
> Signed-off-by: Tejun Heo <tj@kernel.org>
> ---
Reviewed-by: Emil Tsalapatis <emil@etsalapatis.com>
> kernel/sched/ext.c | 34 +++++++++++++++++++---------------
> 1 file changed, 19 insertions(+), 15 deletions(-)
>
> diff --git a/kernel/sched/ext.c b/kernel/sched/ext.c
> index c4465ccefea4..c78efa99406f 100644
> --- a/kernel/sched/ext.c
> +++ b/kernel/sched/ext.c
> @@ -982,6 +982,22 @@ static void refill_task_slice_dfl(struct scx_sched *sch, struct task_struct *p)
> __scx_add_event(sch, SCX_EV_REFILL_SLICE_DFL, 1);
> }
>
> +static void local_dsq_post_enq(struct scx_dispatch_q *dsq, struct task_struct *p,
> + u64 enq_flags)
> +{
> + struct rq *rq = container_of(dsq, struct rq, scx.local_dsq);
> + bool preempt = false;
> +
> + if ((enq_flags & SCX_ENQ_PREEMPT) && p != rq->curr &&
> + rq->curr->sched_class == &ext_sched_class) {
> + rq->curr->scx.slice = 0;
> + preempt = true;
> + }
> +
> + if (preempt || sched_class_above(&ext_sched_class, rq->curr->sched_class))
> + resched_curr(rq);
> +}
> +
> static void dispatch_enqueue(struct scx_sched *sch, struct scx_dispatch_q *dsq,
> struct task_struct *p, u64 enq_flags)
> {
> @@ -1093,22 +1109,10 @@ static void dispatch_enqueue(struct scx_sched *sch, struct scx_dispatch_q *dsq,
> if (enq_flags & SCX_ENQ_CLEAR_OPSS)
> atomic_long_set_release(&p->scx.ops_state, SCX_OPSS_NONE);
>
> - if (is_local) {
> - struct rq *rq = container_of(dsq, struct rq, scx.local_dsq);
> - bool preempt = false;
> -
> - if ((enq_flags & SCX_ENQ_PREEMPT) && p != rq->curr &&
> - rq->curr->sched_class == &ext_sched_class) {
> - rq->curr->scx.slice = 0;
> - preempt = true;
> - }
> -
> - if (preempt || sched_class_above(&ext_sched_class,
> - rq->curr->sched_class))
> - resched_curr(rq);
> - } else {
> + if (is_local)
> + local_dsq_post_enq(dsq, p, enq_flags);
> + else
> raw_spin_unlock(&dsq->lock);
> - }
> }
>
> static void task_unlink_from_dsq(struct task_struct *p,
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH 2/2] sched_ext: Fix missing post-enqueue handling in move_local_task_to_local_dsq()
2025-12-12 1:45 ` [PATCH 2/2] sched_ext: Fix missing post-enqueue handling in move_local_task_to_local_dsq() Tejun Heo
@ 2025-12-12 5:57 ` Emil Tsalapatis
0 siblings, 0 replies; 6+ messages in thread
From: Emil Tsalapatis @ 2025-12-12 5:57 UTC (permalink / raw)
To: Tejun Heo, Andrea Righi, Changwoo Min, David Vernet
Cc: linux-kernel, sched-ext, stable
On Thu Dec 11, 2025 at 8:45 PM EST, Tejun Heo wrote:
> move_local_task_to_local_dsq() is used when moving a task from a non-local
> DSQ to a local DSQ on the same CPU. It directly manipulates the local DSQ
> without going through dispatch_enqueue() and was missing the post-enqueue
> handling that triggers preemption when SCX_ENQ_PREEMPT is set or the idle
> task is running.
>
> The function is used by move_task_between_dsqs() which backs
> scx_bpf_dsq_move() and may be called while the CPU is busy.
>
> Add local_dsq_post_enq() call to move_local_task_to_local_dsq(). As the
> dispatch path doesn't need post-enqueue handling, add SCX_RQ_IN_BALANCE
> early exit to keep consume_dispatch_q() behavior unchanged and avoid
> triggering unnecessary resched when scx_bpf_dsq_move() is used from the
> dispatch path.
>
> Fixes: 4c30f5ce4f7a ("sched_ext: Implement scx_bpf_dispatch[_vtime]_from_dsq()")
> Cc: stable@vger.kernel.org # v6.12+
> Reviewed-by: Andrea Righi <arighi@nvidia.com>
> Signed-off-by: Tejun Heo <tj@kernel.org>
Reviewed-by: Emil Tsalapatis <emil@etsalapatis.com>
> ---
> kernel/sched/ext.c | 10 ++++++++++
> 1 file changed, 10 insertions(+)
>
> diff --git a/kernel/sched/ext.c b/kernel/sched/ext.c
> index c78efa99406f..695503a2f7d1 100644
> --- a/kernel/sched/ext.c
> +++ b/kernel/sched/ext.c
> @@ -988,6 +988,14 @@ static void local_dsq_post_enq(struct scx_dispatch_q *dsq, struct task_struct *p
> struct rq *rq = container_of(dsq, struct rq, scx.local_dsq);
> bool preempt = false;
>
> + /*
> + * If @rq is in balance, the CPU is already vacant and looking for the
> + * next task to run. No need to preempt or trigger resched after moving
> + * @p into its local DSQ.
> + */
> + if (rq->scx.flags & SCX_RQ_IN_BALANCE)
> + return;
> +
> if ((enq_flags & SCX_ENQ_PREEMPT) && p != rq->curr &&
> rq->curr->sched_class == &ext_sched_class) {
> rq->curr->scx.slice = 0;
> @@ -1636,6 +1644,8 @@ static void move_local_task_to_local_dsq(struct task_struct *p, u64 enq_flags,
>
> dsq_mod_nr(dst_dsq, 1);
> p->scx.dsq = dst_dsq;
> +
> + local_dsq_post_enq(dst_dsq, p, enq_flags);
> }
>
> /**
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCHSET v2 sched_ext/for-6.19-fixes] sched_ext: Fix missing post-enqueue handling in move_local_task_to_local_dsq()
2025-12-12 1:45 ` [PATCHSET v2 sched_ext/for-6.19-fixes] sched_ext: Fix missing post-enqueue handling in move_local_task_to_local_dsq() Tejun Heo
2025-12-12 1:45 ` [PATCH 1/2] sched_ext: Factor out local_dsq_post_enq() from dispatch_enqueue() Tejun Heo
2025-12-12 1:45 ` [PATCH 2/2] sched_ext: Fix missing post-enqueue handling in move_local_task_to_local_dsq() Tejun Heo
@ 2025-12-12 16:28 ` Tejun Heo
2 siblings, 0 replies; 6+ messages in thread
From: Tejun Heo @ 2025-12-12 16:28 UTC (permalink / raw)
To: Tejun Heo
Cc: Andrea Righi, Changwoo Min, David Vernet, Emil Tsalapatis,
linux-kernel, sched-ext, stable
> Tejun Heo (2):
> sched_ext: Factor out local_dsq_post_enq() from dispatch_enqueue()
> sched_ext: Fix missing post-enqueue handling in move_local_task_to_local_dsq()
Applied to sched_ext/for-6.19-fixes.
Thanks.
--
tejun
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2025-12-12 16:28 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <20251211224809.3383633-1-tj@kernel.org>
2025-12-12 1:45 ` [PATCHSET v2 sched_ext/for-6.19-fixes] sched_ext: Fix missing post-enqueue handling in move_local_task_to_local_dsq() Tejun Heo
2025-12-12 1:45 ` [PATCH 1/2] sched_ext: Factor out local_dsq_post_enq() from dispatch_enqueue() Tejun Heo
2025-12-12 5:50 ` Emil Tsalapatis
2025-12-12 1:45 ` [PATCH 2/2] sched_ext: Fix missing post-enqueue handling in move_local_task_to_local_dsq() Tejun Heo
2025-12-12 5:57 ` Emil Tsalapatis
2025-12-12 16:28 ` [PATCHSET v2 sched_ext/for-6.19-fixes] " Tejun Heo
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox