# HG changeset patch # User yamahata@xxxxxxxxxxxxx # Date 1181885893 -32400 # Node ID 93f9154ee40f967af1f3a50368f5050a1862b3c1 # Parent b492ac038d613212da3ee16646168b56ef8833cc fix p2m_size calculation in p2m_expose_init(). PATCHNAME: fix_p2m_size_calculation Signed-off-by: Isaku Yamahata diff -r b492ac038d61 -r 93f9154ee40f arch/ia64/xen/hypervisor.c --- a/arch/ia64/xen/hypervisor.c Thu Jun 14 14:23:21 2007 -0600 +++ b/arch/ia64/xen/hypervisor.c Fri Jun 15 14:38:13 2007 +0900 @@ -1014,7 +1014,8 @@ p2m_expose_init(void) #ifdef CONFIG_XEN_IA64_EXPOSE_P2M_USE_DTR if (xen_ia64_p2m_expose_use_dtr) { unsigned long granule_pfn = 0; - p2m_size = p2m_max_low_pfn - p2m_min_low_pfn; + p2m_size = ((p2m_max_low_pfn - p2m_min_low_pfn + + PTRS_PER_PTE - 1) / PTRS_PER_PTE) << PAGE_SHIFT; for (i = 0; i < sizeof(p2m_page_shifts)/sizeof(p2m_page_shifts[0]); i++) { @@ -1031,7 +1032,8 @@ p2m_expose_init(void) granule_pfn); num_pfn = p2m_convert_max_pfn - p2m_convert_min_pfn; p2m_expose_size = num_pfn << PAGE_SHIFT; - p2m_size = num_pfn / PTRS_PER_PTE; + p2m_size = ((num_pfn + PTRS_PER_PTE - 1) / + PTRS_PER_PTE) << PAGE_SHIFT; p2m_size = ROUNDUP(p2m_size, granule_pfn << PAGE_SHIFT); if (p2m_size == page_size) break; @@ -1051,7 +1053,8 @@ p2m_expose_init(void) p2m_convert_max_pfn = ROUNDUP(p2m_max_low_pfn, p2m_granule_pfn); num_pfn = p2m_convert_max_pfn - p2m_convert_min_pfn; p2m_expose_size = num_pfn << PAGE_SHIFT; - p2m_size = num_pfn / PTRS_PER_PTE; + p2m_size = ((num_pfn + PTRS_PER_PTE - 1) / PTRS_PER_PTE) << + PAGE_SHIFT; p2m_size = ROUNDUP(p2m_size, p2m_granule_pfn << PAGE_SHIFT); align = max(privcmd_resource_align, p2m_granule_pfn << PAGE_SHIFT); @@ -1064,7 +1067,7 @@ p2m_expose_init(void) if (error) { printk(KERN_ERR P2M_PREFIX "can't allocate region for p2m exposure " - "[0x%016lx, 0x%016lx) 0x%016lx\n", + "[0x%016lx, 0x%016lx] 0x%016lx\n", p2m_convert_min_pfn, p2m_convert_max_pfn, p2m_size); goto out; } @@ -1102,10 +1105,10 @@ p2m_expose_init(void) p2m_initialized = 1; printk(P2M_PREFIX "assign p2m table of [0x%016lx, 0x%016lx)\n", p2m_convert_min_pfn << PAGE_SHIFT, - p2m_convert_max_pfn << PAGE_SHIFT); + (p2m_convert_max_pfn << PAGE_SHIFT) + PAGE_SIZE); printk(P2M_PREFIX "to [0x%016lx, 0x%016lx) (%ld KBytes)\n", p2m_assign_start_pfn << PAGE_SHIFT, - p2m_assign_end_pfn << PAGE_SHIFT, + (p2m_assign_end_pfn << PAGE_SHIFT) + PAGE_SIZE, p2m_size / 1024); out: unlock_cpu_hotplug();