diff options
author | Michal Hocko <mhocko@suse.com> | 2017-03-31 18:11:47 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2017-03-31 20:13:30 -0400 |
commit | 597b7305dd8bafdb3aef4957d97128bc90af8e9f (patch) | |
tree | 459bc58d247bd7cfc213d894c71439c26cab7b33 | |
parent | 4b0ece6fa0167b22c004ff69e137dc94ee2e469e (diff) |
mm: move mm_percpu_wq initialization earlier
Yang Li has reported that drain_all_pages triggers a WARN_ON which means
that this function is called earlier than the mm_percpu_wq is
initialized on arm64 with CMA configured:
WARNING: CPU: 2 PID: 1 at mm/page_alloc.c:2423 drain_all_pages+0x244/0x25c
Modules linked in:
CPU: 2 PID: 1 Comm: swapper/0 Not tainted 4.11.0-rc1-next-20170310-00027-g64dfbc5 #127
Hardware name: Freescale Layerscape 2088A RDB Board (DT)
task: ffffffc07c4a6d00 task.stack: ffffffc07c4a8000
PC is at drain_all_pages+0x244/0x25c
LR is at start_isolate_page_range+0x14c/0x1f0
[...]
drain_all_pages+0x244/0x25c
start_isolate_page_range+0x14c/0x1f0
alloc_contig_range+0xec/0x354
cma_alloc+0x100/0x1fc
dma_alloc_from_contiguous+0x3c/0x44
atomic_pool_init+0x7c/0x208
arm64_dma_init+0x44/0x4c
do_one_initcall+0x38/0x128
kernel_init_freeable+0x1a0/0x240
kernel_init+0x10/0xfc
ret_from_fork+0x10/0x20
Fix this by moving the whole setup_vmstat which is an initcall right now
to init_mm_internals which will be called right after the WQ subsystem
is initialized.
Link: http://lkml.kernel.org/r/20170315164021.28532-1-mhocko@kernel.org
Signed-off-by: Michal Hocko <mhocko@suse.com>
Reported-by: Yang Li <pku.leo@gmail.com>
Tested-by: Yang Li <pku.leo@gmail.com>
Tested-by: Xiaolong Ye <xiaolong.ye@intel.com>
Cc: Mel Gorman <mgorman@suse.de>
Cc: Vlastimil Babka <vbabka@suse.cz>
Cc: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r-- | include/linux/mm.h | 2 | ||||
-rw-r--r-- | init/main.c | 2 | ||||
-rw-r--r-- | mm/vmstat.c | 4 |
3 files changed, 5 insertions, 3 deletions
diff --git a/include/linux/mm.h b/include/linux/mm.h index 5f01c88f0800..00a8fa7e366a 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h | |||
@@ -32,6 +32,8 @@ struct user_struct; | |||
32 | struct writeback_control; | 32 | struct writeback_control; |
33 | struct bdi_writeback; | 33 | struct bdi_writeback; |
34 | 34 | ||
35 | void init_mm_internals(void); | ||
36 | |||
35 | #ifndef CONFIG_NEED_MULTIPLE_NODES /* Don't use mapnrs, do it properly */ | 37 | #ifndef CONFIG_NEED_MULTIPLE_NODES /* Don't use mapnrs, do it properly */ |
36 | extern unsigned long max_mapnr; | 38 | extern unsigned long max_mapnr; |
37 | 39 | ||
diff --git a/init/main.c b/init/main.c index f9c9d9948203..b0c11cbf5ddf 100644 --- a/init/main.c +++ b/init/main.c | |||
@@ -1022,6 +1022,8 @@ static noinline void __init kernel_init_freeable(void) | |||
1022 | 1022 | ||
1023 | workqueue_init(); | 1023 | workqueue_init(); |
1024 | 1024 | ||
1025 | init_mm_internals(); | ||
1026 | |||
1025 | do_pre_smp_initcalls(); | 1027 | do_pre_smp_initcalls(); |
1026 | lockup_detector_init(); | 1028 | lockup_detector_init(); |
1027 | 1029 | ||
diff --git a/mm/vmstat.c b/mm/vmstat.c index b1947f0cbee2..89f95396ec46 100644 --- a/mm/vmstat.c +++ b/mm/vmstat.c | |||
@@ -1764,7 +1764,7 @@ static int vmstat_cpu_dead(unsigned int cpu) | |||
1764 | 1764 | ||
1765 | #endif | 1765 | #endif |
1766 | 1766 | ||
1767 | static int __init setup_vmstat(void) | 1767 | void __init init_mm_internals(void) |
1768 | { | 1768 | { |
1769 | #ifdef CONFIG_SMP | 1769 | #ifdef CONFIG_SMP |
1770 | int ret; | 1770 | int ret; |
@@ -1792,9 +1792,7 @@ static int __init setup_vmstat(void) | |||
1792 | proc_create("vmstat", S_IRUGO, NULL, &proc_vmstat_file_operations); | 1792 | proc_create("vmstat", S_IRUGO, NULL, &proc_vmstat_file_operations); |
1793 | proc_create("zoneinfo", S_IRUGO, NULL, &proc_zoneinfo_file_operations); | 1793 | proc_create("zoneinfo", S_IRUGO, NULL, &proc_zoneinfo_file_operations); |
1794 | #endif | 1794 | #endif |
1795 | return 0; | ||
1796 | } | 1795 | } |
1797 | module_init(setup_vmstat) | ||
1798 | 1796 | ||
1799 | #if defined(CONFIG_DEBUG_FS) && defined(CONFIG_COMPACTION) | 1797 | #if defined(CONFIG_DEBUG_FS) && defined(CONFIG_COMPACTION) |
1800 | 1798 | ||