Skip to content

Commit c7f26cc

Browse files
Steven J. Hilltorvalds
authored andcommitted
mm/vmstat.c: fix vmstat_update() preemption BUG
Attempting to hotplug CPUs with CONFIG_VM_EVENT_COUNTERS enabled can cause vmstat_update() to report a BUG due to preemption not being disabled around smp_processor_id(). Discovered on Ubiquiti EdgeRouter Pro with Cavium Octeon II processor. BUG: using smp_processor_id() in preemptible [00000000] code: kworker/1:1/269 caller is vmstat_update+0x50/0xa0 CPU: 0 PID: 269 Comm: kworker/1:1 Not tainted 4.16.0-rc4-Cavium-Octeon-00009-gf83bbd5-dirty #1 Workqueue: mm_percpu_wq vmstat_update Call Trace: show_stack+0x94/0x128 dump_stack+0xa4/0xe0 check_preemption_disabled+0x118/0x120 vmstat_update+0x50/0xa0 process_one_work+0x144/0x348 worker_thread+0x150/0x4b8 kthread+0x110/0x140 ret_from_kernel_thread+0x14/0x1c Link: http://lkml.kernel.org/r/1520881552-25659-1-git-send-email-steven.hill@cavium.com Signed-off-by: Steven J. Hill <steven.hill@cavium.com> Reviewed-by: Andrew Morton <akpm@linux-foundation.org> Cc: Tejun Heo <htejun@gmail.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
1 parent 299815a commit c7f26cc

1 file changed

Lines changed: 2 additions & 0 deletions

File tree

‎mm/vmstat.c‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1839,9 +1839,11 @@ static void vmstat_update(struct work_struct *w)
18391839
* to occur in the future. Keep on running the
18401840
* update worker thread.
18411841
*/
1842+
preempt_disable();
18421843
queue_delayed_work_on(smp_processor_id(), mm_percpu_wq,
18431844
this_cpu_ptr(&vmstat_work),
18441845
round_jiffies_relative(sysctl_stat_interval));
1846+
preempt_enable();
18451847
}
18461848
}
18471849

0 commit comments

Comments
 (0)