|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 3/3] x86/xen: optimize get_phys_to_machine()
The page table walk is only needed to distinguish between identity and
missing, both of which have INVALID_P2M_ENTRY.
Signed-off-by: David Vrabel <david.vrabel@xxxxxxxxxx>
---
arch/x86/xen/p2m.c | 30 ++++++++++++++++++------------
1 file changed, 18 insertions(+), 12 deletions(-)
diff --git a/arch/x86/xen/p2m.c b/arch/x86/xen/p2m.c
index edbc7a6..a848201 100644
--- a/arch/x86/xen/p2m.c
+++ b/arch/x86/xen/p2m.c
@@ -405,8 +405,7 @@ void __init xen_vmalloc_p2m_tree(void)
unsigned long get_phys_to_machine(unsigned long pfn)
{
- pte_t *ptep;
- unsigned int level;
+ unsigned long mfn;
if (unlikely(pfn >= xen_p2m_size)) {
if (pfn < xen_max_p2m_pfn)
@@ -414,19 +413,26 @@ unsigned long get_phys_to_machine(unsigned long pfn)
return IDENTITY_FRAME(pfn);
}
+
+ mfn = xen_p2m_addr[pfn];
- ptep = lookup_address((unsigned long)(xen_p2m_addr + pfn), &level);
- BUG_ON(!ptep || level != PG_LEVEL_4K);
+ if (unlikely(mfn == INVALID_P2M_ENTRY)) {
+ pte_t *ptep;
+ unsigned int level;
- /*
- * The INVALID_P2M_ENTRY is filled in both p2m_*identity
- * and in p2m_*missing, so returning the INVALID_P2M_ENTRY
- * would be wrong.
- */
- if (pte_pfn(*ptep) == PFN_DOWN(__pa(p2m_identity)))
- return IDENTITY_FRAME(pfn);
+ ptep = lookup_address((unsigned long)(xen_p2m_addr + pfn),
&level);
+ BUG_ON(!ptep || level != PG_LEVEL_4K);
+
+ /*
+ * The INVALID_P2M_ENTRY is filled in both p2m_*identity
+ * and in p2m_*missing, so returning the INVALID_P2M_ENTRY
+ * would be wrong.
+ */
+ if (pte_pfn(*ptep) == PFN_DOWN(__pa(p2m_identity)))
+ return IDENTITY_FRAME(pfn);
+ }
- return xen_p2m_addr[pfn];
+ return mfn;
}
EXPORT_SYMBOL_GPL(get_phys_to_machine);
--
1.7.10.4
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |