xen/p2m: An early bootup variant of set_phys_to_machine
authorKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Fri, 30 Mar 2012 18:33:14 +0000 (14:33 -0400)
committerKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Fri, 6 Apr 2012 21:03:06 +0000 (17:03 -0400)
During early bootup we can't use alloc_page, so to allocate
leaf pages in the P2M we need to use extend_brk. For that
we are utilizing the early_alloc_p2m and early_alloc_p2m_middle
functions to do the job for us. This function follows the
same logic as set_phys_to_machine.

Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
arch/x86/include/asm/xen/page.h
arch/x86/xen/p2m.c

index c34f96c2f7a0773dae5fcd4a1e30f20eb477a83c..93971e841dd5e7eaa032f5f4a8d5542040900a6d 100644 (file)
@@ -44,6 +44,7 @@ extern unsigned long  machine_to_phys_nr;
 
 extern unsigned long get_phys_to_machine(unsigned long pfn);
 extern bool set_phys_to_machine(unsigned long pfn, unsigned long mfn);
+extern bool __init early_set_phys_to_machine(unsigned long pfn, unsigned long mfn);
 extern bool __set_phys_to_machine(unsigned long pfn, unsigned long mfn);
 extern unsigned long set_phys_range_identity(unsigned long pfn_s,
                                             unsigned long pfn_e);
index 952edefcedb356d4e331c2794a5e978728d33d4c..ffd08c414e91a7cc9f4a507b4ca3bbad9b823523 100644 (file)
@@ -570,6 +570,21 @@ static bool __init early_alloc_p2m(unsigned long pfn)
        }
        return true;
 }
+bool __init early_set_phys_to_machine(unsigned long pfn, unsigned long mfn)
+{
+       if (unlikely(!__set_phys_to_machine(pfn, mfn)))  {
+               if (!early_alloc_p2m(pfn))
+                       return false;
+
+               if (!early_alloc_p2m_middle(pfn, false /* boundary crossover OK!*/))
+                       return false;
+
+               if (!__set_phys_to_machine(pfn, mfn))
+                       return false;
+       }
+
+       return true;
+}
 unsigned long __init set_phys_range_identity(unsigned long pfn_s,
                                      unsigned long pfn_e)
 {