FROMGIT: sched/deadline: Less agressive dl_server handling
Chris reported that commit5f6bd380c7("sched/rt: Remove default bandwidth control") caused a significant dip in his favourite benchmark of the day. Simply disabling dl_server cured things. His workload hammers the 0->1, 1->0 transitions, and the dl_server_{start,stop}() overhead kills it -- fairly obviously a bad idea in hind sight and all that. Change things around to only disable the dl_server when there has not been a fair task around for a whole period. Since the default period is 1 second, this ensures the benchmark never trips this, overhead gone. Fixes:557a6bfc66("sched/fair: Add trivial fair server") Reported-by: Chris Mason <clm@meta.com> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> (cherry picked from commit 7bca60ce656978b01caafc4e2285272ae9631953 https://git.kernel.org/pub/scm/linux/kernel/git/peterz/queue.git/commit/?h=sched/core) Link: https://lore.kernel.org/all/20250520101727.507378961@infradead.org/ Tested-by: K Prateek Nayak <kprateek.nayak@amd.com> Change-Id: Iaa47846edcc4a06e87baf21fccfbd0cbdeaf2b7f Bug: 410614532 Bug: 422165470 Signed-off-by: Shaleen Agrawal <quic_shalagra@quicinc.com> [jstultz: Switched to FROMGIT] Signed-off-by: John Stultz <jstultz@google.com>
This commit is contained in:
committed by
John Stultz
parent
35c421e883
commit
738664c527
@@ -689,6 +689,7 @@ struct sched_dl_entity {
|
||||
unsigned int dl_defer : 1;
|
||||
unsigned int dl_defer_armed : 1;
|
||||
unsigned int dl_defer_running : 1;
|
||||
unsigned int dl_server_idle : 1;
|
||||
|
||||
/*
|
||||
* Bandwidth enforcement timer. Each -deadline task has its
|
||||
|
||||
@@ -1195,6 +1195,8 @@ static void __push_dl_task(struct rq *rq, struct rq_flags *rf)
|
||||
/* a defer timer will not be reset if the runtime consumed was < dl_server_min_res */
|
||||
static const u64 dl_server_min_res = 1 * NSEC_PER_MSEC;
|
||||
|
||||
static bool dl_server_stopped(struct sched_dl_entity *dl_se);
|
||||
|
||||
static enum hrtimer_restart dl_server_timer(struct hrtimer *timer, struct sched_dl_entity *dl_se)
|
||||
{
|
||||
struct rq *rq = rq_of_dl_se(dl_se);
|
||||
@@ -1214,6 +1216,7 @@ static enum hrtimer_restart dl_server_timer(struct hrtimer *timer, struct sched_
|
||||
|
||||
if (!dl_se->server_has_tasks(dl_se)) {
|
||||
replenish_dl_entity(dl_se);
|
||||
dl_server_stopped(dl_se);
|
||||
return HRTIMER_NORESTART;
|
||||
}
|
||||
|
||||
@@ -1620,8 +1623,10 @@ void dl_server_update_idle_time(struct rq *rq, struct task_struct *p)
|
||||
void dl_server_update(struct sched_dl_entity *dl_se, s64 delta_exec)
|
||||
{
|
||||
/* 0 runtime = fair server disabled */
|
||||
if (dl_se->dl_runtime)
|
||||
if (dl_se->dl_runtime) {
|
||||
dl_se->dl_server_idle = 0;
|
||||
update_curr_dl_se(dl_se->rq, dl_se, delta_exec);
|
||||
}
|
||||
}
|
||||
|
||||
void dl_server_start(struct sched_dl_entity *dl_se)
|
||||
@@ -1644,7 +1649,7 @@ void dl_server_start(struct sched_dl_entity *dl_se)
|
||||
setup_new_dl_entity(dl_se);
|
||||
}
|
||||
|
||||
if (!dl_se->dl_runtime)
|
||||
if (!dl_se->dl_runtime || dl_se->dl_server_active)
|
||||
return;
|
||||
|
||||
dl_se->dl_server_active = 1;
|
||||
@@ -1653,7 +1658,7 @@ void dl_server_start(struct sched_dl_entity *dl_se)
|
||||
resched_curr(dl_se->rq);
|
||||
}
|
||||
|
||||
void dl_server_stop(struct sched_dl_entity *dl_se)
|
||||
static void __dl_server_stop(struct sched_dl_entity *dl_se)
|
||||
{
|
||||
if (!dl_se->dl_runtime)
|
||||
return;
|
||||
@@ -1665,6 +1670,24 @@ void dl_server_stop(struct sched_dl_entity *dl_se)
|
||||
dl_se->dl_server_active = 0;
|
||||
}
|
||||
|
||||
static bool dl_server_stopped(struct sched_dl_entity *dl_se)
|
||||
{
|
||||
if (!dl_se->dl_server_active)
|
||||
return false;
|
||||
|
||||
if (dl_se->dl_server_idle) {
|
||||
__dl_server_stop(dl_se);
|
||||
return true;
|
||||
}
|
||||
|
||||
dl_se->dl_server_idle = 1;
|
||||
return false;
|
||||
}
|
||||
|
||||
void dl_server_stop(struct sched_dl_entity *dl_se)
|
||||
{
|
||||
}
|
||||
|
||||
void dl_server_init(struct sched_dl_entity *dl_se, struct rq *rq,
|
||||
dl_server_has_tasks_f has_tasks,
|
||||
dl_server_pick_f pick_task)
|
||||
@@ -2432,7 +2455,7 @@ again:
|
||||
if (dl_server(dl_se)) {
|
||||
p = dl_se->server_pick_task(dl_se);
|
||||
if (!p) {
|
||||
if (dl_server_active(dl_se)) {
|
||||
if (!dl_server_stopped(dl_se)) {
|
||||
dl_se->dl_yielded = 1;
|
||||
update_curr_dl_se(rq, dl_se, 0);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user