x86: don't use destroy_xen_mappings() for vunmap()
authorJan Beulich <jbeulich@suse.com>
Wed, 17 Jul 2013 08:21:33 +0000 (10:21 +0200)
committerJan Beulich <jbeulich@suse.com>
Wed, 17 Jul 2013 08:21:33 +0000 (10:21 +0200)
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@suse.com>
Acked-by: Keir Fraser <keir@xen.org>
xen/common/vmap.c
xen/include/asm-x86/page.h

index c2d8a8ce701b6be29e7ae36c584fde22022d749f..e959a17bf8b325f520548eef327d4cb89c66aa14 100644 (file)
@@ -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
index 53c005f6bdeafe7e69e03ce56fad607582c2f1a5..7a46af5d6c87977ad8909f7be22c28f9febe7662 100644 (file)
@@ -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)