summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVincent Guittot <vincent.guittot@linaro.org>2026-06-24 17:12:27 +0200
committerPeter Zijlstra <peterz@infradead.org>2026-06-30 10:56:55 +0200
commitba0d3bf5f97b74ee1cf8ea6cc35efe5a052514a4 (patch)
treeeb9e88144472a67adc84a1bc700ab5954fa422f0
parent7ad0ec7890b306dab20e53a02cadd867c92ea513 (diff)
downloadlinux-ba0d3bf5f97b74ee1cf8ea6cc35efe5a052514a4.tar.gz
linux-ba0d3bf5f97b74ee1cf8ea6cc35efe5a052514a4.zip
sched/eevdf: Cancel slice protection if short slice task is eligible
If a short slice task will not be the next to be picked but is eligible, we cancel the slice protection to speedup the time when the short slice task will be the next to run. Signed-off-by: Vincent Guittot <vincent.guittot@linaro.org> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Tested-by: K Prateek Nayak <kprateek.nayak@amd.com> Link: https://patch.msgid.link/20260624151229.1710703-5-vincent.guittot@linaro.org
-rw-r--r--kernel/sched/fair.c22
1 files changed, 12 insertions, 10 deletions
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
index af207f03856d..9046b2ea68c6 100644
--- a/kernel/sched/fair.c
+++ b/kernel/sched/fair.c
@@ -9859,18 +9859,13 @@ static void wakeup_preempt_fair(struct rq *rq, struct task_struct *p, int wake_f
cse_is_idle = se_is_idle(se);
pse_is_idle = se_is_idle(pse);
+ nse = se;
/*
* Preempt an idle entity in favor of a non-idle entity (and don't preempt
* in the inverse case).
*/
- if (cse_is_idle && !pse_is_idle) {
- /*
- * When non-idle entity preempt an idle entity,
- * don't give idle entity slice protection.
- */
- preempt_action = PREEMPT_WAKEUP_SHORT;
+ if (cse_is_idle && !pse_is_idle)
goto preempt;
- }
if (cse_is_idle != pse_is_idle)
return;
@@ -9933,16 +9928,23 @@ pick:
goto preempt;
}
+ /*
+ * If @p is eligible but not the next task to run then cancel protection
+ * to prevent large scheduling latency
+ */
+ if (preempt_action == PREEMPT_WAKEUP_SHORT && entity_eligible(cfs_rq, pse))
+ goto preempt;
+
if (sched_feat(RUN_TO_PARITY))
update_protect_slice(cfs_rq, se);
return;
preempt:
- if (preempt_action == PREEMPT_WAKEUP_SHORT) {
- cancel_protect_slice(se);
+ cancel_protect_slice(se);
+
+ if (preempt_action == PREEMPT_WAKEUP_SHORT)
set_short_buddy(cfs_rq, pse);
- }
resched_curr_lazy(rq);
}