On 07/14/2017 09:59 AM, Michal Hocko wrote:
> From: Michal Hocko <[email protected]>
> 
> 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.
> 
> Signed-off-by: Michal Hocko <[email protected]>

Acked-by: Vlastimil Babka <[email protected]>

> ---
>  mm/page_alloc.c | 38 +++++++++++++++++++++-----------------
>  1 file changed, 21 insertions(+), 17 deletions(-)
> 
> diff --git a/mm/page_alloc.c b/mm/page_alloc.c
> index d9f4ea057e74..7746824a425d 100644
> --- a/mm/page_alloc.c
> +++ b/mm/page_alloc.c
> @@ -5098,23 +5098,8 @@ static int __build_all_zonelists(void *data)
>               }
>       }
>  
> -     /*
> -      * Initialize the boot_pagesets that are going to be used
> -      * for bootstrapping processors. The real pagesets for
> -      * each zone will be allocated later when the per cpu
> -      * allocator is available.
> -      *
> -      * boot_pagesets are used also for bootstrapping offline
> -      * cpus if the system is already booted because the pagesets
> -      * are needed to initialize allocators on a specific cpu too.
> -      * F.e. the percpu allocator needs the page allocator which
> -      * needs the percpu allocator in order to allocate its pagesets
> -      * (a chicken-egg dilemma).
> -      */
> -     for_each_possible_cpu(cpu) {
> -             setup_pageset(&per_cpu(boot_pageset, cpu), 0);
> -
>  #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.
> @@ -5125,8 +5110,8 @@ static int __build_all_zonelists(void *data)
>                */
>               if (cpu_online(cpu))
>                       set_cpu_numa_mem(cpu, 
> local_memory_node(cpu_to_node(cpu)));
> -#endif
>       }
> +#endif
>  
>       return 0;
>  }
> @@ -5134,7 +5119,26 @@ static int __build_all_zonelists(void *data)
>  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
> +      * each zone will be allocated later when the per cpu
> +      * allocator is available.
> +      *
> +      * boot_pagesets are used also for bootstrapping offline
> +      * cpus if the system is already booted because the pagesets
> +      * are needed to initialize allocators on a specific cpu too.
> +      * F.e. the percpu allocator needs the page allocator which
> +      * needs the percpu allocator in order to allocate its pagesets
> +      * (a chicken-egg dilemma).
> +      */
> +     for_each_possible_cpu(cpu)
> +             setup_pageset(&per_cpu(boot_pageset, cpu), 0);
> +
>       mminit_verify_zonelist();
>       cpuset_init_current_mems_allowed();
>  }
> 

Reply via email to