ptep_set_access_flags and ptep_set_wrprotect are doing direct pte
updates ignoring the paravirt interface.

The wrprotect change is especially important since it allows full
batching of fork() on COW mappings.

There are still a few PTE update interfaces bypassing paravirt, such as
ptep_get_and_clear_full and ptep_get_and_clear.


Signed-off-by: Marcelo Tosatti <[EMAIL PROTECTED]>

Index: linux-2.6-x86-kvm/include/asm-x86/paravirt.h
===================================================================
--- linux-2.6-x86-kvm.orig/include/asm-x86/paravirt.h
+++ linux-2.6-x86-kvm/include/asm-x86/paravirt.h
@@ -1004,6 +1004,13 @@ static inline void set_pte(pte_t *ptep, 
                            pte.pte);
 }
 
+static inline void pte_clear_bit(unsigned int bit, pte_t *ptep)
+{
+       pte_t pte = *ptep;
+       clear_bit(bit, (unsigned long *)&pte.pte);
+       set_pte(ptep, pte);
+}
+
 static inline void set_pte_at(struct mm_struct *mm, unsigned long addr,
                              pte_t *ptep, pte_t pte)
 {
Index: linux-2.6-x86-kvm/include/asm-x86/pgtable.h
===================================================================
--- linux-2.6-x86-kvm.orig/include/asm-x86/pgtable.h
+++ linux-2.6-x86-kvm/include/asm-x86/pgtable.h
@@ -227,6 +227,8 @@ void native_pagetable_setup_done(pgd_t *
 #define pte_update(mm, addr, ptep)              do { } while (0)
 #define pte_update_defer(mm, addr, ptep)        do { } while (0)
 
+#define pte_clear_bit(bit, ptep)       clear_bit(bit, (unsigned long 
*)&ptep->pte)
+
 static inline void paravirt_pagetable_setup_start(pgd_t *base)
 {
        native_pagetable_setup_start(base);
@@ -302,7 +304,7 @@ static inline void native_set_pte_at(str
 ({                                                                     \
        int __changed = !pte_same(*(ptep), entry);                      \
        if (__changed && dirty) {                                       \
-               *ptep = entry;                                          \
+               set_pte(ptep, entry);                                   \
                pte_update_defer((vma)->vm_mm, (address), (ptep));      \
                flush_tlb_page(vma, address);                           \
        }                                                               \
@@ -357,7 +359,7 @@ static inline pte_t ptep_get_and_clear_f
 #define __HAVE_ARCH_PTEP_SET_WRPROTECT
 static inline void ptep_set_wrprotect(struct mm_struct *mm, unsigned long 
addr, pte_t *ptep)
 {
-       clear_bit(_PAGE_BIT_RW, (unsigned long *)&ptep->pte);
+       pte_clear_bit(_PAGE_BIT_RW, ptep);
        pte_update(mm, addr, ptep);
 }
 

-- 


-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
kvm-devel mailing list
kvm-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/kvm-devel

Reply via email to