2012-11-16 11:51:59

by Wen Congyang

[permalink] [raw]
Subject: [PART4 Patch v2 0/2] memory-hotplug: allow online/offline memory to result movable node

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:
https://lkml.org/lkml/2012/10/31/73

Part3 is here:
https://lkml.org/lkml/2012/11/15/111

Part5 is here:
https://lkml.org/lkml/2012/10/31/145

Part6 is here:
https://lkml.org/lkml/2012/10/31/248

You must apply part1-3 before applying this patchset.

Note: part1-3 are in mm tree now. part5 are being reimplemented(We will
post it some days later). part6 is still in discussion.

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.

Changes from v1 to v2:
1. Add Tested-by: Yasuaki Ishimatsu <[email protected]>
2. Add my Signed-off-by, because I am on the the patch delivery path.

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


2012-11-16 11:52:03

by Wen Congyang

[permalink] [raw]
Subject: [PART4 Patch v2 1/2] numa: add CONFIG_MOVABLE_NODE for movable-dedicated node

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]>
Tested-by: Yasuaki Ishimatsu <[email protected]>
Signed-off-by: Wen Congyang <[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 4054aaf..1b6725a 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

2012-11-16 11:52:01

by Wen Congyang

[permalink] [raw]
Subject: [PART4 Patch v2 2/2] memory_hotplug: allow online/offline memory to result movable node

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]>
Tested-by: Yasuaki Ishimatsu <[email protected]>
Signed-off-by: Wen Congyang <[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-11-20 22:25:53

by Andrew Morton

[permalink] [raw]
Subject: Re: [PART4 Patch v2 1/2] numa: add CONFIG_MOVABLE_NODE for movable-dedicated node

On Fri, 16 Nov 2012 19:58:09 +0800
Wen Congyang <[email protected]> wrote:

> 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

This description is far too short on details.

I grabbed this from the [0/n] email:

: 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.

which helps a bit, but it's still pretty thin.

Why is this option made configurable? Why not enable it unconditionally?

Please send a patch which adds the Kconfig help text for
CONFIG_MOVABLE_NODE. Let's make that text nice and detailed.

The name MOVABLE_NODE is not a good one. It means "a node which is
movable", whereas the concept is actually "a node whcih contains only
movable memory". I suppose we could change it to something like
CONFIG_MOVABLE_MEMORY_ONLY_NODE or similar. But I suppose that
CONFIG_MOVABLE_NODE is good enough, as long as it is well-described in
associated comments or help text. This is not the case at present.

> +#ifdef CONFIG_MOVABLE_NODE
> + N_MEMORY, /* The node has memory(regular, high, movable) */
> +#else

I think the comment should be "The node has only movable memory"?

2012-11-20 22:29:33

by Andrew Morton

[permalink] [raw]
Subject: Re: [PART4 Patch v2 2/2] memory_hotplug: allow online/offline memory to result movable node

On Fri, 16 Nov 2012 19:58:10 +0800
Wen Congyang <[email protected]> wrote:

> 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).
>
> ...
>
> --- 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 */

The comment is hard to understand. Should it read "When
CONFIG_MOVABLE_NODE, we permit onlining of a node which doesn'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 */

Ditto, after replacing "online" with offlining".

> +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 */

Please, spend more time over the accuracy and completeness of the
changelog and comments? That will result in better and more
maintainable code. And it results in *much* more effective code
reviewing.

2012-11-21 04:00:29

by Wen Congyang

[permalink] [raw]
Subject: Re: [PART4 Patch v2 1/2] numa: add CONFIG_MOVABLE_NODE for movable-dedicated node

At 11/21/2012 06:25 AM, Andrew Morton Wrote:
> On Fri, 16 Nov 2012 19:58:09 +0800
> Wen Congyang <[email protected]> wrote:
>
>> 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
>
> This description is far too short on details.
>
> I grabbed this from the [0/n] email:
>
> : 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.
>
> which helps a bit, but it's still pretty thin.
>
> Why is this option made configurable? Why not enable it unconditionally?
>
> Please send a patch which adds the Kconfig help text for
> CONFIG_MOVABLE_NODE. Let's make that text nice and detailed.
>
> The name MOVABLE_NODE is not a good one. It means "a node which is
> movable", whereas the concept is actually "a node whcih contains only
> movable memory". I suppose we could change it to something like
> CONFIG_MOVABLE_MEMORY_ONLY_NODE or similar. But I suppose that
> CONFIG_MOVABLE_NODE is good enough, as long as it is well-described in
> associated comments or help text. This is not the case at present.
>
>> +#ifdef CONFIG_MOVABLE_NODE
>> + N_MEMORY, /* The node has memory(regular, high, movable) */
>> +#else
>
> I think the comment should be "The node has only movable memory"?

No, the comment is right. In the kernel, we need the following two
mask:
1. the node contains memory that the kernel can use(N_HIGH_MEMORY)
2. the node contains memory (N_MEMORY)

There is no code need the mask: the node contains only movable memory
now.

Thanks
Wen Congyang

>
>
>