From afb6ebb3faeb382f7c8b4478f2a84cee37bb8610 Mon Sep 17 00:00:00 2001 From: Michal Hocko Date: Wed, 6 Sep 2017 16:20:17 -0700 Subject: [PATCH] mm, page_alloc: remove boot pageset initialization from memory hotplug boot_pageset is a boot time hack which gets superseded by normal pagesets later in the boot process. It makes zero sense to reinitialize it again and again during memory hotplug. Link: http://lkml.kernel.org/r/20170721143915.14161-3-mhocko@kernel.org Signed-off-by: Michal Hocko Acked-by: Mel Gorman Acked-by: Vlastimil Babka Cc: Johannes Weiner Cc: Joonsoo Kim Cc: Shaohua Li Cc: Toshi Kani Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds --- mm/page_alloc.c | 50 ++++++++++++++++++++++++++----------------------- 1 file changed, 27 insertions(+), 23 deletions(-) diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 6b23df1be909..94e64784a8be 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -5141,7 +5141,7 @@ DEFINE_MUTEX(zonelists_mutex); static int __build_all_zonelists(void *data) { int nid; - int cpu; + int __maybe_unused cpu; pg_data_t *self = data; #ifdef CONFIG_NUMA @@ -5162,6 +5162,31 @@ static int __build_all_zonelists(void *data) } } +#ifdef CONFIG_HAVE_MEMORYLESS_NODES + for_each_possible_cpu(cpu) { + /* + * We now know the "local memory node" for each node-- + * i.e., the node of the first zone in the generic zonelist. + * Set up numa_mem percpu variable for on-line cpus. During + * boot, only the boot cpu should be on-line; we'll init the + * secondary cpus' numa_mem as they come on-line. During + * node/memory hotplug, we'll fixup all on-line cpus. + */ + if (cpu_online(cpu)) + set_cpu_numa_mem(cpu, local_memory_node(cpu_to_node(cpu))); + } +#endif + + return 0; +} + +static noinline void __init +build_all_zonelists_init(void) +{ + int cpu; + + __build_all_zonelists(NULL); + /* * Initialize the boot_pagesets that are going to be used * for bootstrapping processors. The real pagesets for @@ -5175,30 +5200,9 @@ static int __build_all_zonelists(void *data) * needs the percpu allocator in order to allocate its pagesets * (a chicken-egg dilemma). */ - for_each_possible_cpu(cpu) { + for_each_possible_cpu(cpu) setup_pageset(&per_cpu(boot_pageset, cpu), 0); -#ifdef CONFIG_HAVE_MEMORYLESS_NODES - /* - * We now know the "local memory node" for each node-- - * i.e., the node of the first zone in the generic zonelist. - * Set up numa_mem percpu variable for on-line cpus. During - * boot, only the boot cpu should be on-line; we'll init the - * secondary cpus' numa_mem as they come on-line. During - * node/memory hotplug, we'll fixup all on-line cpus. - */ - if (cpu_online(cpu)) - set_cpu_numa_mem(cpu, local_memory_node(cpu_to_node(cpu))); -#endif - } - - return 0; -} - -static noinline void __init -build_all_zonelists_init(void) -{ - __build_all_zonelists(NULL); mminit_verify_zonelist(); cpuset_init_current_mems_allowed(); }