linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
From: Tang Chen <tangchen@cn.fujitsu.com>
To: rob@landley.net, tglx@linutronix.de, mingo@redhat.com,
	hpa@zytor.com, yinghai@kernel.org, akpm@linux-foundation.org,
	wency@cn.fujitsu.com, trenn@suse.de, liwanp@linux.vnet.ibm.com,
	mgorman@suse.de, walken@google.com, riel@redhat.com,
	khlebnikov@openvz.org, tj@kernel.org, minchan@kernel.org,
	m.szyprowski@samsung.com, mina86@mina86.com,
	laijs@cn.fujitsu.com, isimatu.yasuaki@jp.fujitsu.com,
	linfeng@cn.fujitsu.com, kosaki.motohiro@jp.fujitsu.com,
	jiang.liu@huawei.com, guz.fnst@cn.fujitsu.com
Cc: x86@kernel.org, linux-doc@vger.kernel.org,
	linux-kernel@vger.kernel.org, linux-mm@kvack.org
Subject: [PATCH 07/11] x86, numa, acpi, memory-hotplug: Make any node which the kernel resides in un-hotpluggable.
Date: Fri, 5 Apr 2013 17:39:57 +0800	[thread overview]
Message-ID: <1365154801-473-8-git-send-email-tangchen@cn.fujitsu.com> (raw)
In-Reply-To: <1365154801-473-1-git-send-email-tangchen@cn.fujitsu.com>

Before parsing SRAT, memblock has already reserved some memory ranges
for other purposes, such as for kernel image. We cannot prevent
kernel from using these memory. Furthermore, if all the memory is
hotpluggable, then the system won't have enough memory to boot if we set
all of them as movable. So we always set the nodes which the kernel
resides in as non-movable.

Signed-off-by: Tang Chen <tangchen@cn.fujitsu.com>
---
 arch/x86/mm/numa.c |   25 +++++++++++++++++++------
 arch/x86/mm/srat.c |   17 ++++++++++++++++-
 include/linux/mm.h |    1 +
 3 files changed, 36 insertions(+), 7 deletions(-)

diff --git a/arch/x86/mm/numa.c b/arch/x86/mm/numa.c
index 73e7934..dcaf248 100644
--- a/arch/x86/mm/numa.c
+++ b/arch/x86/mm/numa.c
@@ -736,24 +736,37 @@ static void __init early_x86_numa_init_mapping(void)
  * we will put pagetable pages in local node even if the memory of that node is
  * hotpluggable.
  *
- * If users specify movablemem_map=acpi, then:
+ * And, when the kernel is booting, memblock has reserved some memory for other
+ * purpose, such as storing kernel image. We cannot prevent the kernel from
+ * using this kind of memory. So whatever node the kernel resides in should be
+ * un-hotpluggable, because if all the memory is hotpluggable, and is set as
+ * movable, the kernel won't have enough memory to boot.
+ *
+ * It works like this:
+ * If users specify movablemem_map=acpi, then
  *
  * SRAT:                |_____| |_____| |_________| |_________| ......
  * node id:                0       1         1           2
- * hotpluggable:           n       y         y           n
+ * hotpluggable:           y       y         y           n
+ * kernel resides in:      y       n         n           n
  * movablemem_map:              |_____| |_________|
  */
 static void __init early_mem_hotplug_init()
 {
-	int i;
+	int i, nid;
 
 	if (!movablemem_map.acpi)
 		return;
 
 	for (i = 0; i < numa_meminfo.nr_blks; i++) {
-		if (numa_meminfo.blk[i].hotpluggable)
-			movablemem_map_add_region(numa_meminfo.blk[i].start,
-						  numa_meminfo.blk[i].end);
+		nid = numa_meminfo_all.blk[i].nid;
+
+		if (node_isset(nid, movablemem_map.numa_nodes_kernel) ||
+		    !numa_meminfo.blk[i].hotpluggable)
+			continue;
+
+		movablemem_map_add_region(numa_meminfo.blk[i].start,
+					  numa_meminfo.blk[i].end);
 	}
 }
 #else          /* CONFIG_HAVE_MEMBLOCK_NODE_MAP */
