[RFC PATCH v7 01/29] sched/deadline: Introduce dl_freq_invariant flag for fair/ext servers
From: Yuri Andriaccio
Date: Mon Nov 09 2026 - 11:41:37 EST
The fair/ext servers are by design frequency and capacity invariant, i.e. their
maximum allowed runtime is fixed, regardless of the frequency the CPU is
running. (See also https://lore.kernel.org/all/20250702021440.2594736-1-kuyo.chang@xxxxxxxxxxxx/)
This inevitably broke non-fair dl_servers, which would want to instead scale
their execution time to be consistent with CBS and GRUB-PA.
The newly added flag allows deadline servers to adopt the frequency invariance
behaviour as fair/ext servers.
Signed-off-by: Yuri Andriaccio <yurand2000@xxxxxxxxx>
---
include/linux/sched.h | 4 ++++
kernel/sched/deadline.c | 5 ++++-
2 files changed, 8 insertions(+), 1 deletion(-)
diff --git a/include/linux/sched.h b/include/linux/sched.h
index 1c93da75226e..b78ca828f694 100644
--- a/include/linux/sched.h
+++ b/include/linux/sched.h
@@ -706,6 +706,9 @@ struct sched_dl_entity {
* contributes to the root domain's total_bw. Only meaningful for server
* entities (@dl_server == 1). Allows toggling the reservation on/off
* without losing the configured @dl_runtime/@dl_period.
+ *
+ * @dl_freq_invariant tells if this server's runtime must NOT be scaled
+ * by the CPU's frequency and capacity.
*/
unsigned int dl_throttled : 1;
unsigned int dl_yielded : 1;
@@ -718,6 +721,7 @@ struct sched_dl_entity {
unsigned int dl_defer_running : 1;
unsigned int dl_defer_idle : 1;
unsigned int dl_bw_attached : 1;
+ unsigned int dl_freq_invariant : 1;
/*
* Bandwidth enforcement timer. Each -deadline task has its
diff --git a/kernel/sched/deadline.c b/kernel/sched/deadline.c
index c0ebdcde5fe5..57c7a8802d8e 100644
--- a/kernel/sched/deadline.c
+++ b/kernel/sched/deadline.c
@@ -1432,7 +1432,7 @@ static void update_curr_dl_se(struct rq *rq, struct sched_dl_entity *dl_se, s64
return;
scaled_delta_exec = delta_exec;
- if (!dl_server(dl_se))
+ if (!dl_server(dl_se) || !dl_se->dl_freq_invariant)
scaled_delta_exec = dl_scaled_delta_exec(rq, dl_se, delta_exec);
dl_se->runtime -= scaled_delta_exec;
@@ -1862,6 +1862,7 @@ void sched_init_dl_servers(void)
dl_se->dl_server = 1;
dl_se->dl_defer = 1;
+ dl_se->dl_freq_invariant = 1;
setup_new_dl_entity(dl_se);
#ifdef CONFIG_SCHED_CLASS_EXT
@@ -1873,6 +1874,7 @@ void sched_init_dl_servers(void)
dl_se->dl_server = 1;
dl_se->dl_defer = 1;
+ dl_se->dl_freq_invariant = 1;
setup_new_dl_entity(dl_se);
/*
@@ -3957,6 +3959,7 @@ static void __dl_clear_params(struct sched_dl_entity *dl_se)
dl_se->dl_defer = 0;
dl_se->dl_defer_running = 0;
dl_se->dl_defer_armed = 0;
+ dl_se->dl_freq_invariant = 0;
#ifdef CONFIG_RT_MUTEXES
dl_se->pi_se = dl_se;
--
2.56.0