Messages in this thread Patch in this message | | | Date | Tue, 12 Jan 2016 06:23:07 -0600 (CST) | From | Christoph Lameter <> | Subject | Re: mm, vmstat: kernel BUG at mm/vmstat.c:1408! |
| |
On Tue, 12 Jan 2016, Shiraz Hashim wrote:
> > + refresh_cpu_vm_stats(false); > > + cancel_delayed_work(this_cpu_ptr(&vmstat_work)); > > > > shouldn't this be cancel_delayed_work_sync ?
Hmmm... This is executed with preemption off and the work is on the same cpu. If it would be able to run concurrently then we would need this.
Ok but it could run from the timer interrupt if that is still on and occuring shortly before we go idle. Guess this needs to be similar to the code we execute on cpu down in the vmstat notifiers (see vmstat_cpuup_callback).
Does this fix it? I have not been able to reproduce the issue so far.
Patch against -next.
Subject: vmstat: Use delayed work_sync and avoid loop.
Signed-off-by: Christoph Lameter <cl@linux.com>
Index: linux/mm/vmstat.c =================================================================== --- linux.orig/mm/vmstat.c +++ linux/mm/vmstat.c @@ -1419,11 +1419,9 @@ void quiet_vmstat(void) if (system_state != SYSTEM_RUNNING) return;
- do { - if (!cpumask_test_and_set_cpu(smp_processor_id(), cpu_stat_off)) - cancel_delayed_work(this_cpu_ptr(&vmstat_work)); - - } while (refresh_cpu_vm_stats(false)); + refresh_cpu_vm_stats(false); + cancel_delayed_work_sync(this_cpu_ptr(&vmstat_work)); + cpumask_set_cpu(smp_processor_id(), cpu_stat_off); }
/*
| |