This patchset allows more configs to make use of movable nodes. When
CONFIG_MOVABLE_NODE is selected, there are two ways to introduce such
nodes into the system:
1. Discover movable nodes at boot. Currently this is only possible on
x86, but we will enable configs supporting fdt to do the same.
2. Hotplug and online all of a node's memory using online_movable. This
is already possible on any config supporting memory hotplug, not
just x86, but the Kconfig doesn't say so. We will fix that.
We'll also remove some cruft on power which would prevent (2).
/* changelog */
v6:
* Add a patch enabling the fdt to describe hotpluggable memory.
v5:
* http://lkml.kernel.org/r/1477339089-5455-1-git-send-email-arbab@linux.vnet.ibm.com
* 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 (4):
powerpc/mm: allow memory hotplug into a memoryless node
mm: remove x86-only restriction of movable_node
mm: enable CONFIG_MOVABLE_NODE on non-x86 arches
of/fdt: mark hotpluggable memory
Documentation/kernel-parameters.txt | 2 +-
arch/powerpc/mm/numa.c | 13 +------------
arch/x86/kernel/setup.c | 24 ++++++++++++++++++++++++
drivers/of/fdt.c | 6 ++++++
mm/Kconfig | 2 +-
mm/memory_hotplug.c | 20 --------------------
6 files changed, 33 insertions(+), 34 deletions(-)
--
1.8.3.1
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.
Signed-off-by: Reza Arbab <redacted>
---
Documentation/kernel-parameters.txt | 2 +-
arch/x86/kernel/setup.c | 24 ++++++++++++++++++++++++
mm/memory_hotplug.c | 20 --------------------
3 files changed, 25 insertions(+), 21 deletions(-)
@@ -2401,7 +2401,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]
@@ -985,6 +985,30 @@ void __init setup_arch(char **cmdline_p)parse_early_param();+#ifdef CONFIG_MEMORY_HOTPLUG+/*+*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.+*/+if(movable_node_is_enabled())+memblock_set_bottom_up(true);+#endif+x86_report_nx();/* after early param, so could get panic from serial */
When movable nodes are enabled, any node containing only hotpluggable
memory is made movable at boot time.
On x86, hotpluggable memory is discovered by parsing the ACPI SRAT,
making corresponding calls to memblock_mark_hotplug().
If we introduce a dt property to describe memory as hotpluggable,
configs supporting early fdt may then also do this marking and use
movable nodes.
Signed-off-by: Reza Arbab <redacted>
---
drivers/of/fdt.c | 6 ++++++
mm/Kconfig | 2 +-
2 files changed, 7 insertions(+), 1 deletion(-)
@@ -1015,6 +1015,7 @@ int __init early_init_dt_scan_memory(unsigned long node, const char *uname,constchar*type=of_get_flat_dt_prop(node,"device_type",NULL);const__be32*reg,*endp;intl;+boolhotpluggable;/* We are scanning "memory" nodes only */if(type==NULL){
@@ -1034,6 +1035,7 @@ int __init early_init_dt_scan_memory(unsigned long node, const char *uname,return0;endp=reg+(l/sizeof(__be32));+hotpluggable=of_get_flat_dt_prop(node,"linux,hotpluggable",NULL);pr_debug("memory scan node %s, reg size %d,\n",uname,l);
@@ -1049,6 +1051,10 @@ int __init early_init_dt_scan_memory(unsigned long node, const char *uname,(unsignedlonglong)size);early_init_dt_add_memory_arch(base,size);++if(hotpluggable&&memblock_mark_hotplug(base,size))+pr_warn("failed to mark hotplug range 0x%llx - 0x%llx\n",+base,base+size);}return0;
@@ -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||MEMORY_HOTPLUG+depends onX86_64||OF_EARLY_FLATTREE||MEMORY_HOTPLUGdepends onNUMAdefaultnhelp
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;}
To support movable memory nodes (CONFIG_MOVABLE_NODE), at least one of
the following must be true:
1. This config has the capability to identify movable nodes at boot.
Right now, only x86 can do this.
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
drivers/of/fdt.c:1064:3: error: implicit declaration of function 'memblock_mark_hotplug'
cc1: some warnings being treated as errors
vim +/memblock_mark_hotplug +1064 drivers/of/fdt.c
1058 continue;
1059 pr_debug(" - %llx , %llx\n", (unsigned long long)base,
1060 (unsigned long long)size);
1061
1062 early_init_dt_add_memory_arch(base, size);
1063
1064 if (hotpluggable && memblock_mark_hotplug(base, size))
1065 pr_warn("failed to mark hotplug range 0x%llx - 0x%llx\n",
1066 base, base + size);
1067 }
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
From: Rob Herring <robh+dt@kernel.org> Date: 2016-11-09 18:13:23
On Mon, Nov 7, 2016 at 5:44 PM, Reza Arbab [off-list ref] wrote:
quoted hunk
When movable nodes are enabled, any node containing only hotpluggable
memory is made movable at boot time.
On x86, hotpluggable memory is discovered by parsing the ACPI SRAT,
making corresponding calls to memblock_mark_hotplug().
If we introduce a dt property to describe memory as hotpluggable,
configs supporting early fdt may then also do this marking and use
movable nodes.
Signed-off-by: Reza Arbab <redacted>
---
drivers/of/fdt.c | 6 ++++++
mm/Kconfig | 2 +-
2 files changed, 7 insertions(+), 1 deletion(-)
@@ -1015,6 +1015,7 @@ int __init early_init_dt_scan_memory(unsigned long node, const char *uname,constchar*type=of_get_flat_dt_prop(node,"device_type",NULL);const__be32*reg,*endp;intl;+boolhotpluggable;/* We are scanning "memory" nodes only */if(type==NULL){
@@ -1034,6 +1035,7 @@ int __init early_init_dt_scan_memory(unsigned long node, const char *uname,return0;endp=reg+(l/sizeof(__be32));+hotpluggable=of_get_flat_dt_prop(node,"linux,hotpluggable",NULL);
Memory being hotpluggable doesn't seem like a linux property to me.
I'd drop the linux prefix. Also, this needs to be documented.
Rob
When movable nodes are enabled, any node containing only hotpluggable
memory is made movable at boot time.
On x86, hotpluggable memory is discovered by parsing the ACPI SRAT,
making corresponding calls to memblock_mark_hotplug().
If we introduce a dt property to describe memory as hotpluggable,
configs supporting early fdt may then also do this marking and use
movable nodes.
This looks much better, like the other comments pointed out
We need documentation around the changes. One quick question
Have you tested this across all combinations of skiboot/kexec/SLOF boots?
Balbir Singh.
From: Michael Ellerman <mpe@ellerman.id.au> Date: 2016-11-10 01:37:15
Reza Arbab [off-list ref] writes:
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(-)
This seems OK from a powerpc perspective.
Acked-by: Michael Ellerman <mpe@ellerman.id.au>
cheers
When movable nodes are enabled, any node containing only hotpluggable
memory is made movable at boot time.
On x86, hotpluggable memory is discovered by parsing the ACPI SRAT,
making corresponding calls to memblock_mark_hotplug().
If we introduce a dt property to describe memory as hotpluggable,
configs supporting early fdt may then also do this marking and use
movable nodes.
Signed-off-by: Reza Arbab <redacted>
---
Tested-by: Balbir Singh <bsingharora@gmail.com>
I tested this with a custom device tree and it worked quite well for me.
It also means that the guest and bare-metal have two different mechanisms
of marking something as hotpluggable. But given that your patch enables
all architectures using OF, it might be worth it.
Balbir Singh.
From: Michael Ellerman <mpe@ellerman.id.au> Date: 2016-11-14 11:59:49
Reza Arbab [off-list ref] writes:
When movable nodes are enabled, any node containing only hotpluggable
memory is made movable at boot time.
On x86, hotpluggable memory is discovered by parsing the ACPI SRAT,
making corresponding calls to memblock_mark_hotplug().
If we introduce a dt property to describe memory as hotpluggable,
configs supporting early fdt may then also do this marking and use
movable nodes.
So I'm not opposed to this, but it is a little vague.
What does the "hotpluggable" property really mean?
Is it just a hint to the operating system? (which may or may not be
Linux).
Or is it a direction, "this memory must be able to be hotunplugged"?
I think you're intending the former, ie. a hint, which is probably OK.
But it needs to be documented clearly.
cheers
On Mon, Nov 14, 2016 at 10:59:43PM +1100, Michael Ellerman wrote:
So I'm not opposed to this, but it is a little vague.
What does the "hotpluggable" property really mean?
Is it just a hint to the operating system? (which may or may not be
Linux).
Or is it a direction, "this memory must be able to be hotunplugged"?
I think you're intending the former, ie. a hint, which is probably OK.
But it needs to be documented clearly.
Yes, you've got it right. It's just a hint, not a mandate.
I'm about to send v7 which adds a description of "hotpluggable" in the
documentation. Hopefully I've explained it well enough there.
--
Reza Arbab