xen: make sure xen_max_p2m_pfn is up to date
authorJeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Wed, 15 Sep 2010 20:32:49 +0000 (13:32 -0700)
committerJeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Fri, 22 Oct 2010 19:57:30 +0000 (12:57 -0700)
Keep xen_max_p2m_pfn up to date with the end of the extra memory
we're adding.  It is possible that it will be too high since memory
may be truncated by a "mem=" option on the kernel command line, but
that won't matter.

Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
arch/x86/xen/mmu.c
arch/x86/xen/setup.c
arch/x86/xen/xen-ops.h

index 4c63b7f452dd08d33dec3db12d7d851dcbb1321d..b2371671b11ccd3e3e97a1bfaadc39a3042219ca 100644 (file)
@@ -195,7 +195,7 @@ DEFINE_PER_CPU(unsigned long, xen_current_cr3);      /* actual vcpu cr3 */
  * 512 and 1024 entries respectively. 
  */
 
-static unsigned long max_p2m_pfn __read_mostly;
+unsigned long xen_max_p2m_pfn __read_mostly;
 
 #define P2M_PER_PAGE           (PAGE_SIZE / sizeof(unsigned long))
 #define P2M_MID_PER_PAGE       (PAGE_SIZE / sizeof(unsigned long *))
@@ -293,7 +293,7 @@ void xen_build_mfn_list_list(void)
                p2m_top_mfn_init(p2m_top_mfn);
        }
 
-       for (pfn = 0; pfn < max_p2m_pfn; pfn += P2M_PER_PAGE) {
+       for (pfn = 0; pfn < xen_max_p2m_pfn; pfn += P2M_PER_PAGE) {
                unsigned topidx = p2m_top_index(pfn);
                unsigned mididx = p2m_mid_index(pfn);
                unsigned long **mid;
@@ -335,7 +335,7 @@ void xen_setup_mfn_list_list(void)
 
        HYPERVISOR_shared_info->arch.pfn_to_mfn_frame_list_list =
                virt_to_mfn(p2m_top_mfn);
-       HYPERVISOR_shared_info->arch.max_pfn = max_p2m_pfn;
+       HYPERVISOR_shared_info->arch.max_pfn = xen_max_p2m_pfn;
 }
 
 /* Set up p2m_top to point to the domain-builder provided p2m pages */
@@ -345,7 +345,7 @@ void __init xen_build_dynamic_phys_to_machine(void)
        unsigned long max_pfn = min(MAX_DOMAIN_PAGES, xen_start_info->nr_pages);
        unsigned pfn;
 
-       max_p2m_pfn = max_pfn;
+       xen_max_p2m_pfn = max_pfn;
 
        p2m_missing = extend_brk(PAGE_SIZE, PAGE_SIZE);
        p2m_init(p2m_missing);
index 6c9039e92f8163340f331d282b1aa41637e6c8c9..cad2fcd130ecb589b2cc5753094b7cedd55ab62d 100644 (file)
@@ -64,6 +64,8 @@ static __init void xen_add_extra_mem(unsigned long pages)
                      "XEN EXTRA");
 
        xen_extra_mem_size += size;
+
+       xen_max_p2m_pfn = PFN_DOWN(xen_extra_mem_start + xen_extra_mem_size);
 }
 
 static unsigned long __init xen_release_chunk(phys_addr_t start_addr,
index 7c8ab86163e9142b1c49c6c1ddad13ff203b7a59..d505e98e03f89e951545ea5e460fb9d399e751ec 100644 (file)
@@ -30,6 +30,7 @@ void xen_setup_machphys_mapping(void);
 pgd_t *xen_setup_kernel_pagetable(pgd_t *pgd, unsigned long max_pfn);
 void xen_ident_map_ISA(void);
 void xen_reserve_top(void);
+extern unsigned long xen_max_p2m_pfn;
 
 char * __init xen_memory_setup(void);
 void __init xen_arch_setup(void);