Alex Williamson
2009-Aug-24 21:20 UTC
[Xen-devel] [PATCH] Fix SRAT check for discontig memory
We currently compare the sum of the pages found in the SRAT table to the address of the highest memory page found via the e820 table to validate the SRAT. This is completely bogus if there''s any kind of discontiguous memory, where the sum of the pages could be much smaller than the address of the highest page. I think all that''s necessary is to validate that each usable memory range in the e820 is covered by an SRAT entry. This might not be the most efficient way to do it, but there are usually a relatively small number of entries on each side. Signed-off-by: Alex Williamson <alex.williamson@hp.com> -- I also propose this for the stable branches. diff -r c5125c0ea051 xen/arch/x86/srat.c --- a/xen/arch/x86/srat.c Mon Aug 24 08:27:30 2009 +0100 +++ b/xen/arch/x86/srat.c Mon Aug 24 15:19:34 2009 -0600 @@ -17,6 +17,7 @@ #include <xen/nodemask.h> #include <xen/acpi.h> #include <xen/numa.h> +#include <asm/e820.h> #include <asm/page.h> static struct acpi_table_slit *acpi_slit; @@ -236,23 +237,31 @@ static int nodes_cover_memory(void) { int i; - u64 pxmram, e820ram; - pxmram = 0; - for_each_node_mask(i, nodes_parsed) { - u64 s = nodes[i].start >> PAGE_SHIFT; - u64 e = nodes[i].end >> PAGE_SHIFT; - pxmram += e - s; - } + for (i = 0; i < e820.nr_map; i++) { + int j, found; + unsigned long long start, end; - e820ram = max_page; - /* We seem to lose 3 pages somewhere. Allow a bit of slack. */ - if ((long)(e820ram - pxmram) >= 1*1024*1024) { - printk(KERN_ERR "SRAT: PXMs only cover %"PRIu64"MB of your %" - PRIu64"MB e820 RAM. Not used.\n", - (pxmram << PAGE_SHIFT) >> 20, - (e820ram << PAGE_SHIFT) >> 20); - return 0; + if (e820.map[i].type != E820_RAM) { + continue; + } + + start = e820.map[i].addr; + end = e820.map[i].addr + e820.map[i].size - 1; + + found = 0; + for_each_node_mask(j, nodes_parsed) { + if (start >= nodes[j].start && end <= nodes[j].end) { + found = 1; + break; + } + } + + if (!found) { + printk(KERN_ERR "SRAT: No PXM for e820 range: " + "%016Lx - %016Lx\n", start, end); + return 0; + } } return 1; } _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Reasonably Related Threads
- [PATCH] x86/numa: fix c/s 20120 (Fix SRAT check for discontig memory)
- [PATCH 1/6] xen: ACPI SRAT table parser and data structures
- [PATCH] xen: numa-sched: leave node-affinity alone if not in "auto" mode
- [ocfs2-announce] OCFS2 1.4.10-1 released
- [GIT PULL] ocfs2 updates for 2.6.35