Re: [PATCHv2 1/7] x86/mm: concentrate the code to memblock allocator enabled

2019-01-14 Thread Pingfan Liu
On Tue, Jan 15, 2019 at 7:07 AM Dave Hansen  wrote:
>
> On 1/10/19 9:12 PM, Pingfan Liu wrote:
> > This patch identifies the point where memblock alloc start. It has no
> > functional.
>
> It has no functional ... what?  Effects?
>
During re-organize the code, it takes me a long time to figure out why
memblock_set_bottom_up(true) is added here, and how far can it be
deferred. And finally, I realize that it only takes effect after
e820__memblock_setup(), the point where memblock allocator can work.
So I concentrate the related code, and hope this patch can classify
this truth.

> > - memblock_set_current_limit(ISA_END_ADDRESS);
> > - e820__memblock_setup();
> > -
> >   reserve_bios_regions();
> >
> >   if (efi_enabled(EFI_MEMMAP)) {
> > @@ -1113,6 +1087,8 @@ void __init setup_arch(char **cmdline_p)
> >   efi_reserve_boot_services();
> >   }
> >
> > + memblock_set_current_limit(0, ISA_END_ADDRESS, false);
> > + e820__memblock_setup();
>
> It looks like you changed the arguments passed to
> memblock_set_current_limit().  How can this even compile?  Did you mean
> that this patch is not functional?
>
Sorry that during rebasing, merge trivial fix by mistake. I will build
against each patch.

Best regards,
Pingfan


Re: [PATCHv2 1/7] x86/mm: concentrate the code to memblock allocator enabled

2019-01-11 Thread Pingfan Liu
On Fri, Jan 11, 2019 at 2:13 PM Chao Fan  wrote:
>
> On Fri, Jan 11, 2019 at 01:12:51PM +0800, Pingfan Liu wrote:
> >This patch identifies the point where memblock alloc start. It has no
> >functional.
> [...]
> >+#ifdef CONFIG_MEMORY_HOTPLUG
> >+  /*
> >+   * Memory used by the kernel cannot be hot-removed because Linux
> >+   * cannot migrate the kernel pages. When memory hotplug is
> >+   * enabled, we should prevent memblock from allocating memory
> >+   * for the kernel.
> >+   *
> >+   * ACPI SRAT records all hotpluggable memory ranges. But before
> >+   * SRAT is parsed, we don't know about it.
> >+   *
> >+   * The kernel image is loaded into memory at very early time. We
> >+   * cannot prevent this anyway. So on NUMA system, we set any
> >+   * node the kernel resides in as un-hotpluggable.
> >+   *
> >+   * Since on modern servers, one node could have double-digit
> >+   * gigabytes memory, we can assume the memory around the kernel
> >+   * image is also un-hotpluggable. So before SRAT is parsed, just
> >+   * allocate memory near the kernel image to try the best to keep
> >+   * the kernel away from hotpluggable memory.
> >+   */
> >+  if (movable_node_is_enabled())
> >+  memblock_set_bottom_up(true);
>
> Hi Pingfan,
>
> In my understanding, 'movable_node' is based on the that memory near
> kernel is considered as in the same node as kernel in high possibility.
>
> If SRAT has been parsed early, do we still need the kernel parameter
> 'movable_node'? Since you have got the memory information about hot-remove,
> so I wonder if it's OK to drop 'movable_node', and if memory-hotremove is
> enabled, change memblock allocation according to SRAT.
>
x86_32 still need this logic. Maybe it can be doable later.

Thanks,
Pingfan
> If there is something wrong in my understanding, please let me know.
>
> Thanks,
> Chao Fan
>
> >+#endif
> >   init_mem_mapping();
> >+  memblock_set_current_limit(get_max_mapped());
> >
> >   idt_setup_early_pf();
> >
> >@@ -1145,8 +1145,6 @@ void __init setup_arch(char **cmdline_p)
> >*/
> >   mmu_cr4_features = __read_cr4() & ~X86_CR4_PCIDE;
> >
> >-  memblock_set_current_limit(get_max_mapped());
> >-
> >   /*
> >* NOTE: On x86-32, only from this point on, fixmaps are ready for 
> > use.
> >*/
> >--
> >2.7.4
> >
> >
> >
>
>


Re: [PATCHv2 1/7] x86/mm: concentrate the code to memblock allocator enabled

2019-01-10 Thread Chao Fan
On Fri, Jan 11, 2019 at 01:12:51PM +0800, Pingfan Liu wrote:
>This patch identifies the point where memblock alloc start. It has no
>functional.
[...]
>+#ifdef CONFIG_MEMORY_HOTPLUG
>+  /*
>+   * Memory used by the kernel cannot be hot-removed because Linux
>+   * cannot migrate the kernel pages. When memory hotplug is
>+   * enabled, we should prevent memblock from allocating memory
>+   * for the kernel.
>+   *
>+   * ACPI SRAT records all hotpluggable memory ranges. But before
>+   * SRAT is parsed, we don't know about it.
>+   *
>+   * The kernel image is loaded into memory at very early time. We
>+   * cannot prevent this anyway. So on NUMA system, we set any
>+   * node the kernel resides in as un-hotpluggable.
>+   *
>+   * Since on modern servers, one node could have double-digit
>+   * gigabytes memory, we can assume the memory around the kernel
>+   * image is also un-hotpluggable. So before SRAT is parsed, just
>+   * allocate memory near the kernel image to try the best to keep
>+   * the kernel away from hotpluggable memory.
>+   */
>+  if (movable_node_is_enabled())
>+  memblock_set_bottom_up(true);

Hi Pingfan,

