diff options
| author | Marc Zyngier <marc.zyngier@arm.com> | 2018-05-25 07:23:11 -0400 |
|---|---|---|
| committer | Marc Zyngier <marc.zyngier@arm.com> | 2018-07-09 06:37:42 -0400 |
| commit | 88dc25e8ea7c968bbf76d033431e2d7e1418bcd7 (patch) | |
| tree | 78581102d167da491f21f0110666a050d696b473 | |
| parent | 2f6ea23f63cca99cd514c221f075c986b57c927e (diff) | |
KVM: arm/arm64: Consolidate page-table accessors
The arm and arm64 KVM page tables accessors are pointlessly different
between the two architectures, and likely both wrong one way or another:
arm64 lacks a dsb(), and arm doesn't use WRITE_ONCE.
Let's unify them.
Acked-by: Mark Rutland <mark.rutland@arm.com>
Acked-by: Christoffer Dall <christoffer.dall@arm.com>
Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
| -rw-r--r-- | arch/arm/include/asm/kvm_mmu.h | 12 | ||||
| -rw-r--r-- | arch/arm64/include/asm/kvm_mmu.h | 3 | ||||
| -rw-r--r-- | virt/kvm/arm/mmu.c | 12 |
3 files changed, 12 insertions, 15 deletions
diff --git a/arch/arm/include/asm/kvm_mmu.h b/arch/arm/include/asm/kvm_mmu.h index 8553d68b7c8a..b2feaea1434c 100644 --- a/arch/arm/include/asm/kvm_mmu.h +++ b/arch/arm/include/asm/kvm_mmu.h | |||
| @@ -75,18 +75,6 @@ phys_addr_t kvm_get_idmap_vector(void); | |||
| 75 | int kvm_mmu_init(void); | 75 | int kvm_mmu_init(void); |
| 76 | void kvm_clear_hyp_idmap(void); | 76 | void kvm_clear_hyp_idmap(void); |
| 77 | 77 | ||
| 78 | static inline void kvm_set_pmd(pmd_t *pmd, pmd_t new_pmd) | ||
| 79 | { | ||
| 80 | *pmd = new_pmd; | ||
| 81 | dsb(ishst); | ||
| 82 | } | ||
| 83 | |||
| 84 | static inline void kvm_set_pte(pte_t *pte, pte_t new_pte) | ||
| 85 | { | ||
| 86 | *pte = new_pte; | ||
| 87 | dsb(ishst); | ||
| 88 | } | ||
| 89 | |||
| 90 | static inline pte_t kvm_s2pte_mkwrite(pte_t pte) | 78 | static inline pte_t kvm_s2pte_mkwrite(pte_t pte) |
| 91 | { | 79 | { |
| 92 | pte_val(pte) |= L_PTE_S2_RDWR; | 80 | pte_val(pte) |= L_PTE_S2_RDWR; |
diff --git a/arch/arm64/include/asm/kvm_mmu.h b/arch/arm64/include/asm/kvm_mmu.h index bac9f016736b..ea000fb47ec0 100644 --- a/arch/arm64/include/asm/kvm_mmu.h +++ b/arch/arm64/include/asm/kvm_mmu.h | |||
| @@ -169,9 +169,6 @@ phys_addr_t kvm_get_idmap_vector(void); | |||
| 169 | int kvm_mmu_init(void); | 169 | int kvm_mmu_init(void); |
| 170 | void kvm_clear_hyp_idmap(void); | 170 | void kvm_clear_hyp_idmap(void); |
| 171 | 171 | ||
| 172 | #define kvm_set_pte(ptep, pte) set_pte(ptep, pte) | ||
| 173 | #define kvm_set_pmd(pmdp, pmd) set_pmd(pmdp, pmd) | ||
| 174 | |||
| 175 | static inline pte_t kvm_s2pte_mkwrite(pte_t pte) | 172 | static inline pte_t kvm_s2pte_mkwrite(pte_t pte) |
| 176 | { | 173 | { |
| 177 | pte_val(pte) |= PTE_S2_RDWR; | 174 | pte_val(pte) |= PTE_S2_RDWR; |
diff --git a/virt/kvm/arm/mmu.c b/virt/kvm/arm/mmu.c index ea7314296ad1..a6bdbed1903a 100644 --- a/virt/kvm/arm/mmu.c +++ b/virt/kvm/arm/mmu.c | |||
| @@ -177,6 +177,18 @@ static void clear_stage2_pmd_entry(struct kvm *kvm, pmd_t *pmd, phys_addr_t addr | |||
| 177 | put_page(virt_to_page(pmd)); | 177 | put_page(virt_to_page(pmd)); |
| 178 | } | 178 | } |
| 179 | 179 | ||
| 180 | static inline void kvm_set_pte(pte_t *ptep, pte_t new_pte) | ||
| 181 | { | ||
| 182 | WRITE_ONCE(*ptep, new_pte); | ||
| 183 | dsb(ishst); | ||
| 184 | } | ||
| 185 | |||
| 186 | static inline void kvm_set_pmd(pmd_t *pmdp, pmd_t new_pmd) | ||
| 187 | { | ||
| 188 | WRITE_ONCE(*pmdp, new_pmd); | ||
| 189 | dsb(ishst); | ||
| 190 | } | ||
| 191 | |||
| 180 | /* | 192 | /* |
| 181 | * Unmapping vs dcache management: | 193 | * Unmapping vs dcache management: |
| 182 | * | 194 | * |
