Messages in this thread Patch in this message | | | From | Matt Fleming <> | Subject | [PATCH] sched/fair: Avoid divide by zero when rebalancing domains | Date | Wed, 4 Jul 2018 15:24:55 +0100 |
| |
It's possible that the CPU doing nohz idle balance hasn't had its own load updated for many seconds. This can lead to huge deltas between rq->avg_stamp and rq->clock when rebalancing, and has been seen to cause the following crash:
divide error: 0000 [#1] SMP Call Trace: [<ffffffff810bcba8>] update_sd_lb_stats+0xe8/0x560 [<ffffffff810bd04d>] find_busiest_group+0x2d/0x4b0 [<ffffffff810bd640>] load_balance+0x170/0x950 [<ffffffff810be3ff>] rebalance_domains+0x13f/0x290 [<ffffffff810852bc>] __do_softirq+0xec/0x300 [<ffffffff8108578a>] irq_exit+0xfa/0x110 [<ffffffff816167d9>] reschedule_interrupt+0xc9/0xd0
Make sure we update the rq clock and load before balancing.
Cc: Ingo Molnar <mingo@kernel.org> Cc: Mike Galbraith <umgwanakikbuti@gmail.com> Cc: Peter Zijlstra <peterz@infradead.org> Signed-off-by: Matt Fleming <matt@codeblueprint.co.uk> --- kernel/sched/fair.c | 10 ++++++++++ 1 file changed, 10 insertions(+)
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index 2f0a0be4d344..2c81662c858a 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -9597,6 +9597,16 @@ static bool _nohz_idle_balance(struct rq *this_rq, unsigned int flags, */ smp_mb(); + /* + * Ensure this_rq's clock and load are up-to-date before we + * rebalance since it's possible that they haven't been + * updated for multiple schedule periods, i.e. many seconds. + */ + raw_spin_lock_irq(&this_rq->lock); + update_rq_clock(this_rq); + cpu_load_update_idle(this_rq); + raw_spin_unlock_irq(&this_rq->lock); + for_each_cpu(balance_cpu, nohz.idle_cpus_mask) { if (balance_cpu == this_cpu || !idle_cpu(balance_cpu)) continue; -- 2.13.6
| |