]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/commitdiff
paravirt: add hooks for ptep_modify_prot_start/commit
authorJeremy Fitzhardinge <jeremy@goop.org>
Mon, 16 Jun 2008 11:30:01 +0000 (04:30 -0700)
committerIngo Molnar <mingo@elte.hu>
Wed, 25 Jun 2008 13:16:00 +0000 (15:16 +0200)
This patch adds paravirt-ops hooks in pv_mmu_ops for ptep_modify_prot_start and
ptep_modify_prot_commit.  This allows the hypervisor-specific backends to
implement these in some more efficient way.

Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Acked-by: Linus Torvalds <torvalds@linux-foundation.org>
Acked-by: Hugh Dickins <hugh@veritas.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
arch/x86/kernel/paravirt.c
arch/x86/xen/enlighten.c
include/asm-x86/paravirt.h

index c98d54688180474ed0930c10fdc40444f1de9fca..f1ab0f727007e5f93f6e4502f7a2e6ef73bec62b 100644 (file)
@@ -380,6 +380,9 @@ struct pv_mmu_ops pv_mmu_ops = {
        .pte_update = paravirt_nop,
        .pte_update_defer = paravirt_nop,
 
+       .ptep_modify_prot_start = __ptep_modify_prot_start,
+       .ptep_modify_prot_commit = __ptep_modify_prot_commit,
+
 #ifdef CONFIG_HIGHPTE
        .kmap_atomic_pte = kmap_atomic,
 #endif
index 73fb0c4c150aad00b25886a13bd8b6ed0ca79d8b..0b7553cbc529028c1677b031cf96a586770f4886 100644 (file)
@@ -1138,6 +1138,9 @@ static const struct pv_mmu_ops xen_mmu_ops __initdata = {
        .set_pte_at = xen_set_pte_at,
        .set_pmd = xen_set_pmd_hyper,
 
+       .ptep_modify_prot_start = __ptep_modify_prot_start,
+       .ptep_modify_prot_commit = __ptep_modify_prot_commit,
+
        .pte_val = xen_pte_val,
        .pte_flags = native_pte_val,
        .pgd_val = xen_pgd_val,
index 5ea37a48eecbfbc96a8bf6c5a25c6f59a20e269d..e9ada314dfc15c8ef2faad180989107a4452ec7b 100644 (file)
@@ -238,6 +238,11 @@ struct pv_mmu_ops {
        void (*pte_update_defer)(struct mm_struct *mm,
                                 unsigned long addr, pte_t *ptep);
 
+       pte_t (*ptep_modify_prot_start)(struct mm_struct *mm, unsigned long addr,
+                                       pte_t *ptep);
+       void (*ptep_modify_prot_commit)(struct mm_struct *mm, unsigned long addr,
+                                       pte_t *ptep, pte_t pte);
+
        pteval_t (*pte_val)(pte_t);
        pteval_t (*pte_flags)(pte_t);
        pte_t (*make_pte)(pteval_t pte);
@@ -1039,6 +1044,29 @@ static inline pgdval_t pgd_val(pgd_t pgd)
        return ret;
 }
 
+#define  __HAVE_ARCH_PTEP_MODIFY_PROT_TRANSACTION
+static inline pte_t ptep_modify_prot_start(struct mm_struct *mm, unsigned long addr,
+                                          pte_t *ptep)
+{
+       pteval_t ret;
+
+       ret = PVOP_CALL3(pteval_t, pv_mmu_ops.ptep_modify_prot_start,
+                        mm, addr, ptep);
+
+       return (pte_t) { .pte = ret };
+}
+
+static inline void ptep_modify_prot_commit(struct mm_struct *mm, unsigned long addr,
+                                          pte_t *ptep, pte_t pte)
+{
+       if (sizeof(pteval_t) > sizeof(long))
+               /* 5 arg words */
+               pv_mmu_ops.ptep_modify_prot_commit(mm, addr, ptep, pte);
+       else
+               PVOP_VCALL4(pv_mmu_ops.ptep_modify_prot_commit,
+                           mm, addr, ptep, pte.pte);
+}
+
 static inline void set_pte(pte_t *ptep, pte_t pte)
 {
        if (sizeof(pteval_t) > sizeof(long))