diff options
author | Reza Arbab <arbab@linux.vnet.ibm.com> | 2016-12-12 19:42:55 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2016-12-12 21:55:07 -0500 |
commit | 39fa104d5b87655c1c19d4b1990ea63d190c4817 (patch) | |
tree | e127234b50e0eeb27b6b3aa1ef4be1c06e6cc8a7 | |
parent | 4a3bac4e3ac212c31edd8b124a1a2c7e8c1767ed (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.txt | 2 | ||||
-rw-r--r-- | arch/x86/kernel/setup.c | 24 | ||||
-rw-r--r-- | mm/memory_hotplug.c | 20 |
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) | |||
1727 | static int __init cmdline_parse_movable_node(char *p) | 1727 | static 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"); |