From: Lai Jiangshan <[email protected]>
This patch is part4 of the following patchset:
https://lkml.org/lkml/2012/10/29/319
Part1 is here:
https://lkml.org/lkml/2012/10/31/30
Part2 is here:
http://marc.info/?l=linux-kernel&m=135166705909544&w=2
Part3 is here:
http://marc.info/?l=linux-kernel&m=135167050510527&w=2
You must apply part1-3 before applying this patchset.
we need a node which only contains movable memory. This feature is very
important for node hotplug. If a node has normal/highmem, the memory
may be used by the kernel and can't be offlined. If the node only contains
movable memory, we can offline the memory and the node.
Lai Jiangshan (2):
numa: add CONFIG_MOVABLE_NODE for movable-dedicated node
memory_hotplug: allow online/offline memory to result movable node
drivers/base/node.c | 6 ++++++
include/linux/nodemask.h | 4 ++++
mm/Kconfig | 8 ++++++++
mm/memory_hotplug.c | 16 ++++++++++++++++
mm/page_alloc.c | 3 +++
5 files changed, 37 insertions(+)
--
1.8.0
From: Lai Jiangshan <[email protected]>
All are prepared, we can actually introduce N_MEMORY.
add CONFIG_MOVABLE_NODE make we can use it for movable-dedicated node
Signed-off-by: Lai Jiangshan <[email protected]>
---
drivers/base/node.c | 6 ++++++
include/linux/nodemask.h | 4 ++++
mm/Kconfig | 8 ++++++++
mm/page_alloc.c | 3 +++
4 files changed, 21 insertions(+)
diff --git a/drivers/base/node.c b/drivers/base/node.c
index 4c3aa7c..9cdd66f 100644
--- a/drivers/base/node.c
+++ b/drivers/base/node.c
@@ -620,6 +620,9 @@ 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),
};
@@ -630,6 +633,9 @@ 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
};
diff --git a/include/linux/nodemask.h b/include/linux/nodemask.h
index c6ebdc9..4e2cbfa 100644
--- a/include/linux/nodemask.h
+++ b/include/linux/nodemask.h
@@ -380,7 +380,11 @@ 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,
+#endif
N_CPU, /* The node has one or more cpus */
NR_NODE_STATES
};
diff --git a/mm/Kconfig b/mm/Kconfig
index a3f8ddd..957ebd5 100644
--- a/mm/Kconfig
+++ b/mm/Kconfig
@@ -143,6 +143,14 @@ config NO_BOOTMEM
config MEMORY_ISOLATION
boolean
+config MOVABLE_NODE
+ boolean "Enable to assign a node has only movable memory"
+ depends on HAVE_MEMBLOCK
+ depends on NO_BOOTMEM
+ depends on X86_64
+ depends on NUMA
+ default y
+
# eventually, we can have this option just 'select SPARSEMEM'
config MEMORY_HOTPLUG
bool "Allow for memory hot-add"
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index f1f44d5..3641761 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -90,6 +90,9 @@ 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 */
};
--
1.8.0
From: Lai Jiangshan <[email protected]>
Now, memory management can handle movable node or nodes which don't have
any normal memory, so we can dynamic configure and add movable node by:
online a ZONE_MOVABLE memory from a previous offline node
offline the last normal memory which result a non-normal-memory-node
movable-node is very important for power-saving,
hardware partitioning and high-available-system(hardware fault management).
Signed-off-by: Lai Jiangshan <[email protected]>
---
mm/memory_hotplug.c | 16 ++++++++++++++++
1 file changed, 16 insertions(+)
diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c
index d07c66f..4aceb03 100644
--- a/mm/memory_hotplug.c
+++ b/mm/memory_hotplug.c
@@ -589,11 +589,19 @@ static int online_pages_range(unsigned long start_pfn, unsigned long nr_pages,
return 0;
}
+#ifdef CONFIG_MOVABLE_NODE
+/* when CONFIG_MOVABLE_NODE, we allow online node don't have normal memory */
+static bool can_online_high_movable(struct zone *zone)
+{
+ return true;
+}
+#else /* #ifdef CONFIG_MOVABLE_NODE */
/* ensure every online node has NORMAL memory */
static bool can_online_high_movable(struct zone *zone)
{
return node_state(zone_to_nid(zone), N_NORMAL_MEMORY);
}
+#endif /* #ifdef 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,
@@ -1097,6 +1105,13 @@ check_pages_isolated(unsigned long start_pfn, unsigned long end_pfn)
return offlined;
}
+#ifdef CONFIG_MOVABLE_NODE
+/* when CONFIG_MOVABLE_NODE, we allow online node don't have normal memory */
+static bool can_offline_normal(struct zone *zone, unsigned long nr_pages)
+{
+ return true;
+}
+#else /* #ifdef 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)
{
@@ -1120,6 +1135,7 @@ static bool can_offline_normal(struct zone *zone, unsigned long nr_pages)
*/
return present_pages == 0;
}
+#endif /* #ifdef CONFIG_MOVABLE_NODE */
/* check which state of node_states will be changed when offline memory */
static void node_states_check_changes_offline(unsigned long nr_pages,
--
1.8.0
2012/10/31 17:15, Wen Congyang wrote:
> From: Lai Jiangshan <[email protected]>
>
> This patch is part4 of the following patchset:
> https://lkml.org/lkml/2012/10/29/319
>
> Part1 is here:
> https://lkml.org/lkml/2012/10/31/30
>
> Part2 is here:
> http://marc.info/?l=linux-kernel&m=135166705909544&w=2
>
> Part3 is here:
> http://marc.info/?l=linux-kernel&m=135167050510527&w=2
>
> You must apply part1-3 before applying this patchset.
>
> we need a node which only contains movable memory. This feature is very
> important for node hotplug. If a node has normal/highmem, the memory
> may be used by the kernel and can't be offlined. If the node only contains
> movable memory, we can offline the memory and the node.
>
>
> Lai Jiangshan (2):
> numa: add CONFIG_MOVABLE_NODE for movable-dedicated node
> memory_hotplug: allow online/offline memory to result movable node
>
> drivers/base/node.c | 6 ++++++
> include/linux/nodemask.h | 4 ++++
> mm/Kconfig | 8 ++++++++
> mm/memory_hotplug.c | 16 ++++++++++++++++
> mm/page_alloc.c | 3 +++
> 5 files changed, 37 insertions(+)
>
Tested-by: Yasuaki Ishimatsu <[email protected]>
Thanks,
Yasuaki Ishimatsu