x86/uv: fix for no memory at paddr 0
authorJack Steiner <steiner@sgi.com>
Mon, 20 Apr 2009 13:25:31 +0000 (08:25 -0500)
committerIngo Molnar <mingo@elte.hu>
Mon, 20 Apr 2009 16:09:18 +0000 (18:09 +0200)
Fix endcase where the memory at physical address 0 does not really
exist AND one of the sockets on blade 0 has no active cpus.

The memory that _appears_ to be at physical address 0 is actually
memory that located at a different address but has been remapped by
the chipset so that it appears to be at physical address 0.

When determining the UV pnode, the algorithm for determining the pnode
incorrectly used the relocated physical address instead of the actual
(global) address.

[ Impact: boot failure on partitioned systems ]

Signed-off-by: Jack Steiner <steiner@sgi.com>
LKML-Reference: <20090420132530.GA23156@sgi.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
arch/x86/kernel/apic/x2apic_uv_x.c

index d6712334ce4bb795b2e29632c8ab547fb6ea5de8..2bda693529762b71f30ae2c26fa08a7692ca5cb5 100644 (file)
@@ -652,6 +652,7 @@ void __init uv_system_init(void)
                if (uv_node_to_blade[nid] >= 0)
                        continue;
                paddr = node_start_pfn(nid) << PAGE_SHIFT;
+               paddr = uv_soc_phys_ram_to_gpa(paddr);
                pnode = (paddr >> m_val) & pnode_mask;
                blade = boot_pnode_to_blade(pnode);
                uv_node_to_blade[nid] = blade;