remove CONFIG_MOVABLE_NODE
Subsystems (8)
cover remove CONFIG_MOVABLE_NODE
Hi,
this has been previously posted as an RFC [1]. As it hasn't met any disagreement, I have integrated the feedback and resending it without RFC and hope for a soon merging (ideally along with other memory hotplug pile).
I am continuing to cleanup the memory hotplug code and CONFIG_MOVABLE_NODE seems dubious at best. The following two patches simply removes the flag and make it de-facto always enabled.
The current semantic of the config option is twofold 1) it automatically binds hotplugable nodes to have memory in zone_movable by default when movable_node is enabled 2) forbids memory hotplug to online all the memory as movable when !CONFIG_MOVABLE_NODE.
The later restriction is quite dubious because there is no clear cut of how much normal memory do we need for a reasonable system operation. A single memory block which is sufficient to allow further movable onlines is far from sufficient (e.g a node with >2GB and memblocks 128MB will fill up this zone with struct pages leaving nothing for other allocations). Removing the config option will not only reduce the configuration space it also removes quite some code.
The semantic of the movable_node command line parameter is preserved.
The first patch removes the restriction mentioned above and the second one simply removes all the CONFIG_MOVABLE_NODE related stuff. The last patch moves movable_node flag handling to memory_hotplug proper where it belongs.
[1] http://lkml.kernel.org/r/[email protected]
Shortlog
Michal Hocko (3):
mm, memory_hotplug: drop artificial restriction on online/offline mm, memory_hotplug: drop CONFIG_MOVABLE_NODE
mm, memory_hotplug: move movable_node to the hotplug proper
Diffstat:
Documentation/admin-guide/kernel-parameters.txt | 7 ++- drivers/base/node.c | 4 -- include/linux/memblock.h | 25 ---------- include/linux/memory_hotplug.h | 10 ++++ include/linux/nodemask.h | 4 -- mm/Kconfig | 26 ---------- mm/memblock.c | 3 -- mm/memory_hotplug.c | 64 ++----------------------- mm/page_alloc.c | 2 - 9 files changed, 19 insertions(+), 126 deletions(-)
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
PATCH 1/3 mm, memory_hotplug: drop artificial restriction on online/offline
From: Michal Hocko <[email protected]>
74d42d8fe146 ("memory_hotplug: ensure every online node has NORMAL memory") has introduced a restriction that every numa node has to have at least some memory in !movable zones before a first movable memory can be onlined if !CONFIG_MOVABLE_NODE. Likewise_offline_normal checks the amount of normal memory in !movable zones and it disallows to offline memory if there is no normal memory left with a justification that "memory-management acts bad when we have nodes which is online but don't have any normal memory".
While it is true that not having _any_ memory for kernel allocations on a NUMA node is far from great and such a node would be quite subotimal because all kernel allocations will have to fallback to another NUMA node but there is no reason to disallow such a configuration in principle.
Besides that there is not really a big difference to have one memblock for ZONE_NORMAL available or none. With 128MB size memblocks the system might trash on the kernel allocations requests anyway. It is really hard to draw a line on how much normal memory is really sufficient so we have to rely on administrator to configure system sanely therefore drop the artificial restriction and remove can_offline_normal and can_online_high_movable altogether.
--- mm/memory_hotplug.c | 58 ----------------------------------------------------- 1 file changed, 58 deletions(-)
mm/memory_hotplug.c +0 -58
@@ -763,23 +763,6 @@ static int online_pages_range(unsigned long start_pfn, unsigned long nr_pages,return 0 ; } -#ifdef CONFIG_MOVABLE_NODE -/* -* When CONFIG_MOVABLE_NODE, we permit onlining of a node which doesn't have -* normal memory. -*/ -static bool can_online_high_movable (int nid) -{ -return true; -} -#else /* CONFIG_MOVABLE_NODE */ -/* ensure every online node has NORMAL memory */ -static bool can_online_high_movable (int nid) -{ -return node_state (nid,N_NORMAL_MEMORY ); -} -#endif /* CONFIG_MOVABLE_NODE */ -/* check which state of node_states will be changed when online memory */ static void node_states_check_changes_online (unsigned long nr_pages,struct zone *zone,struct memory_notify *arg)
@@ -979,9 +962,6 @@ int __ref online_pages(unsigned long pfn, unsigned long nr_pages, int online_typif (!allow_online_pfn_range (nid, pfn, nr_pages, online_type))return -EINVAL ; -if (online_type ==MMOP_ONLINE_MOVABLE && !can_online_high_movable (nid)) -return -EINVAL ; -/* associate pfn range with the zone */ zone =move_pfn_range (online_type, nid, pfn, nr_pages);
@@ -1579,41 +1559,6 @@ check_pages_isolated(unsigned long start_pfn, unsigned long end_pfn)return offlined; } -#ifdef CONFIG_MOVABLE_NODE -/* -* When CONFIG_MOVABLE_NODE, we permit offlining of a node which doesn't have -* normal memory. -*/ -static bool can_offline_normal (struct zone *zone,unsigned long nr_pages) -{ -return true; -} -#else /* CONFIG_MOVABLE_NODE */ -/* ensure the node has NORMAL memory if it is still online */ -static bool can_offline_normal (struct zone *zone,unsigned long nr_pages) -{ -struct pglist_data *pgdat = zone->zone_pgdat; -unsigned long present_pages =0 ; -enum zone_type zt; - -for (zt =0 ; zt <=ZONE_NORMAL ; zt++) - present_pages += pgdat->node_zones[zt].present_pages; - -if (present_pages > nr_pages) -return true; - - present_pages =0 ; -for (; zt <=ZONE_MOVABLE ; zt++) - present_pages += pgdat->node_zones[zt].present_pages; - -/* -* we can't offline the last normal memory until all -* higher memory is offlined. -*/ -return present_pages ==0 ; -} -#endif /* CONFIG_MOVABLE_NODE */ -static int __init cmdline_parse_movable_node (char *p) {#ifdef CONFIG_MOVABLE_NODE
@@ -1741,9 +1686,6 @@ static int __ref __offline_pages(unsigned long start_pfn, node =zone_to_nid (zone); nr_pages = end_pfn - start_pfn; -if (zone_idx (zone) <=ZONE_NORMAL && !can_offline_normal (zone, nr_pages)) -return -EINVAL ; -/* set above range as isolated */ ret =start_isolate_page_range (start_pfn, end_pfn,MIGRATE_MOVABLE , true);
Signature · 7 lines
2.11.0 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
PATCH 2/3 mm, memory_hotplug: drop CONFIG_MOVABLE_NODE
In reply to Michal HockoFrom: Michal Hocko <[email protected]>
20b2f52b73fe ("numa: add CONFIG_MOVABLE_NODE for movable-dedicated node") has introduced CONFIG_MOVABLE_NODE without a good explanation on why it is actually useful. It makes a lot of sense to make movable node semantic opt in but we already have that because the feature has to be explicitly enabled on the kernel command line. A config option on top only makes the configuration space larger without a good reason. It also adds an additional ifdefery that pollutes the code. Just drop the config option and make it de-facto always enabled. This shouldn't introduce any change to the semantic.
--- Documentation/admin-guide/kernel-parameters.txt | 7 +++++-- drivers/base/node.c | 4 ---- include/linux/memblock.h | 18 ----------------- include/linux/nodemask.h | 4 ---- mm/Kconfig | 26 ------------------------- mm/memblock.c | 2 -- mm/memory_hotplug.c | 4 ---- mm/page_alloc.c | 2 -- 8 files changed, 5 insertions(+), 62 deletions(-)
Documentation/admin-guide/kernel-parameters.txt +5 -2
@@ -2246,8 +2246,11 @@ that the amount of memory usable for all allocations is not too small. - movable_node [KNL] Boot-time switch to enable the effects - of CONFIG_MOVABLE_NODE=y. See mm/Kconfig for details. + movable_node [KNL] Boot-time switch to make hotplugable memory + NUMA nodes to be movable. This means that the memory + of such nodes will be usable only for movable + allocations which rules out almost all kernel + allocations. Use with caution! MTD_Partition= [MTD] Format: <name>,<region-number>,<size>,<offset>
drivers/base/node.c +0 -4
@@ -639,9 +639,7 @@ static struct node_attr node_state_attr[] = { #ifdef CONFIG_HIGHMEM [N_HIGH_MEMORY] = _NODE_ATTR(has_high_memory, N_HIGH_MEMORY), #endif -#ifdef CONFIG_MOVABLE_NODE [N_MEMORY] = _NODE_ATTR(has_memory, N_MEMORY), -#endif [N_CPU] = _NODE_ATTR(has_cpu, N_CPU), };
@@ -652,9 +650,7 @@ static struct attribute *node_state_attrs[] = {#ifdef CONFIG_HIGHMEM &node_state_attr[N_HIGH_MEMORY ].attr.attr, #endif -#ifdef CONFIG_MOVABLE_NODE &node_state_attr[N_MEMORY ].attr.attr, -#endif &node_state_attr[N_CPU ].attr.attr,NULL };
include/linux/memblock.h +0 -18
@@ -57,10 +57,8 @@ struct memblock {extern struct memblock memblock;extern int memblock_debug; -#ifdef CONFIG_MOVABLE_NODE /* If movable_node boot option specified */ extern bool movable_node_enabled; -#endif /* CONFIG_MOVABLE_NODE */ #ifdef CONFIG_ARCH_DISCARD_MEMBLOCK #define __init_memblock __meminit
@@ -168,7 +166,6 @@ void __next_reserved_mem_region(u64 *idx, phys_addr_t *out_start, i != (u64 )ULLONG_MAX ; \ __next_reserved_mem_region(&i, p_start, p_end)) -#ifdef CONFIG_MOVABLE_NODE static inline bool memblock_is_hotpluggable (struct memblock_region *m) {return m->flags &MEMBLOCK_HOTPLUG ;
@@ -178,16 +175,6 @@ static inline bool __init_memblock movable_node_is_enabled(void) {return movable_node_enabled; } -#else -static inline bool memblock_is_hotpluggable (struct memblock_region *m) -{ -return false; -} -static inline bool movable_node_is_enabled (void ) -{ -return false; -} -#endif static inline bool memblock_is_mirror (struct memblock_region *m) {
@@ -295,7 +282,6 @@ phys_addr_t memblock_alloc_try_nid(phys_addr_t size, phys_addr_t align, int nid)phys_addr_t memblock_alloc (phys_addr_t size,phys_addr_t align); -#ifdef CONFIG_MOVABLE_NODE /* * Set the allocation direction to bottom-up or top-down. */
@@ -313,10 +299,6 @@ static inline bool memblock_bottom_up(void) {return memblock.bottom_up; } -#else -static inline void __init memblock_set_bottom_up (bool enable) {} -static inline bool memblock_bottom_up (void ) {return false; } -#endif /* Flags for memblock_alloc_base() amd __memblock_alloc_base() */ #define MEMBLOCK_ALLOC_ANYWHERE (~(phys_addr_t)0)
include/linux/nodemask.h +0 -4
@@ -387,11 +387,7 @@ enum node_states {#else N_HIGH_MEMORY =N_NORMAL_MEMORY , #endif -#ifdef CONFIG_MOVABLE_NODE N_MEMORY ,/* The node has memory(regular, high, movable) */ -#else -N_MEMORY =N_HIGH_MEMORY , -#endifN_CPU ,/* The node has one or more cpus */ NR_NODE_STATES };
mm/Kconfig +0 -26
@@ -149,32 +149,6 @@ config NO_BOOTMEM config MEMORY_ISOLATION bool -config MOVABLE_NODE - bool "Enable to assign a node which has only movable memory" - depends on HAVE_MEMBLOCK - depends on NO_BOOTMEM - depends on X86_64 || OF_EARLY_FLATTREE || MEMORY_HOTPLUG - depends on NUMA - default n - help - Allow a node to have only movable memory. Pages used by the kernel, - such as direct mapping pages cannot be migrated. So the corresponding - memory device cannot be hotplugged. This option allows the following - two things: - - When the system is booting, node full of hotpluggable memory can - be arranged to have only movable memory so that the whole node can - be hot-removed. (need movable_node boot option specified). - - After the system is up, the option allows users to online all the - memory of a node as movable memory so that the whole node can be - hot-removed. - - Users who don't use the memory hotplug feature are fine with this - option on since they don't specify movable_node boot option or they - don't online memory as movable. - - Say Y here if you want to hotplug a whole node. - Say N here if you want kernel to use memory on all nodes evenly. - # # Only be set on architectures that have completely implemented memory hotplug # feature. If you are not sure, don't touch it.
mm/memblock.c +0 -2
@@ -54,9 +54,7 @@ struct memblock memblock __initdata_memblock = { }; int memblock_debug __initdata_memblock; -#ifdef CONFIG_MOVABLE_NODE bool movable_node_enabled __initdata_memblock = false; -#endif static bool system_has_some_mirror __initdata_memblock = false; static int memblock_can_resize __initdata_memblock; static int memblock_memory_in_slab __initdata_memblock = 0;
mm/memory_hotplug.c +0 -4
@@ -1561,11 +1561,7 @@ check_pages_isolated(unsigned long start_pfn, unsigned long end_pfn)static int __init cmdline_parse_movable_node (char *p) { -#ifdef CONFIG_MOVABLE_NODE movable_node_enabled = true; -#else -pr_warn ("movable_node option not supported\n" ); -#endif return 0 ; }early_param ("movable_node" , cmdline_parse_movable_node);
mm/page_alloc.c +0 -2
@@ -112,9 +112,7 @@ nodemask_t node_states[NR_NODE_STATES] __read_mostly = { #ifdef CONFIG_HIGHMEM [N_HIGH_MEMORY] = { { [0] = 1UL } }, #endif -#ifdef CONFIG_MOVABLE_NODE [N_MEMORY] = { { [0] = 1UL } }, -#endif [N_CPU] = { { [0] = 1UL } }, #endif /* NUMA */ };
Signature · 7 lines
2.11.0 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Re: [PATCH 2/3] mm, memory_hotplug: drop CONFIG_MOVABLE_NODE
Quoted 12 lines · Michal Hocko
From: Michal Hocko <[email protected]>
20b2f52b73fe("numa: addCONFIG_MOVABLE_NODEfor movable-dedicated node") has introducedCONFIG_MOVABLE_NODEwithout a good explanation on why it is actually useful. It makes a lot of sense to make movable node semantic opt in but we already have that because the feature has to be explicitly enabled on the kernel command line. A config option on top only makes the configuration space larger without a good reason. It also adds an additional ifdefery that pollutes the code. Just drop the config option and make it de-facto always enabled. This shouldn't introduce any change to the semantic.
Quoted 2 lines
Acked-by Reza Arbab <[email protected]>Signed-off-by Michal Hocko <[email protected]>
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
PATCH 3/3 mm, memory_hotplug: move movable_node to the hotplug proper
In reply to Michal HockoFrom: Michal Hocko <[email protected]>
movable_node_is_enabled is defined in memblock proper while it is initialized from the memory hotplug proper. This is quite messy and it makes a dependency between the two so move movable_node along with the helper functions to memory_hotplug.
To make it more entertaining the kernel parameter is ignored unless CONFIG_HAVE_MEMBLOCK_NODE_MAP=y because we do not have the node information for each memblock otherwise. So let's warn when the option is disabled.
--- include/linux/memblock.h | 7 ------- include/linux/memory_hotplug.h | 10 ++++++++++ mm/memblock.c | 1 - mm/memory_hotplug.c | 6 ++++++ 4 files changed, 16 insertions(+), 8 deletions(-)
include/linux/memblock.h +0 -7
@@ -57,8 +57,6 @@ struct memblock {extern struct memblock memblock;extern int memblock_debug; -/* If movable_node boot option specified */ -extern bool movable_node_enabled;#ifdef CONFIG_ARCH_DISCARD_MEMBLOCK #define __init_memblock __meminit
@@ -171,11 +169,6 @@ static inline bool memblock_is_hotpluggable(struct memblock_region *m)return m->flags &MEMBLOCK_HOTPLUG ; } -static inline bool __init_memblock movable_node_is_enabled(void) -{ -return movable_node_enabled; -} -static inline bool memblock_is_mirror (struct memblock_region *m) {return m->flags &MEMBLOCK_MIRROR ;
include/linux/memory_hotplug.h +10 -0
@@ -115,6 +115,12 @@ extern void __online_page_free(struct page *page);extern int try_online_node (int nid);extern bool memhp_auto_online; +/* If movable_node boot option specified */ +extern bool movable_node_enabled; +static inline bool movable_node_is_enabled (void ) +{ +return movable_node_enabled; +}#ifdef CONFIG_MEMORY_HOTREMOVE extern bool is_pageblock_removable_nolock (struct page *page);
@@ -266,6 +272,10 @@ static inline void put_online_mems(void) {}static inline void mem_hotplug_begin (void ) {}static inline void mem_hotplug_done (void ) {} +static inline bool movable_node_is_enabled (void ) +{ +return false; +}#endif /* ! CONFIG_MEMORY_HOTPLUG */ #ifdef CONFIG_MEMORY_HOTREMOVE
mm/memblock.c +0 -1
@@ -54,7 +54,6 @@ struct memblock memblock __initdata_memblock = { }; int memblock_debug __initdata_memblock; -bool movable_node_enabled __initdata_memblock = false; static bool system_has_some_mirror __initdata_memblock = false; static int memblock_can_resize __initdata_memblock; static int memblock_memory_in_slab __initdata_memblock = 0;
mm/memory_hotplug.c +6 -0
@@ -79,6 +79,8 @@ static struct {#define memhp_lock_acquire () lock_map_acquire(&mem_hotplug.dep_map)#define memhp_lock_release () lock_map_release(&mem_hotplug.dep_map) +bool movable_node_enabled = false; +#ifndef CONFIG_MEMORY_HOTPLUG_DEFAULT_ONLINE bool memhp_auto_online;#else
@@ -1561,7 +1563,11 @@ check_pages_isolated(unsigned long start_pfn, unsigned long end_pfn)static int __init cmdline_parse_movable_node (char *p) { +#ifdef CONFIG_HAVE_MEMBLOCK_NODE_MAP movable_node_enabled = true; +#else +pr_warn ("movable_node parameter depends on CONFIG_HAVE_MEMBLOCK_NODE_MAP to work properly\n" ); +#endif return 0 ; }early_param ("movable_node" , cmdline_parse_movable_node);
Signature · 7 lines
2.11.0 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Re: [PATCH 3/3] mm, memory_hotplug: move movable_node to the hotplug proper
Quoted 7 lines · Michal Hocko
From: Michal Hocko <[email protected]>
movable_node_is_enabledis defined in memblock proper while it is initialized from the memory hotplug proper. This is quite messy and it makes a dependency between the two so movemovable_nodealong with the helper functions tomemory_hotplug.
Quoted 7 lines
To make it more entertaining the kernel parameter is ignored unless
CONFIG_HAVE_MEMBLOCK_NODE_MAP=ybecause we do not have the node information for each memblock otherwise. So let's warn when the option is disabled.Acked-by Vlastimil Babka <[email protected]>Signed-off-by Michal Hocko <[email protected]>
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Re: [PATCH 3/3] mm, memory_hotplug: move movable_node to the hotplug proper
In reply to Michal HockoQuoted 9 lines · Michal Hocko
movable_node_is_enabledis defined in memblock proper while it is initialized from the memory hotplug proper. This is quite messy and it makes a dependency between the two so movemovable_nodealong with the helper functions tomemory_hotplug.To make it more entertaining the kernel parameter is ignored unless
CONFIG_HAVE_MEMBLOCK_NODE_MAP=ybecause we do not have the node information for each memblock otherwise. So let's warn when the option is disabled.
Signature · 1 line
Reza Arbab