These changes enable the dynamic creation of movable nodes on power.
On x86, the ACPI SRAT memory affinity structure can mark memory
hotpluggable, allowing the kernel to possibly create movable nodes at
boot.
While power has no analog of this SRAT information, we can still create
a movable memory node, post boot, by hotplugging all of the node's
memory into ZONE_MOVABLE.
In v1, this patchset introduced a new dt compatible id to explicitly
create a memoryless node at boot. Here, things have been simplified to
be applicable regardless of the status of node hotplug on power. We
still intend to enable hotadding a pgdat, but that's now untangled as a
separate topic.
v5:
* Drop the patches which recognize the "status" property of dt memory
nodes. Firmware can set the size of "linux,usable-memory" to zero instead.
v4:
* http://lkml.kernel.org/r/1475778995-1420-1-git-send-email-arbab@linux.vnet.ibm.com
* Rename of_fdt_is_available() to of_fdt_device_is_available().
Rename of_flat_dt_is_available() to of_flat_dt_device_is_available().
* Instead of restoring top-down allocation, ensure it never goes
bottom-up in the first place, by making movable_node arch-specific.
* Use MEMORY_HOTPLUG instead of PPC64 in the mm/Kconfig patch.
v3:
* http://lkml.kernel.org/r/1474828616-16608-1-git-send-email-arbab@linux.vnet.ibm.com
* Use Rob Herring's suggestions to improve the node availability check.
* More verbose commit log in the patch enabling CONFIG_MOVABLE_NODE.
* Add a patch to restore top-down allocation the way x86 does.
v2:
* http://lkml.kernel.org/r/1473883618-14998-1-git-send-email-arbab@linux.vnet.ibm.com
* Use the "status" property of standard dt memory nodes instead of
introducing a new "ibm,hotplug-aperture" compatible id.
* Remove the patch which explicitly creates a memoryless node. This set
no longer has any bearing on whether the pgdat is created at boot or
at the time of memory addition.
v1:
* http://lkml.kernel.org/r/1470680843-28702-1-git-send-email-arbab@linux.vnet.ibm.com
Reza Arbab (3):
powerpc/mm: allow memory hotplug into a memoryless node
mm: make processing of movable_node arch-specific
mm: enable CONFIG_MOVABLE_NODE on non-x86 arches
arch/powerpc/mm/numa.c | 13 +------------
arch/x86/mm/numa.c | 35 ++++++++++++++++++++++++++++++++++-
mm/Kconfig | 2 +-
mm/memory_hotplug.c | 31 -------------------------------
4 files changed, 36 insertions(+), 45 deletions(-)
--
1.8.3.1
To support movable memory nodes (CONFIG_MOVABLE_NODE), at least one of
the following must be true:
1. We're on x86. This arch has the capability to identify movable nodes
at boot by parsing the ACPI SRAT, if the movable_node option is used.
2. Our config supports memory hotplug, which means that a movable node
can be created by hotplugging all of its memory into ZONE_MOVABLE.
Fix the Kconfig definition of CONFIG_MOVABLE_NODE, which currently
recognizes (1), but not (2).
Signed-off-by: Reza Arbab <redacted>
Reviewed-by: Aneesh Kumar K.V <redacted>
Acked-by: Balbir Singh <bsingharora@gmail.com>
---
mm/Kconfig | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
@@ -153,7 +153,7 @@ config MOVABLE_NODEbool"Enable to assign a node which has only movable memory"depends onHAVE_MEMBLOCKdepends onNO_BOOTMEM-depends onX86_64+depends onX86_64||MEMORY_HOTPLUGdepends onNUMAdefaultnhelp
Currently, CONFIG_MOVABLE_NODE depends on X86_64. In preparation to
enable it for other arches, we need to factor a detail which is unique
to x86 out of the generic mm code.
Specifically, as documented in kernel-parameters.txt, the use of
"movable_node" should remain restricted to x86:
movable_node [KNL,X86] Boot-time switch to enable the effects
of CONFIG_MOVABLE_NODE=y. See mm/Kconfig for details.
This option tells x86 to find movable nodes identified by the ACPI SRAT.
On other arches, it would have no benefit, only the undesired side
effect of setting bottom-up memblock allocation.
Since #ifdef CONFIG_MOVABLE_NODE will no longer be enough to restrict
this option to x86, move it to an arch-specific compilation unit
instead.
Signed-off-by: Reza Arbab <redacted>
Reviewed-by: Aneesh Kumar K.V <redacted>
Acked-by: Balbir Singh <bsingharora@gmail.com>
---
arch/x86/mm/numa.c | 35 ++++++++++++++++++++++++++++++++++-
mm/memory_hotplug.c | 31 -------------------------------
2 files changed, 34 insertions(+), 32 deletions(-)
@@ -1738,37 +1738,6 @@ static bool can_offline_normal(struct zone *zone, unsigned long nr_pages)}#endif /* CONFIG_MOVABLE_NODE */-staticint__initcmdline_parse_movable_node(char*p)-{-#ifdef CONFIG_MOVABLE_NODE-/*-*Memoryusedbythekernelcannotbehot-removedbecauseLinux-*cannotmigratethekernelpages.Whenmemoryhotplugis-*enabled,weshouldpreventmemblockfromallocatingmemory-*forthekernel.-*-*ACPISRATrecordsallhotpluggablememoryranges.Butbefore-*SRATisparsed,wedon'tknowaboutit.-*-*Thekernelimageisloadedintomemoryatveryearlytime.We-*cannotpreventthisanyway.SoonNUMAsystem,wesetany-*nodethekernelresidesinasun-hotpluggable.-*-*Sinceonmodernservers,onenodecouldhavedouble-digit-*gigabytesmemory,wecanassumethememoryaroundthekernel-*imageisalsoun-hotpluggable.SobeforeSRATisparsed,just-*allocatememorynearthekernelimagetotrythebesttokeep-*thekernelawayfromhotpluggablememory.-*/-memblock_set_bottom_up(true);-movable_node_enabled=true;-#else-pr_warn("movable_node option not supported\n");-#endif-return0;-}-early_param("movable_node",cmdline_parse_movable_node);-/* check which state of node_states will be changed when offline memory */staticvoidnode_states_check_changes_offline(unsignedlongnr_pages,structzone*zone,structmemory_notify*arg)
Remove the check which prevents us from hotplugging into an empty node.
The original commit b226e4621245 ("[PATCH] powerpc: don't add memory to
empty node/zone"), states that this was intended to be a temporary measure.
It is a workaround for an oops which no longer occurs.
Signed-off-by: Reza Arbab <redacted>
Reviewed-by: Aneesh Kumar K.V <redacted>
Acked-by: Balbir Singh <bsingharora@gmail.com>
Cc: Nathan Fontenot <redacted>
Cc: Bharata B Rao <redacted>
---
arch/powerpc/mm/numa.c | 13 +------------
1 file changed, 1 insertion(+), 12 deletions(-)
@@ -1085,7 +1085,7 @@ static int hot_add_node_scn_to_nid(unsigned long scn_addr)inthot_add_scn_to_nid(unsignedlongscn_addr){structdevice_node*memory=NULL;-intnid,found=0;+intnid;if(!numa_enabled||(min_common_depth<0))returnfirst_online_node;
@@ -1101,17 +1101,6 @@ int hot_add_scn_to_nid(unsigned long scn_addr)if(nid<0||!node_online(nid))nid=first_online_node;-if(NODE_DATA(nid)->node_spanned_pages)-returnnid;--for_each_online_node(nid){-if(NODE_DATA(nid)->node_spanned_pages){-found=1;-break;-}-}--BUG_ON(!found);returnnid;}