[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [RFC PATCH 60/84] x86/domain_page: use PMAP when d/vcache is not ready.
From: Hongyan Xia <hongyax@xxxxxxxxxx> Also fix a place where unmap_domain_page should only be conditionally used. Signed-off-by: Hongyan Xia <hongyax@xxxxxxxxxx> --- xen/arch/x86/domain_page.c | 27 ++++++++++++++++++++++++--- xen/arch/x86/mm.c | 3 ++- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/xen/arch/x86/domain_page.c b/xen/arch/x86/domain_page.c index 9ea74b456c..bece9d8cd0 100644 --- a/xen/arch/x86/domain_page.c +++ b/xen/arch/x86/domain_page.c @@ -17,6 +17,8 @@ #include <asm/flushtlb.h> #include <asm/hardirq.h> #include <asm/setup.h> +#include <asm/pmap.h> +#include <asm/fixmap.h> static DEFINE_PER_CPU(struct vcpu *, override); @@ -83,12 +85,26 @@ void *map_domain_page(mfn_t mfn) v = mapcache_current_vcpu(); if ( !v || !is_pv_vcpu(v) ) - return mfn_to_virt(mfn_x(mfn)); + { + void *ret; + pmap_lock(); + ret = pmap_map(mfn); + pmap_unlock(); + flush_tlb_one_local(ret); + return ret; + } dcache = &v->domain->arch.pv.mapcache; vcache = &v->arch.pv.mapcache; if ( !dcache->inuse ) - return mfn_to_virt(mfn_x(mfn)); + { + void *ret; + pmap_lock(); + ret = pmap_map(mfn); + pmap_unlock(); + flush_tlb_one_local(ret); + return ret; + } perfc_incr(map_domain_page_count); @@ -181,8 +197,13 @@ void unmap_domain_page(const void *ptr) unsigned long va = (unsigned long)ptr, mfn, flags; struct vcpu_maphash_entry *hashent; - if ( va >= DIRECTMAP_VIRT_START ) + if ( va >= FIXADDR_START && va < FIXADDR_TOP ) + { + pmap_lock(); + pmap_unmap((void *)ptr); + pmap_unlock(); return; + } ASSERT(va >= MAPCACHE_VIRT_START && va < MAPCACHE_VIRT_END); diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c index 145c5ab47c..9619182f52 100644 --- a/xen/arch/x86/mm.c +++ b/xen/arch/x86/mm.c @@ -5949,7 +5949,8 @@ int create_perdomain_mapping(struct domain *d, unsigned long va, if ( rc || !nr || !l1_table_offset(va) ) { /* Note that this is a no-op for the alloc_xenheap_page() case. */ - unmap_domain_page(l1tab); + if( (unsigned long)l1tab < DIRECTMAP_VIRT_START ) + unmap_domain_page(l1tab); l1tab = NULL; } } -- 2.17.1 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |