|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 1 of 3] x86/mm: Relieve contention for p2m lock in gva_to_gfn
xen/arch/x86/mm/hap/guest_walk.c | 6 +++++-
1 files changed, 5 insertions(+), 1 deletions(-)
We don't need to hold the p2m lock for the duration of the guest walk. We need
to ensure livenes of the top level page.
Signed-off-by: Andres Lagar-Cavilla <andres@xxxxxxxxxxxxxxxx>
diff -r 34c7e6be9265 -r 58fd70123787 xen/arch/x86/mm/hap/guest_walk.c
--- a/xen/arch/x86/mm/hap/guest_walk.c
+++ b/xen/arch/x86/mm/hap/guest_walk.c
@@ -52,6 +52,7 @@ unsigned long hap_p2m_ga_to_gfn(GUEST_PA
{
uint32_t missing;
mfn_t top_mfn;
+ struct page_info *top_page;
void *top_map;
p2m_type_t p2mt;
p2m_access_t p2ma;
@@ -85,13 +86,16 @@ unsigned long hap_p2m_ga_to_gfn(GUEST_PA
/* Map the top-level table and call the tree-walker */
ASSERT(mfn_valid(mfn_x(top_mfn)));
+ top_page = mfn_to_page(mfn_x(top_mfn));
+ ASSERT(get_page(top_page, p2m->domain));
+ __put_gfn(p2m, top_gfn);
top_map = map_domain_page(mfn_x(top_mfn));
#if GUEST_PAGING_LEVELS == 3
top_map += (cr3 & ~(PAGE_MASK | 31));
#endif
missing = guest_walk_tables(v, p2m, ga, &gw, pfec[0], top_mfn, top_map);
unmap_domain_page(top_map);
- __put_gfn(p2m, top_gfn);
+ put_page(top_page);
/* Interpret the answer */
if ( missing == 0 )
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |