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 | |
| 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')
| -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)) |
