forked from mirrors/linux
		
	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>
This commit is contained in:
		
							parent
							
								
									299815a4fb
								
							
						
					
					
						commit
						c7f26ccfb2
					
				
					 1 changed files with 2 additions and 0 deletions
				
			
		| 
						 | 
					@ -1839,9 +1839,11 @@ static void vmstat_update(struct work_struct *w)
 | 
				
			||||||
		 * to occur in the future. Keep on running the
 | 
							 * to occur in the future. Keep on running the
 | 
				
			||||||
		 * update worker thread.
 | 
							 * update worker thread.
 | 
				
			||||||
		 */
 | 
							 */
 | 
				
			||||||
 | 
							preempt_disable();
 | 
				
			||||||
		queue_delayed_work_on(smp_processor_id(), mm_percpu_wq,
 | 
							queue_delayed_work_on(smp_processor_id(), mm_percpu_wq,
 | 
				
			||||||
				this_cpu_ptr(&vmstat_work),
 | 
									this_cpu_ptr(&vmstat_work),
 | 
				
			||||||
				round_jiffies_relative(sysctl_stat_interval));
 | 
									round_jiffies_relative(sysctl_stat_interval));
 | 
				
			||||||
 | 
							preempt_enable();
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue