diff options
author | Christoffer Dall <christoffer.dall@linaro.org> | 2014-05-09 17:31:31 -0400 |
---|---|---|
committer | Christoffer Dall <christoffer.dall@linaro.org> | 2014-07-11 07:46:51 -0400 |
commit | 4f853a714bf16338ff5261128e6c7ae2569e9505 (patch) | |
tree | 3726687645ce6cc69b732606ebf07ff89cea63e5 /arch/arm64 | |
parent | 9f6226a762c7ae02f6a23a3d4fc552dafa57ea23 (diff) |
arm/arm64: KVM: Fix and refactor unmap_range
unmap_range() was utterly broken, to quote Marc, and broke in all sorts
of situations. It was also quite complicated to follow and didn't
follow the usual scheme of having a separate iterating function for each
level of page tables.
Address this by refactoring the code and introduce a pgd_clear()
function.
Reviewed-by: Jungseok Lee <jays.lee@samsung.com>
Reviewed-by: Mario Smarduch <m.smarduch@samsung.com>
Acked-by: Marc Zyngier <marc.zyngier@arm.com>
Signed-off-by: Christoffer Dall <christoffer.dall@linaro.org>
Diffstat (limited to 'arch/arm64')
-rw-r--r-- | arch/arm64/include/asm/kvm_mmu.h | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/arch/arm64/include/asm/kvm_mmu.h b/arch/arm64/include/asm/kvm_mmu.h index 7d29847a893b..8e138c7c53ac 100644 --- a/arch/arm64/include/asm/kvm_mmu.h +++ b/arch/arm64/include/asm/kvm_mmu.h | |||
@@ -125,6 +125,21 @@ static inline void kvm_set_s2pmd_writable(pmd_t *pmd) | |||
125 | #define kvm_pud_addr_end(addr, end) pud_addr_end(addr, end) | 125 | #define kvm_pud_addr_end(addr, end) pud_addr_end(addr, end) |
126 | #define kvm_pmd_addr_end(addr, end) pmd_addr_end(addr, end) | 126 | #define kvm_pmd_addr_end(addr, end) pmd_addr_end(addr, end) |
127 | 127 | ||
128 | static inline bool kvm_page_empty(void *ptr) | ||
129 | { | ||
130 | struct page *ptr_page = virt_to_page(ptr); | ||
131 | return page_count(ptr_page) == 1; | ||
132 | } | ||
133 | |||
134 | #define kvm_pte_table_empty(ptep) kvm_page_empty(ptep) | ||
135 | #ifndef CONFIG_ARM64_64K_PAGES | ||
136 | #define kvm_pmd_table_empty(pmdp) kvm_page_empty(pmdp) | ||
137 | #else | ||
138 | #define kvm_pmd_table_empty(pmdp) (0) | ||
139 | #endif | ||
140 | #define kvm_pud_table_empty(pudp) (0) | ||
141 | |||
142 | |||
128 | struct kvm; | 143 | struct kvm; |
129 | 144 | ||
130 | #define kvm_flush_dcache_to_poc(a,l) __flush_dcache_area((a), (l)) | 145 | #define kvm_flush_dcache_to_poc(a,l) __flush_dcache_area((a), (l)) |