diff --git a/arch/x86/mm/srat.c b/arch/x86/mm/srat.c
index f7f6fd4..0b5904e 100644
--- a/arch/x86/mm/srat.c
+++ b/arch/x86/mm/srat.c
@@ -147,7 +147,8 @@ acpi_numa_memory_affinity_init(struct acpi_srat_mem_affinity *ma)
 {
 	u64 start, end;
 	u32 hotpluggable;
-	int node, pxm;
+	int node, pxm, i;
+	struct memblock_type *rgn = &memblock.reserved;
 
 	if (srat_disabled())
 		goto out_err;
@@ -176,6 +177,20 @@ acpi_numa_memory_affinity_init(struct acpi_srat_mem_affinity *ma)
 
 	node_set(node, numa_nodes_parsed);
 
+	/*
+	 * Before parsing SRAT, memblock has reserved some memory for other
+	 * purpose, such as storing kernel image. We cannot prevent the kernel
+	 * from using this kind of memory. So just mark which nodes the kernel
+	 * resides in, and set these nodes un-hotpluggable later.
+	 */
+	for (i = 0; i < rgn->cnt; i++) {
+		if (end <= rgn->regions[i].base ||
+		    start >= rgn->regions[i].base + rgn->regions[i].size)
+			continue;
+
+		node_set(node, movablemem_map.numa_nodes_kernel);
+	}
+
 	printk(KERN_INFO "SRAT: Node %u PXM %u [mem %#010Lx-%#010Lx] %s\n",
 	       node, pxm,
 	       (unsigned long long) start, (unsigned long long) end - 1,
diff --git a/include/linux/mm.h b/include/linux/mm.h
index 7468221..2835c91 100644
--- a/include/linux/mm.h
+++ b/include/linux/mm.h
@@ -1342,6 +1342,7 @@ struct movablemem_map {
 	bool acpi;
 	int nr_map;
 	struct movablemem_entry map[MOVABLEMEM_MAP_MAX];
+	nodemask_t numa_nodes_kernel;   /* on which nodes kernel resides in */
 };
 
 extern struct movablemem_map movablemem_map;
-- 
1.7.1

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

  parent reply	other threads:[~2013-04-05  9:37 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-04-05  9:39 [PATCH 00/11] Introduce movablemem_map=acpi boot option Tang Chen
2013-04-05  9:39 ` [PATCH 01/11] x86: get pg_data_t's memory from other node Tang Chen
2013-04-05  9:39 ` [PATCH 02/11] acpi: Print hotplug info in SRAT Tang Chen
2013-04-05  9:39 ` [PATCH 03/11] numa, acpi, memory-hotplug: Add movablemem_map=acpi boot option Tang Chen
2013-04-05  9:39 ` [PATCH 04/11] x86, numa, acpi, memory-hotplug: Introduce hotplug info into struct numa_meminfo Tang Chen
2013-04-05  9:39 ` [PATCH 05/11] x86, numa, acpi, memory-hotplug: Consider hotplug info when cleanup numa_meminfo Tang Chen
2013-04-05  9:39 ` [PATCH 06/11] X86, numa, acpi, memory-hotplug: Add hotpluggable ranges to movablemem_map Tang Chen
2013-04-05  9:39 ` Tang Chen [this message]
2013-04-05  9:39 ` [PATCH 08/11] x86, numa, acpi, memory-hotplug: Introduce zone_movable_limit[] to store start pfn of ZONE_MOVABLE Tang Chen
2013-04-05  9:39 ` [PATCH 09/11] x86, numa, acpi, memory-hotplug: Sanitize zone_movable_limit[] Tang Chen
2013-04-05  9:40 ` [PATCH 10/11] x86, numa, acpi, memory-hotplug: make movablemem_map have higher priority Tang Chen
2013-04-05  9:40 ` [PATCH 11/11] x86, numa, acpi, memory-hotplug: Memblock limit with movablemem_map Tang Chen
2013-04-09  5:14 ` [PATCH 00/11] Introduce movablemem_map=acpi boot option Yasuaki Ishimatsu
2013-04-09  8:21   ` Tang Chen

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1365154801-473-8-git-send-email-tangchen@cn.fujitsu.com \
    --to=tangchen@cn.fujitsu.com \
    --cc=akpm@linux-foundation.org \
    --cc=guz.fnst@cn.fujitsu.com \
    --cc=hpa@zytor.com \
    --cc=isimatu.yasuaki@jp.fujitsu.com \
    --cc=jiang.liu@huawei.com \
    --cc=khlebnikov@openvz.org \
    --cc=kosaki.motohiro@jp.fujitsu.com \
    --cc=laijs@cn.fujitsu.com \
    --cc=linfeng@cn.fujitsu.com \
    --cc=linux-doc@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=liwanp@linux.vnet.ibm.com \
    --cc=m.szyprowski@samsung.com \
    --cc=mgorman@suse.de \
    --cc=mina86@mina86.com \
    --cc=minchan@kernel.org \
    --cc=mingo@redhat.com \
    --cc=riel@redhat.com \
    --cc=rob@landley.net \
    --cc=tglx@linutronix.de \
    --cc=tj@kernel.org \
    --cc=trenn@suse.de \
    --cc=walken@google.com \
    --cc=wency@cn.fujitsu.com \
    --cc=x86@kernel.org \
    --cc=yinghai@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox