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

[Xen-changelog] All page directory pages have to be pinned before/during relocation, so



ChangeSet 1.1629.1.1, 2005/06/01 17:40:26+01:00, cl349@xxxxxxxxxxxxxxxxxxxx

        All page directory pages have to be pinned before/during relocation, so
        that the entries they contain can be canonicalised during relocation.
        mmu_context.h, mmu.h, pgtable.c, ldt.c, reboot.c:
          Pin all unpinned in-use pgd's before relocation.
        reboot.c:
          Flush the pgd cache before relocation.
        Signed-off-by: Christian Limpach <Christian.Limpach@xxxxxxxxxxxx>



 arch/xen/i386/kernel/ldt.c             |    9 +++++++++
 arch/xen/i386/mm/pgtable.c             |   16 ++++++++++++++++
 arch/xen/kernel/reboot.c               |    3 +++
 include/asm-xen/asm-i386/mmu.h         |    4 ++++
 include/asm-xen/asm-i386/mmu_context.h |    1 +
 5 files changed, 33 insertions(+)


diff -Nru a/linux-2.6.11-xen-sparse/arch/xen/i386/kernel/ldt.c 
b/linux-2.6.11-xen-sparse/arch/xen/i386/kernel/ldt.c
--- a/linux-2.6.11-xen-sparse/arch/xen/i386/kernel/ldt.c        2005-06-02 
05:03:00 -04:00
+++ b/linux-2.6.11-xen-sparse/arch/xen/i386/kernel/ldt.c        2005-06-02 
05:03:00 -04:00
@@ -18,6 +18,7 @@
 #include <asm/system.h>
 #include <asm/ldt.h>
 #include <asm/desc.h>
+#include <asm/mmu_context.h>
 
 #ifdef CONFIG_SMP /* avoids "defined but not used" warnig */
 static void flush_ldt(void *null)
@@ -108,6 +109,11 @@
                retval = copy_ldt(&mm->context, &old_mm->context);
                up(&old_mm->context.sem);
        }
+       if (retval == 0) {
+               spin_lock(&mm_unpinned_lock);
+               list_add(&mm->context.unpinned, &mm_unpinned);
+               spin_unlock(&mm_unpinned_lock);
+       }
        return retval;
 }
 
@@ -128,6 +134,9 @@
                        kfree(mm->context.ldt);
                mm->context.size = 0;
        }
+       spin_lock(&mm_unpinned_lock);
+       list_del(&mm->context.unpinned);
+       spin_unlock(&mm_unpinned_lock);
 }
 
 static int read_ldt(void __user * ptr, unsigned long bytecount)
diff -Nru a/linux-2.6.11-xen-sparse/arch/xen/i386/mm/pgtable.c 
b/linux-2.6.11-xen-sparse/arch/xen/i386/mm/pgtable.c
--- a/linux-2.6.11-xen-sparse/arch/xen/i386/mm/pgtable.c        2005-06-02 
05:03:00 -04:00
+++ b/linux-2.6.11-xen-sparse/arch/xen/i386/mm/pgtable.c        2005-06-02 
05:03:00 -04:00
@@ -408,6 +408,9 @@
 }
 #endif /* CONFIG_XEN_SHADOW_MODE */
 
+LIST_HEAD(mm_unpinned);
+DEFINE_SPINLOCK(mm_unpinned_lock);
+
 static inline void mm_walk_set_prot(void *pt, pgprot_t flags)
 {
        struct page *page = virt_to_page(pt);
@@ -461,6 +464,9 @@
         pfn_pte(virt_to_phys(mm->pgd)>>PAGE_SHIFT, PAGE_KERNEL_RO), 0);
     xen_pgd_pin(__pa(mm->pgd));
     mm->context.pinned = 1;
+    spin_lock(&mm_unpinned_lock);
+    list_del(&mm->context.unpinned);
+    spin_unlock(&mm_unpinned_lock);
 
     spin_unlock(&mm->page_table_lock);
 }
@@ -475,8 +481,18 @@
         pfn_pte(virt_to_phys(mm->pgd)>>PAGE_SHIFT, PAGE_KERNEL), 0);
     mm_walk(mm, PAGE_KERNEL);
     mm->context.pinned = 0;
+    spin_lock(&mm_unpinned_lock);
+    list_add(&mm->context.unpinned, &mm_unpinned);
+    spin_unlock(&mm_unpinned_lock);
 
     spin_unlock(&mm->page_table_lock);
+}
+
+void mm_pin_all(void)
+{
+    while (!list_empty(&mm_unpinned))  
+       mm_pin(list_entry(mm_unpinned.next, struct mm_struct,
+                         context.unpinned));
 }
 
 void _arch_exit_mmap(struct mm_struct *mm)
diff -Nru a/linux-2.6.11-xen-sparse/arch/xen/kernel/reboot.c 
b/linux-2.6.11-xen-sparse/arch/xen/kernel/reboot.c
--- a/linux-2.6.11-xen-sparse/arch/xen/kernel/reboot.c  2005-06-02 05:03:00 
-04:00
+++ b/linux-2.6.11-xen-sparse/arch/xen/kernel/reboot.c  2005-06-02 05:03:00 
-04:00
@@ -103,6 +103,9 @@
 
     __cli();
 
+    mm_pin_all();
+    kmem_cache_shrink(pgd_cache);
+
     netif_suspend();
 
     blkdev_suspend();
diff -Nru a/linux-2.6.11-xen-sparse/include/asm-xen/asm-i386/mmu.h 
b/linux-2.6.11-xen-sparse/include/asm-xen/asm-i386/mmu.h
--- a/linux-2.6.11-xen-sparse/include/asm-xen/asm-i386/mmu.h    2005-06-02 
05:03:00 -04:00
+++ b/linux-2.6.11-xen-sparse/include/asm-xen/asm-i386/mmu.h    2005-06-02 
05:03:00 -04:00
@@ -13,7 +13,11 @@
        struct semaphore sem;
        void *ldt;
        unsigned pinned:1;
+       struct list_head unpinned;
 } mm_context_t;
+
+extern struct list_head mm_unpinned;
+extern spinlock_t mm_unpinned_lock;
 
 /* mm/memory.c:exit_mmap hook */
 extern void _arch_exit_mmap(struct mm_struct *mm);
diff -Nru a/linux-2.6.11-xen-sparse/include/asm-xen/asm-i386/mmu_context.h 
b/linux-2.6.11-xen-sparse/include/asm-xen/asm-i386/mmu_context.h
--- a/linux-2.6.11-xen-sparse/include/asm-xen/asm-i386/mmu_context.h    
2005-06-02 05:03:00 -04:00
+++ b/linux-2.6.11-xen-sparse/include/asm-xen/asm-i386/mmu_context.h    
2005-06-02 05:03:00 -04:00
@@ -43,6 +43,7 @@
 
 extern void mm_pin(struct mm_struct *mm);
 extern void mm_unpin(struct mm_struct *mm);
+void mm_pin_all(void);
 
 static inline void switch_mm(struct mm_struct *prev,
                             struct mm_struct *next,

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
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®.