diff options
author | Jeremy Fitzhardinge <jeremy@goop.org> | 2008-06-16 07:30:01 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-06-25 09:16:00 -0400 |
commit | 08b882c627aeeeb3cfd3c4354f0d360d7949549d (patch) | |
tree | bf4a25b0bf67c8e5886425ccd9eddc436602fa21 /include/asm-x86/paravirt.h | |
parent | 1ea0704e0da65b2b46f9142ff1391163aac24060 (diff) |
paravirt: add hooks for ptep_modify_prot_start/commit
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>
Diffstat (limited to 'include/asm-x86/paravirt.h')
-rw-r--r-- | include/asm-x86/paravirt.h | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/include/asm-x86/paravirt.h b/include/asm-x86/paravirt.h index 5ea37a48eecb..e9ada314dfc1 100644 --- a/include/asm-x86/paravirt.h +++ b/include/asm-x86/paravirt.h | |||
@@ -238,6 +238,11 @@ struct pv_mmu_ops { | |||
238 | void (*pte_update_defer)(struct mm_struct *mm, | 238 | void (*pte_update_defer)(struct mm_struct *mm, |
239 | unsigned long addr, pte_t *ptep); | 239 | unsigned long addr, pte_t *ptep); |
240 | 240 | ||
241 | pte_t (*ptep_modify_prot_start)(struct mm_struct *mm, unsigned long addr, | ||
242 | pte_t *ptep); | ||
243 | void (*ptep_modify_prot_commit)(struct mm_struct *mm, unsigned long addr, | ||
244 | pte_t *ptep, pte_t pte); | ||
245 | |||
241 | pteval_t (*pte_val)(pte_t); | 246 | pteval_t (*pte_val)(pte_t); |
242 | pteval_t (*pte_flags)(pte_t); | 247 | pteval_t (*pte_flags)(pte_t); |
243 | pte_t (*make_pte)(pteval_t pte); | 248 | pte_t (*make_pte)(pteval_t pte); |
@@ -1039,6 +1044,29 @@ static inline pgdval_t pgd_val(pgd_t pgd) | |||
1039 | return ret; | 1044 | return ret; |
1040 | } | 1045 | } |
1041 | 1046 | ||
1047 | #define __HAVE_ARCH_PTEP_MODIFY_PROT_TRANSACTION | ||
1048 | static inline pte_t ptep_modify_prot_start(struct mm_struct *mm, unsigned long addr, | ||
1049 | pte_t *ptep) | ||
1050 | { | ||
1051 | pteval_t ret; | ||
1052 | |||
1053 | ret = PVOP_CALL3(pteval_t, pv_mmu_ops.ptep_modify_prot_start, | ||
1054 | mm, addr, ptep); | ||
1055 | |||
1056 | return (pte_t) { .pte = ret }; | ||
1057 | } | ||
1058 | |||
1059 | static inline void ptep_modify_prot_commit(struct mm_struct *mm, unsigned long addr, | ||
1060 | pte_t *ptep, pte_t pte) | ||
1061 | { | ||
1062 | if (sizeof(pteval_t) > sizeof(long)) | ||
1063 | /* 5 arg words */ | ||
1064 | pv_mmu_ops.ptep_modify_prot_commit(mm, addr, ptep, pte); | ||
1065 | else | ||
1066 | PVOP_VCALL4(pv_mmu_ops.ptep_modify_prot_commit, | ||
1067 | mm, addr, ptep, pte.pte); | ||
1068 | } | ||
1069 | |||
1042 | static inline void set_pte(pte_t *ptep, pte_t pte) | 1070 | static inline void set_pte(pte_t *ptep, pte_t pte) |
1043 | { | 1071 | { |
1044 | if (sizeof(pteval_t) > sizeof(long)) | 1072 | if (sizeof(pteval_t) > sizeof(long)) |