aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLai Jiangshan <laijs@cn.fujitsu.com>2012-12-12 16:52:00 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2012-12-12 20:38:34 -0500
commit20b2f52b73febce476fc9376f0296c1aa0e4f5a7 (patch)
tree037d74ec3666d3dfc7c235c7b59b11ed9b29d3b4
parent68ae564bbac8eb9ed54ddd2529b0e29ee190b355 (diff)
numa: add CONFIG_MOVABLE_NODE for movable-dedicated node
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. All are prepared, we can actually introduce N_MEMORY. add CONFIG_MOVABLE_NODE make we can use it for movable-dedicated node [akpm@linux-foundation.org: fix Kconfig text] Signed-off-by: Lai Jiangshan <laijs@cn.fujitsu.com> Tested-by: Yasuaki Ishimatsu <isimatu.yasuaki@jp.fujitsu.com> Signed-off-by: Wen Congyang <wency@cn.fujitsu.com> Cc: Jiang Liu <jiang.liu@huawei.com> Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com> Cc: Minchan Kim <minchan.kim@gmail.com> Cc: Mel Gorman <mgorman@suse.de> Cc: David Rientjes <rientjes@google.com> Cc: Yinghai Lu <yinghai@kernel.org> Cc: Rusty Russell <rusty@rustcorp.com.au> Cc: Greg KH <greg@kroah.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--drivers/base/node.c6
-rw-r--r--include/linux/nodemask.h4
-rw-r--r--mm/Kconfig8
-rw-r--r--mm/page_alloc.c3
4 files changed, 21 insertions, 0 deletions
diff --git a/drivers/base/node.c b/drivers/base/node.c
index 49dbe7dc9ada..fac124a7e1c5 100644
--- a/drivers/base/node.c
+++ b/drivers/base/node.c
@@ -644,6 +644,9 @@ static struct node_attr node_state_attr[] = {
644#ifdef CONFIG_HIGHMEM 644#ifdef CONFIG_HIGHMEM
645 [N_HIGH_MEMORY] = _NODE_ATTR(has_high_memory, N_HIGH_MEMORY), 645 [N_HIGH_MEMORY] = _NODE_ATTR(has_high_memory, N_HIGH_MEMORY),
646#endif 646#endif
647#ifdef CONFIG_MOVABLE_NODE
648 [N_MEMORY] = _NODE_ATTR(has_memory, N_MEMORY),
649#endif
647 [N_CPU] = _NODE_ATTR(has_cpu, N_CPU), 650 [N_CPU] = _NODE_ATTR(has_cpu, N_CPU),
648}; 651};
649 652
@@ -654,6 +657,9 @@ static struct attribute *node_state_attrs[] = {
654#ifdef CONFIG_HIGHMEM 657#ifdef CONFIG_HIGHMEM
655 &node_state_attr[N_HIGH_MEMORY].attr.attr, 658 &node_state_attr[N_HIGH_MEMORY].attr.attr,
656#endif 659#endif
660#ifdef CONFIG_MOVABLE_NODE
661 &node_state_attr[N_MEMORY].attr.attr,
662#endif
657 &node_state_attr[N_CPU].attr.attr, 663 &node_state_attr[N_CPU].attr.attr,
658 NULL 664 NULL
659}; 665};
diff --git a/include/linux/nodemask.h b/include/linux/nodemask.h
index c6ebdc97a428..4e2cbfa640b7 100644
--- a/include/linux/nodemask.h
+++ b/include/linux/nodemask.h
@@ -380,7 +380,11 @@ enum node_states {
380#else 380#else
381 N_HIGH_MEMORY = N_NORMAL_MEMORY, 381 N_HIGH_MEMORY = N_NORMAL_MEMORY,
382#endif 382#endif
383#ifdef CONFIG_MOVABLE_NODE
384 N_MEMORY, /* The node has memory(regular, high, movable) */
385#else
383 N_MEMORY = N_HIGH_MEMORY, 386 N_MEMORY = N_HIGH_MEMORY,
387#endif
384 N_CPU, /* The node has one or more cpus */ 388 N_CPU, /* The node has one or more cpus */
385 NR_NODE_STATES 389 NR_NODE_STATES
386}; 390};
diff --git a/mm/Kconfig b/mm/Kconfig
index e6651c5de14f..1680a0123a13 100644
--- a/mm/Kconfig
+++ b/mm/Kconfig
@@ -143,6 +143,14 @@ config NO_BOOTMEM
143config MEMORY_ISOLATION 143config MEMORY_ISOLATION
144 boolean 144 boolean
145 145
146config MOVABLE_NODE
147 boolean "Enable to assign a node which has only movable memory"
148 depends on HAVE_MEMBLOCK
149 depends on NO_BOOTMEM
150 depends on X86_64
151 depends on NUMA
152 default y
153
146# eventually, we can have this option just 'select SPARSEMEM' 154# eventually, we can have this option just 'select SPARSEMEM'
147config MEMORY_HOTPLUG 155config MEMORY_HOTPLUG
148 bool "Allow for memory hot-add" 156 bool "Allow for memory hot-add"
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index 35727168896b..2bf0d43d646b 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -90,6 +90,9 @@ nodemask_t node_states[NR_NODE_STATES] __read_mostly = {
90#ifdef CONFIG_HIGHMEM 90#ifdef CONFIG_HIGHMEM
91 [N_HIGH_MEMORY] = { { [0] = 1UL } }, 91 [N_HIGH_MEMORY] = { { [0] = 1UL } },
92#endif 92#endif
93#ifdef CONFIG_MOVABLE_NODE
94 [N_MEMORY] = { { [0] = 1UL } },
95#endif
93 [N_CPU] = { { [0] = 1UL } }, 96 [N_CPU] = { { [0] = 1UL } },
94#endif /* NUMA */ 97#endif /* NUMA */
95}; 98};