[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [xen master] x86: don't use destroy_xen_mappings() for vunmap()



commit 68caac7f6f4687241a24e804a9fca19aa26fe183
Author:     Jan Beulich <jbeulich@xxxxxxxx>
AuthorDate: Wed Jul 17 10:21:33 2013 +0200
Commit:     Jan Beulich <jbeulich@xxxxxxxx>
CommitDate: Wed Jul 17 10:21:33 2013 +0200

    x86: don't use destroy_xen_mappings() for vunmap()
    
    Its attempt to tear down intermediate page table levels may race with
    map_pages_to_xen() establishing them, and now that
    map_domain_page_global() is backed by vmap() this teardown is also
    wasteful (as it's very likely to need the same address space populated
    again within foreseeable time).
    
    As the race between vmap() and vunmap(), according to the latest stage
    tester logs, doesn't appear to be the only one still left, the patch
    also adds logging for vmap() and vunmap() uses (there shouldn't be too
    many of them, so logs shouldn't get flooded). These are supposed to
    get removed (and are made stand out clearly) as soon as we're certain
    that there's no issue left.
    
    Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
    Acked-by: Keir Fraser <keir@xxxxxxx>
---
 xen/common/vmap.c          |    6 ++++++
 xen/include/asm-x86/page.h |    1 +
 2 files changed, 7 insertions(+), 0 deletions(-)

diff --git a/xen/common/vmap.c b/xen/common/vmap.c
index c2d8a8c..e959a17 100644
--- a/xen/common/vmap.c
+++ b/xen/common/vmap.c
@@ -177,6 +177,7 @@ void *__vmap(const unsigned long *mfn, unsigned int 
granularity,
     void *va = vm_alloc(nr * granularity, align);
     unsigned long cur = (unsigned long)va;
 
+printk("vmap(%p:%#x)\n", va, nr * granularity);//temp
     for ( ; va && nr--; ++mfn, cur += PAGE_SIZE * granularity )
     {
         if ( map_pages_to_xen(cur, *mfn, granularity, flags) )
@@ -196,9 +197,14 @@ void *vmap(const unsigned long *mfn, unsigned int nr)
 
 void vunmap(const void *va)
 {
+#ifndef _PAGE_NONE
     unsigned long addr = (unsigned long)va;
 
     destroy_xen_mappings(addr, addr + PAGE_SIZE * vm_size(va));
+#else /* Avoid tearing down intermediate page tables. */
+printk("vunmap(%p:%#x)\n", va, vm_size(va));//temp
+    map_pages_to_xen((unsigned long)va, 0, vm_size(va), _PAGE_NONE);
+#endif
     vm_free(va);
 }
 #endif
diff --git a/xen/include/asm-x86/page.h b/xen/include/asm-x86/page.h
index 53c005f..7a46af5 100644
--- a/xen/include/asm-x86/page.h
+++ b/xen/include/asm-x86/page.h
@@ -288,6 +288,7 @@ extern l1_pgentry_t l1_identmap[L1_PAGETABLE_ENTRIES],
 void paging_init(void);
 #endif /* !defined(__ASSEMBLY__) */
 
+#define _PAGE_NONE     _AC(0x000,U)
 #define _PAGE_PRESENT  _AC(0x001,U)
 #define _PAGE_RW       _AC(0x002,U)
 #define _PAGE_USER     _AC(0x004,U)
--
generated by git-patchbot for /home/xen/git/xen.git#master

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.