In my understanding, 'movable_node' is based on the that memory near
kernel is considered as in the same node as kernel in high possibility.

If SRAT has been parsed early, do we still need the kernel parameter
'movable_node'? Since you have got the memory information about hot-remove,
so I wonder if it's OK to drop 'movable_node', and if memory-hotremove is
enabled, change memblock allocation according to SRAT.

If there is something wrong in my understanding, please let me know.

Thanks,
Chao Fan

>+#endif
>   init_mem_mapping();
>+  memblock_set_current_limit(get_max_mapped());
> 
>   idt_setup_early_pf();
> 
>@@ -1145,8 +1145,6 @@ void __init setup_arch(char **cmdline_p)
>*/
>   mmu_cr4_features = __read_cr4() & ~X86_CR4_PCIDE;
> 
>-  memblock_set_current_limit(get_max_mapped());
>-
>   /*
>* NOTE: On x86-32, only from this point on, fixmaps are ready for use.
>*/
>-- 
>2.7.4
>
>
>




[PATCHv2 1/7] x86/mm: concentrate the code to memblock allocator enabled

2019-01-10 Thread Pingfan Liu
This patch identifies the point where memblock alloc start. It has no
functional.

Signed-off-by: Pingfan Liu 
Cc: Thomas Gleixner 
Cc: Ingo Molnar 
Cc: Borislav Petkov 
Cc: "H. Peter Anvin" 
Cc: Dave Hansen 
Cc: Andy Lutomirski 
Cc: Peter Zijlstra 
Cc: "Rafael J. Wysocki" 
Cc: Len Brown 
Cc: Yinghai Lu 
Cc: Tejun Heo 
Cc: Chao Fan 
Cc: Baoquan He 
Cc: Juergen Gross 
Cc: Andrew Morton 
Cc: Mike Rapoport 
Cc: Vlastimil Babka 
Cc: Michal Hocko 
Cc: x...@kernel.org
Cc: linux-a...@vger.kernel.org
Cc: linux...@kvack.org
---
 arch/x86/kernel/setup.c | 54 -
 1 file changed, 26 insertions(+), 28 deletions(-)

diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
index d494b9b..ac432ae 100644
--- a/arch/x86/kernel/setup.c
+++ b/arch/x86/kernel/setup.c
@@ -962,29 +962,6 @@ void __init setup_arch(char **cmdline_p)
 
if (efi_enabled(EFI_BOOT))
efi_memblock_x86_reserve_range();
-#ifdef CONFIG_MEMORY_HOTPLUG
-   /*
-* Memory used by the kernel cannot be hot-removed because Linux
-* cannot migrate the kernel pages. When memory hotplug is
-* enabled, we should prevent memblock from allocating memory
-* for the kernel.
-*
-* ACPI SRAT records all hotpluggable memory ranges. But before
-* SRAT is parsed, we don't know about it.
-*
-* The kernel image is loaded into memory at very early time. We
-* cannot prevent this anyway. So on NUMA system, we set any
-* node the kernel resides in as un-hotpluggable.
-*
-* Since on modern servers, one node could have double-digit
-* gigabytes memory, we can assume the memory around the kernel
-* image is also un-hotpluggable. So before SRAT is parsed, just
-* allocate memory near the kernel image to try the best to keep
-* the kernel away from hotpluggable memory.
-*/
-   if (movable_node_is_enabled())
-   memblock_set_bottom_up(true);
-#endif
 
x86_report_nx();
 
@@ -1096,9 +1073,6 @@ void __init setup_arch(char **cmdline_p)
 
cleanup_highmap();
 
-   memblock_set_current_limit(ISA_END_ADDRESS);
-   e820__memblock_setup();
-
reserve_bios_regions();
 
if (efi_enabled(EFI_MEMMAP)) {
@@ -1113,6 +1087,8 @@ void __init setup_arch(char **cmdline_p)
efi_reserve_boot_services();
}
 
+   memblock_set_current_limit(0, ISA_END_ADDRESS, false);
+   e820__memblock_setup();
/* preallocate 4k for mptable mpc */
e820__memblock_alloc_reserved_mpc_new();
 
@@ -1130,7 +1106,31 @@ void __init setup_arch(char **cmdline_p)
trim_platform_memory_ranges();
trim_low_memory_range();
 
+#ifdef CONFIG_MEMORY_HOTPLUG
+   /*
+* Memory used by the kernel cannot be hot-removed because Linux
+* cannot migrate the kernel pages. When memory hotplug is
+* enabled, we should prevent memblock from allocating memory
+* for the kernel.
+*
+* ACPI SRAT records all hotpluggable memory ranges. But before
+* SRAT is parsed, we don't know about it.
+*
+* The kernel image is loaded into memory at very early time. We
+* cannot prevent this anyway. So on NUMA system, we set any
+* node the kernel resides in as un-hotpluggable.
+*
+* Since on modern servers, one node could have double-digit
+* gigabytes memory, we can assume the memory around the kernel
+* image is also un-hotpluggable. So before SRAT is parsed, just
+* allocate memory near the kernel image to try the best to keep
+* the kernel away from hotpluggable memory.
+*/
+   if (movable_node_is_enabled())
+   memblock_set_bottom_up(true);
+#endif
init_mem_mapping();
+   memblock_set_current_limit(get_max_mapped());
 
idt_setup_early_pf();
 
@@ -1145,8 +1145,6 @@ void __init setup_arch(char **cmdline_p)
 */
mmu_cr4_features = __read_cr4() & ~X86_CR4_PCIDE;
 
-   memblock_set_current_limit(get_max_mapped());
-
/*
 * NOTE: On x86-32, only from this point on, fixmaps are ready for use.
 */
-- 
2.7.4