Messages in this thread Patch in this message |  | | From | Vincent Guittot <> | | Subject | [PATCH 1/2] sched/fair: account update_blocked_averages in newidle_balance cost | | Date | Mon, 4 Oct 2021 19:14:50 +0200 |
| |
The time spent to update the blocked load can be significant depending of the complexity fo the cgroup hierarchy. Take this time into account when deciding to stop newidle_balance() because it exceeds the expected idle time.
Signed-off-by: Vincent Guittot <vincent.guittot@linaro.org> --- kernel/sched/fair.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index 8943dbb94365..1f78b2e3b71c 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -10810,7 +10810,7 @@ static int newidle_balance(struct rq *this_rq, struct rq_flags *rf) int this_cpu = this_rq->cpu; struct sched_domain *sd; int pulled_task = 0; - u64 curr_cost = 0; + u64 t0, domain_cost, curr_cost = 0; update_misfit_status(NULL, this_rq); @@ -10855,11 +10855,14 @@ static int newidle_balance(struct rq *this_rq, struct rq_flags *rf) raw_spin_rq_unlock(this_rq); + t0 = sched_clock_cpu(this_cpu); update_blocked_averages(this_cpu); + domain_cost = sched_clock_cpu(this_cpu) - t0; + curr_cost += domain_cost; + rcu_read_lock(); for_each_domain(this_cpu, sd) { int continue_balancing = 1; - u64 t0, domain_cost; if (this_rq->avg_idle < curr_cost + sd->max_newidle_lb_cost) { update_next_balance(sd, &next_balance); -- 2.17.1
|  |