[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <1363857676-30694-2-git-send-email-tangchen@cn.fujitsu.com>
Date: Thu, 21 Mar 2013 17:21:13 +0800
From: Tang Chen <tangchen@...fujitsu.com>
To: rob@...dley.net, tglx@...utronix.de, mingo@...hat.com,
hpa@...or.com, yinghai@...nel.org, akpm@...ux-foundation.org,
wency@...fujitsu.com, trenn@...e.de, liwanp@...ux.vnet.ibm.com,
mgorman@...e.de, walken@...gle.com, riel@...hat.com,
khlebnikov@...nvz.org, tj@...nel.org, minchan@...nel.org,
m.szyprowski@...sung.com, mina86@...a86.com, laijs@...fujitsu.com,
isimatu.yasuaki@...fujitsu.com, linfeng@...fujitsu.com,
jiang.liu@...wei.com, kosaki.motohiro@...fujitsu.com,
guz.fnst@...fujitsu.com
Cc: x86@...nel.org, linux-doc@...r.kernel.org,
linux-kernel@...r.kernel.org, linux-mm@...ck.org
Subject: [PATCH part2 1/4] x86, mm, numa, acpi: Introduce numa_meminfo_all to store all the numa meminfo.
Now, Yinghai has tried to allocate pagetables and vmemmap pages in local
node. If we limit memblock allocation in movablemem_map.map[], we have to
exclude the pagetables and vmemmap pages.
So we need the following sequence:
1) Parse SRAT, store numa_meminfo.
2) Initialize memory mapping, allocate pagetables and vmemmap pages in local
node. And reserve these memory with memblock.
3) Sanitize movablemem_map.map[], exclude the pagetables and vmemmap pages.
When parsing SRAT, we added memory ranges into numa_meminfo. But in
numa_cleanup_meminfo(), it removed all the unused memory from numa_meminfo.
const u64 low = 0;
const u64 high = PFN_PHYS(max_pfn);
/* first, trim all entries */
for (i = 0; i < mi->nr_blks; i++) {
struct numa_memblk *bi = &mi->blk[i];
/* make sure all blocks are inside the limits */
bi->start = max(bi->start, low);
bi->end = min(bi->end, high);
/* and there's no empty block */
if (bi->start >= bi->end)
numa_remove_memblk_from(i--, mi);
}
So numa_meminfo doesn't have the whole memory info.
In order to sanitize movablemem_map.map[] after memory mapping initialziation,
we need the whole SRAT info.
So this patch introduces global variable numa_meminfo_all to store the whole
numa memory info.
Signed-off-by: Tang Chen <tangchen@...fujitsu.com>
---
arch/x86/mm/numa.c | 13 +++++++++++++
1 files changed, 13 insertions(+), 0 deletions(-)
diff --git a/arch/x86/mm/numa.c b/arch/x86/mm/numa.c
index 4f754e6..4cf3b49 100644
--- a/arch/x86/mm/numa.c
+++ b/arch/x86/mm/numa.c
@@ -28,12 +28,20 @@ nodemask_t numa_nodes_parsed __initdata;
struct pglist_data *node_data[MAX_NUMNODES] __read_mostly;
EXPORT_SYMBOL(node_data);
+/*e820 mapped memory info */
static struct numa_meminfo numa_meminfo
#ifndef CONFIG_MEMORY_HOTPLUG
__initdata
#endif
;
+/* All memory info */
+static struct numa_meminfo numa_meminfo_all
+#ifndef CONFIG_MEMORY_HOTPLUG
+__initdata
+#endif
+;
+
static int numa_distance_cnt;
static u8 *numa_distance;
@@ -599,10 +607,15 @@ static int __init numa_init(int (*init_func)(void))
nodes_clear(numa_nodes_parsed);
memset(&numa_meminfo, 0, sizeof(numa_meminfo));
+ memset(&numa_meminfo_all, 0, sizeof(numa_meminfo));
ret = init_func();
if (ret < 0)
return ret;
+
+ /* Store the whole memory info before cleanup numa_meminfo. */
+ memcpy(&numa_meminfo_all, &numa_meminfo, sizeof(numa_meminfo));
+
ret = numa_cleanup_meminfo(&numa_meminfo);
if (ret < 0)
return ret;
--
1.7.1
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists