[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] x86 numa: Fix SRAT check for discontig memory
# HG changeset patch # User Keir Fraser <keir.fraser@xxxxxxxxxx> # Date 1251208722 -3600 # Node ID 50a5950e6a243f10e0b9cd67b95518e1ef4efe87 # Parent dc2aebb0e1d08b98a11d2e8a3bf7dc6435338e7f x86 numa: 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@xxxxxx> --- xen/arch/x86/srat.c | 43 ++++++++++++++++++++++++++----------------- 1 files changed, 26 insertions(+), 17 deletions(-) diff -r dc2aebb0e1d0 -r 50a5950e6a24 xen/arch/x86/srat.c --- a/xen/arch/x86/srat.c Tue Aug 25 14:58:07 2009 +0100 +++ b/xen/arch/x86/srat.c Tue Aug 25 14:58:42 2009 +0100 @@ -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) 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; - } - - 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; + + for (i = 0; i < e820.nr_map; i++) { + int j, found; + unsigned long long start, end; + + 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-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |