If memory address >4G, the address will overflow in some
NUMA code if using unsigned long to statement a physical address in PAE arch.
replace "unsigned
long" with paddr_t to avoid overflow
Signed-off-by: Duan Ronghui
<ronghui.duan@xxxxxxxxx>
diff -r 2909b03e05de
xen/arch/x86/numa.c
--- a/xen/arch/x86/numa.c Tue
Mar 04 13:30:07 2008 +0000
+++ b/xen/arch/x86/numa.c Mon
Mar 10 19:12:36 2008 +0800
@@ -57,7 +57,7 @@
populate_memnodemap(const struct node *n
{
int
i;
int
res = -1;
- unsigned
long addr, end;
+ paddr_t
addr, end;
if
(shift >= 64)
return
-1;
@@ -286,13 +286,13 @@ static
void dump_numa(unsigned char key)
(u32)(now>>32), (u32)now);
for_each_online_node(i)
{
- unsigned
long pa = (NODE_DATA(i)->node_start_pfn + 1)<< PAGE_SHIFT;
+ paddr_t
pa = (NODE_DATA(i)->node_start_pfn + 1)<< PAGE_SHIFT;
printk("idx%d
-> NODE%d start->%lu size->%lu\n",
i, NODE_DATA(i)->node_id,
NODE_DATA(i)->node_start_pfn,
NODE_DATA(i)->node_spanned_pages);
/*
sanity check phys_to_nid() */
- printk("phys_to_nid(%lx)
-> %d should be %d\n", pa, phys_to_nid(pa),
+ printk("phys_to_nid(%"PRIpaddr")
-> %d should be %d\n", pa, phys_to_nid(pa),
NODE_DATA(i)->node_id);
}
for_each_online_cpu(i)
diff -r 2909b03e05de
xen/include/asm-x86/numa.h
---
a/xen/include/asm-x86/numa.h Tue Mar 04 13:30:07 2008 +0000
+++
b/xen/include/asm-x86/numa.h Mon Mar 10 19:12:36 2008 +0800
@@ -52,7 +52,7 @@ struct
node_data {
extern struct
node_data node_data[];
-static inline
__attribute__((pure)) int phys_to_nid(unsigned long addr)
+static inline
__attribute__((pure)) int phys_to_nid(paddr_t addr)
{
unsigned
nid;
VIRTUAL_BUG_ON((addr
>> memnode_shift) >= NODEMAPSIZE);