| From cf877aba4c23f05f86544fb742f57da70904609f Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 9 Jun 2020 14:37:48 +0200 |
| Subject: sched/fair: Fix NOHZ next idle balance |
| |
| From: Vincent Guittot <vincent.guittot@linaro.org> |
| |
| [ Upstream commit 3ea2f097b17e13a8280f1f9386c331b326a3dbef ] |
| |
| With commit: |
| 'b7031a02ec75 ("sched/fair: Add NOHZ_STATS_KICK")' |
| rebalance_domains of the local cfs_rq happens before others idle cpus have |
| updated nohz.next_balance and its value is overwritten. |
| |
| Move the update of nohz.next_balance for other idles cpus before balancing |
| and updating the next_balance of local cfs_rq. |
| |
| Also, the nohz.next_balance is now updated only if all idle cpus got a |
| chance to rebalance their domains and the idle balance has not been aborted |
| because of new activities on the CPU. In case of need_resched, the idle |
| load balance will be kick the next jiffie in order to address remaining |
| ilb. |
| |
| Fixes: b7031a02ec75 ("sched/fair: Add NOHZ_STATS_KICK") |
| Reported-by: Peng Liu <iwtbavbm@gmail.com> |
| Signed-off-by: Vincent Guittot <vincent.guittot@linaro.org> |
| Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> |
| Reviewed-by: Valentin Schneider <valentin.schneider@arm.com> |
| Acked-by: Mel Gorman <mgorman@suse.de> |
| Link: https://lkml.kernel.org/r/20200609123748.18636-1-vincent.guittot@linaro.org |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| kernel/sched/fair.c | 23 ++++++++++++++--------- |
| 1 file changed, 14 insertions(+), 9 deletions(-) |
| |
| diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c |
| index 5c31875a7d9dc..e44332b829b4d 100644 |
| --- a/kernel/sched/fair.c |
| +++ b/kernel/sched/fair.c |
| @@ -10033,7 +10033,12 @@ static void kick_ilb(unsigned int flags) |
| { |
| int ilb_cpu; |
| |
| - nohz.next_balance++; |
| + /* |
| + * Increase nohz.next_balance only when if full ilb is triggered but |
| + * not if we only update stats. |
| + */ |
| + if (flags & NOHZ_BALANCE_KICK) |
| + nohz.next_balance = jiffies+1; |
| |
| ilb_cpu = find_new_ilb(); |
| |
| @@ -10351,6 +10356,14 @@ static bool _nohz_idle_balance(struct rq *this_rq, unsigned int flags, |
| } |
| } |
| |
| + /* |
| + * next_balance will be updated only when there is a need. |
| + * When the CPU is attached to null domain for ex, it will not be |
| + * updated. |
| + */ |
| + if (likely(update_next_balance)) |
| + nohz.next_balance = next_balance; |
| + |
| /* Newly idle CPU doesn't need an update */ |
| if (idle != CPU_NEWLY_IDLE) { |
| update_blocked_averages(this_cpu); |
| @@ -10371,14 +10384,6 @@ static bool _nohz_idle_balance(struct rq *this_rq, unsigned int flags, |
| if (has_blocked_load) |
| WRITE_ONCE(nohz.has_blocked, 1); |
| |
| - /* |
| - * next_balance will be updated only when there is a need. |
| - * When the CPU is attached to null domain for ex, it will not be |
| - * updated. |
| - */ |
| - if (likely(update_next_balance)) |
| - nohz.next_balance = next_balance; |
| - |
| return ret; |
| } |
| |
| -- |
| 2.25.1 |
| |