mm: remove x86-only restriction of movable_node
authorReza Arbab <arbab@linux.vnet.ibm.com>
Tue, 13 Dec 2016 00:42:55 +0000 (16:42 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 13 Dec 2016 02:55:07 +0000 (18:55 -0800)
In commit c5320926e370 ("mem-hotplug: introduce movable_node boot
option"), the memblock allocation direction is changed to bottom-up and
then back to top-down like this:

1. memblock_set_bottom_up(true), called by cmdline_parse_movable_node().
2. memblock_set_bottom_up(false), called by x86's numa_init().

Even though (1) occurs in generic mm code, it is wrapped by #ifdef
CONFIG_MOVABLE_NODE, which depends on X86_64.

This means that when we extend CONFIG_MOVABLE_NODE to non-x86 arches,
things will be unbalanced.  (1) will happen for them, but (2) will not.

This toggle was added in the first place because x86 has a delay between
adding memblocks and marking them as hotpluggable.  Since other arches
do this marking either immediately or not at all, they do not require
the bottom-up toggle.

So, resolve things by moving (1) from cmdline_parse_movable_node() to
x86's setup_arch(), immediately after the movable_node parameter has
been parsed.

Link: http://lkml.kernel.org/r/1479160961-25840-3-git-send-email-arbab@linux.vnet.ibm.com
Signed-off-by: Reza Arbab <arbab@linux.vnet.ibm.com>
Acked-by: Balbir Singh <bsingharora@gmail.com>
Cc: "Aneesh Kumar K.V" <aneesh.kumar@linux.vnet.ibm.com>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: Alistair Popple <apopple@au1.ibm.com>
Cc: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Bharata B Rao <bharata@linux.vnet.ibm.com>
Cc: Frank Rowand <frowand.list@gmail.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Michael Ellerman <mpe@ellerman.id.au>
Cc: Nathan Fontenot <nfont@linux.vnet.ibm.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Rob Herring <robh+dt@kernel.org>
Cc: Stewart Smith <stewart@linux.vnet.ibm.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Documentation/kernel-parameters.txt
arch/x86/kernel/setup.c
mm/memory_hotplug.c

index 86a31dfc036e5c6d135828068d2e03ddda3f6833..26f0f92206d7440c614f817bfdfe239364c552a1 100644 (file)
@@ -2406,7 +2406,7 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
                        that the amount of memory usable for all allocations
                        is not too small.
 
-       movable_node    [KNL,X86] Boot-time switch to enable the effects
+       movable_node    [KNL] Boot-time switch to enable the effects
                        of CONFIG_MOVABLE_NODE=y. See mm/Kconfig for details.
 
        MTD_Partition=  [MTD]
index 9c337b0e8ba7c4ac5b82a3e4ad979c7d4011b4bf..4cfba947d77429fd13d393819b1682879ed9aa06 100644 (file)
@@ -985,6 +985,30 @@ void __init setup_arch(char **cmdline_p)
 
        parse_early_param();
 
+#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();
 
        /* after early param, so could get panic from serial */
index cad4b9125695cfbfcc7509e942f6d8f8a37f460c..e43142c15631fefdf5a605ced247a6429825252f 100644 (file)
@@ -1727,26 +1727,6 @@ static bool can_offline_normal(struct zone *zone, unsigned long nr_pages)
 static int __init cmdline_parse_movable_node(char *p)
 {
 #ifdef CONFIG_MOVABLE_NODE
-       /*
-        * 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.
-        */
-       memblock_set_bottom_up(true);
        movable_node_enabled = true;
 #else
        pr_warn("movable_node option not supported\n");