kernel/sched/deadline.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
Commit 14a857056466 ("sched/deadline: Use revised wakeup rule for
dl_server") applies the revised wakeup rule to any server, as a result
servers that are not running (dl_defer_running == 0) and start with a
deadline overflow get enqueued and can boost tasks as if they were
running, invalidating the defer rule and the documented state model.
Apply the revised wakeup rule only for deferrable servers that are
marked as running.
Fixes: 14a857056466 ("sched/deadline: Use revised wakeup rule for dl_server")
Signed-off-by: Gabriele Monaco <gmonaco@redhat.com>
---
Tested with ksched_football on a 16 CPUs machine: no regression (1s for
check in and game over in 10s).
Apparently the rt_stall sched_ext selftest does fail with tasks not
always getting above 4% (almost always above 3%). But that seems to be
the case also before this change on that machine.
---
kernel/sched/deadline.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/kernel/sched/deadline.c b/kernel/sched/deadline.c
index 7db4c87df83b..e5a7701a8af7 100644
--- a/kernel/sched/deadline.c
+++ b/kernel/sched/deadline.c
@@ -1017,7 +1017,8 @@ static void update_dl_entity(struct sched_dl_entity *dl_se)
if (dl_time_before(dl_se->deadline, rq_clock(rq)) ||
dl_entity_overflow(dl_se, rq_clock(rq))) {
- if (unlikely((!dl_is_implicit(dl_se) || dl_se->dl_defer) &&
+ if (unlikely((!dl_is_implicit(dl_se) ||
+ (dl_se->dl_defer && dl_se->dl_defer_running)) &&
!dl_time_before(dl_se->deadline, rq_clock(rq)) &&
!is_dl_boosted(dl_se))) {
update_dl_revised_wakeup(dl_se, rq);
base-commit: 8bc67e4db64aa72732c474b44ea8622062c903f0
--
2.54.0
Hi Garbiele,
On Fri, May 22, 2026 at 02:58:33PM +0200, Gabriele Monaco wrote:
> Commit 14a857056466 ("sched/deadline: Use revised wakeup rule for
> dl_server") applies the revised wakeup rule to any server, as a result
> servers that are not running (dl_defer_running == 0) and start with a
> deadline overflow get enqueued and can boost tasks as if they were
> running, invalidating the defer rule and the documented state model.
>
> Apply the revised wakeup rule only for deferrable servers that are
> marked as running.
>
> Fixes: 14a857056466 ("sched/deadline: Use revised wakeup rule for dl_server")
> Signed-off-by: Gabriele Monaco <gmonaco@redhat.com>
> ---
>
> Tested with ksched_football on a 16 CPUs machine: no regression (1s for
> check in and game over in 10s).
>
> Apparently the rt_stall sched_ext selftest does fail with tasks not
> always getting above 4% (almost always above 3%). But that seems to be
> the case also before this change on that machine.
Yeah the rt_stall selftest can be a bit flaky sometimes, as long as you get >3%
it's all good, maybe we should relax the min threshold a bit. In any case, I
tested this and it looks good om my side.
Tested-by: Andrea Righi <arighi@nvidia.com>
Thanks,
-Andrea
>
> ---
> kernel/sched/deadline.c | 3 ++-
> 1 file changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/kernel/sched/deadline.c b/kernel/sched/deadline.c
> index 7db4c87df83b..e5a7701a8af7 100644
> --- a/kernel/sched/deadline.c
> +++ b/kernel/sched/deadline.c
> @@ -1017,7 +1017,8 @@ static void update_dl_entity(struct sched_dl_entity *dl_se)
> if (dl_time_before(dl_se->deadline, rq_clock(rq)) ||
> dl_entity_overflow(dl_se, rq_clock(rq))) {
>
> - if (unlikely((!dl_is_implicit(dl_se) || dl_se->dl_defer) &&
> + if (unlikely((!dl_is_implicit(dl_se) ||
> + (dl_se->dl_defer && dl_se->dl_defer_running)) &&
> !dl_time_before(dl_se->deadline, rq_clock(rq)) &&
> !is_dl_boosted(dl_se))) {
> update_dl_revised_wakeup(dl_se, rq);
>
> base-commit: 8bc67e4db64aa72732c474b44ea8622062c903f0
> --
> 2.54.0
>
© 2016 - 2026 Red Hat, Inc.