summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorReza Arbab <arbab@linux.vnet.ibm.com>2016-12-12 19:42:55 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2016-12-12 21:55:07 -0500
commit39fa104d5b87655c1c19d4b1990ea63d190c4817 (patch)
treee127234b50e0eeb27b6b3aa1ef4be1c06e6cc8a7
parent4a3bac4e3ac212c31edd8b124a1a2c7e8c1767ed (diff)
mm: remove x86-only restriction of movable_node
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>
-rw-r--r--Documentation/kernel-parameters.txt2
-rw-r--r--arch/x86/kernel/setup.c24
-rw-r--r--mm/memory_hotplug.c20
3 files changed, 25 insertions, 21 deletions
diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt
index 86a31dfc036e..26f0f92206d7 100644
--- a/Documentation/kernel-parameters.txt
+++ b/Documentation/kernel-parameters.txt
@@ -2406,7 +2406,7 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
2406 that the amount of memory usable for all allocations 2406 that the amount of memory usable for all allocations
2407 is not too small. 2407 is not too small.
2408 2408
2409 movable_node [KNL,X86] Boot-time switch to enable the effects 2409 movable_node [KNL] Boot-time switch to enable the effects
2410 of CONFIG_MOVABLE_NODE=y. See mm/Kconfig for details. 2410 of CONFIG_MOVABLE_NODE=y. See mm/Kconfig for details.
2411 2411
2412 MTD_Partition= [MTD] 2412 MTD_Partition= [MTD]
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
index 9c337b0e8ba7..4cfba947d774 100644
--- a/arch/x86/kernel/setup.c
+++ b/arch/x86/kernel/setup.c
@@ -985,6 +985,30 @@ void __init setup_arch(char **cmdline_p)
985 985
986 parse_early_param(); 986 parse_early_param();
987 987
988#ifdef CONFIG_MEMORY_HOTPLUG
989 /*
990 * Memory used by the kernel cannot be hot-removed because Linux
991 * cannot migrate the kernel pages. When memory hotplug is
992 * enabled, we should prevent memblock from allocating memory
993 * for the kernel.
994 *
995 * ACPI SRAT records all hotpluggable memory ranges. But before
996 * SRAT is parsed, we don't know about it.
997 *
998 * The kernel image is loaded into memory at very early time. We
999 * cannot prevent this anyway. So on NUMA system, we set any
1000 * node the kernel resides in as un-hotpluggable.
1001 *
1002 * Since on modern servers, one node could have double-digit
1003 * gigabytes memory, we can assume the memory around the kernel
1004 * image is also un-hotpluggable. So before SRAT is parsed, just
1005 * allocate memory near the kernel image to try the best to keep
1006 * the kernel away from hotpluggable memory.
1007 */
1008 if (movable_node_is_enabled())
1009 memblock_set_bottom_up(true);
1010#endif
1011
988 x86_report_nx(); 1012 x86_report_nx();
989 1013
990 /* after early param, so could get panic from serial */ 1014 /* after early param, so could get panic from serial */
diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c
index cad4b9125695..e43142c15631 100644
--- a/mm/memory_hotplug.c
+++ b/mm/memory_hotplug.c
@@ -1727,26 +1727,6 @@ static bool can_offline_normal(struct zone *zone, unsigned long nr_pages)
1727static int __init cmdline_parse_movable_node(char *p) 1727static int __init cmdline_parse_movable_node(char *p)
1728{ 1728{
1729#ifdef CONFIG_MOVABLE_NODE 1729#ifdef CONFIG_MOVABLE_NODE
1730 /*
1731 * Memory used by the kernel cannot be hot-removed because Linux
1732 * cannot migrate the kernel pages. When memory hotplug is
1733 * enabled, we should prevent memblock from allocating memory
1734 * for the kernel.
1735 *
1736 * ACPI SRAT records all hotpluggable memory ranges. But before
1737 * SRAT is parsed, we don't know about it.
1738 *
1739 * The kernel image is loaded into memory at very early time. We
1740 * cannot prevent this anyway. So on NUMA system, we set any
1741 * node the kernel resides in as un-hotpluggable.
1742 *
1743 * Since on modern servers, one node could have double-digit
1744 * gigabytes memory, we can assume the memory around the kernel
1745 * image is also un-hotpluggable. So before SRAT is parsed, just
1746 * allocate memory near the kernel image to try the best to keep
1747 * the kernel away from hotpluggable memory.
1748 */
1749 memblock_set_bottom_up(true);
1750 movable_node_enabled = true; 1730 movable_node_enabled = true;
1751#else 1731#else
1752 pr_warn("movable_node option not supported\n"); 1732 pr_warn("movable_node option not supported\n");