aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoel Fernandes (Google) <joel@joelfernandes.org>2024-03-12 16:38:43 -0400
committerJoel Fernandes (Google) <joel@joelfernandes.org>2024-03-12 20:58:47 -0400
commitb423f6e8e50a770e9a7ab159a942f86f8ac45499 (patch)
tree933303323f46cce1f768aeac7e451d0c1f5853f4
parent0bf0af02c38ade1b002f5949d7d16875981b795a (diff)
downloadlinux-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.h1
-rw-r--r--kernel/sched/deadline.c14
2 files changed, 14 insertions, 1 deletions
diff --git a/include/linux/sched.h b/include/linux/sched.h
index e7903a88d8c7d3..7d393b435f48ca 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 eb743649f24a58..b63f60a612a100 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,