diff options
author | Joel Fernandes (Google) <joel@joelfernandes.org> | 2024-03-12 16:38:43 -0400 |
---|---|---|
committer | Joel Fernandes (Google) <joel@joelfernandes.org> | 2024-03-12 20:58:47 -0400 |
commit | b423f6e8e50a770e9a7ab159a942f86f8ac45499 (patch) | |
tree | 933303323f46cce1f768aeac7e451d0c1f5853f4 | |
parent | 0bf0af02c38ade1b002f5949d7d16875981b795a (diff) | |
download | linux-sched/dlserver.debug.mar8.2024.tar.gz |
TEST: Relax zero-laxity if server recently stoppedsched/dlserver.debug.mar8.2024
Signed-off-by: Joel Fernandes (Google) <joel@joelfernandes.org>
-rw-r--r-- | include/linux/sched.h | 1 | ||||
-rw-r--r-- | kernel/sched/deadline.c | 14 |
2 files changed, 14 insertions, 1 deletions
diff --git a/include/linux/sched.h b/include/linux/sched.h index e7903a88d8c7d..7d393b435f48c 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -682,6 +682,7 @@ struct sched_dl_entity { dl_server_has_tasks_f server_has_tasks; dl_server_pick_f server_pick_next; dl_server_pick_f server_pick_task; + u64 server_last_stopped; #ifdef CONFIG_RT_MUTEXES /* diff --git a/kernel/sched/deadline.c b/kernel/sched/deadline.c index eb743649f24a5..b63f60a612a10 100644 --- a/kernel/sched/deadline.c +++ b/kernel/sched/deadline.c @@ -1053,7 +1053,7 @@ static int start_dl_timer(struct sched_dl_entity *dl_se) struct dl_rq *dl_rq = dl_rq_of_se(dl_se); struct rq *rq = rq_of_dl_rq(dl_rq); ktime_t now, act; - s64 delta; + s64 delta, time_since_stop, time_till_act; lockdep_assert_rq_held(rq); @@ -1071,6 +1071,17 @@ static int start_dl_timer(struct sched_dl_entity *dl_se) if (dl_se->dl_defer_armed) { WARN_ON_ONCE(!dl_se->dl_throttled); act = ns_to_ktime(dl_se->deadline - dl_se->runtime); + + /* + * If the server was recently stopped and started within the + * last period, queue it soon. + */ + if (dl_se->server_last_stopped) { + time_since_stop = rq_clock(rq) - dl_se->server_last_stopped; + if (time_since_stop < dl_se->dl_period) { + act = rq_clock(rq); + } + } } else { act = ns_to_ktime(dl_next_period(dl_se)); } @@ -1508,6 +1519,7 @@ void dl_server_stop(struct sched_dl_entity *dl_se) hrtimer_try_to_cancel(&dl_se->dl_timer); dl_se->dl_defer_armed = 0; dl_se->dl_throttled = 0; + dl_se->server_last_stopped = rq_clock(dl_se->rq); } void dl_server_init(struct sched_dl_entity *dl_se, struct rq *rq, |