Commit:     c2c1accd4b2f9c82fb89d40611c7f581948db255
Parent:     df3624aa293dfa2d46089747d919711089a702eb
Author:     Zachary Amsden <[EMAIL PROTECTED]>
AuthorDate: Wed May 2 19:27:19 2007 +0200
Committer:  Andi Kleen <[EMAIL PROTECTED]>
CommitDate: Wed May 2 19:27:19 2007 +0200

    [PATCH] i386: pte clear optimization
    When exiting from an address space, no special hypervisor notification of 
    table updates needs to occur; direct page table hypervisors, such as Xen,
    switch to another address space first (init_mm) and unprotects the page 
    to avoid the cost of trapping to the hypervisor for each pte_clear.  Shadow
    mode hypervisors, such as VMI and lhype don't need to do the extra work of
    calling through paravirt-ops, and can just directly clear the page table
    entries without notifiying the hypervisor, since all the page tables are 
    to be freed.
    So introduce native_pte_clear functions which bypass any paravirt-ops
    notification.  This results in a significant performance win for VMI and
    removes some indirect calls from zap_pte_range.
    Note the 3-level paging already had a native_pte_clear function, thus
    demanding argument conformance and extra args for the 2-level definition.
    Signed-off-by: Zachary Amsden <[EMAIL PROTECTED]>
    Signed-off-by: Andrew Morton <[EMAIL PROTECTED]>
    Signed-off-by: Andi Kleen <[EMAIL PROTECTED]>
 include/asm-i386/pgtable-2level.h |    5 +++++
 include/asm-i386/pgtable.h        |    2 +-
 2 files changed, 6 insertions(+), 1 deletions(-)

diff --git a/include/asm-i386/pgtable-2level.h 
index 781fe4b..85d9005 100644
--- a/include/asm-i386/pgtable-2level.h
+++ b/include/asm-i386/pgtable-2level.h
@@ -36,6 +36,11 @@ static inline void native_set_pmd(pmd_t *pmdp, pmd_t pmd)
 #define pte_clear(mm,addr,xp)  do { set_pte_at(mm, addr, xp, __pte(0)); } 
while (0)
 #define pmd_clear(xp)  do { set_pmd(xp, __pmd(0)); } while (0)
+static inline void native_pte_clear(struct mm_struct *mm, unsigned long addr, 
pte_t *xp)
+       *xp = __pte(0);
 static inline pte_t native_ptep_get_and_clear(pte_t *xp)
        return __pte(xchg(&xp->pte_low, 0));
diff --git a/include/asm-i386/pgtable.h b/include/asm-i386/pgtable.h
index e7ddd23..00e97a9 100644
--- a/include/asm-i386/pgtable.h
+++ b/include/asm-i386/pgtable.h
@@ -344,7 +344,7 @@ static inline pte_t ptep_get_and_clear_full(struct 
mm_struct *mm, unsigned long
        pte_t pte;
        if (full) {
                pte = *ptep;
-               pte_clear(mm, addr, ptep);
+               native_pte_clear(mm, addr, ptep);
        } else {
                pte = ptep_get_and_clear(mm, addr, ptep);
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at

Reply via email to