diff options
Diffstat (limited to 'arch/arm/kvm/mmu.c')
-rw-r--r-- | arch/arm/kvm/mmu.c | 15 |
1 files changed, 7 insertions, 8 deletions
diff --git a/arch/arm/kvm/mmu.c b/arch/arm/kvm/mmu.c index 6984342da13d..61d96a645ff3 100644 --- a/arch/arm/kvm/mmu.c +++ b/arch/arm/kvm/mmu.c | |||
@@ -98,6 +98,11 @@ static void kvm_flush_dcache_pud(pud_t pud) | |||
98 | __kvm_flush_dcache_pud(pud); | 98 | __kvm_flush_dcache_pud(pud); |
99 | } | 99 | } |
100 | 100 | ||
101 | static bool kvm_is_device_pfn(unsigned long pfn) | ||
102 | { | ||
103 | return !pfn_valid(pfn); | ||
104 | } | ||
105 | |||
101 | /** | 106 | /** |
102 | * stage2_dissolve_pmd() - clear and flush huge PMD entry | 107 | * stage2_dissolve_pmd() - clear and flush huge PMD entry |
103 | * @kvm: pointer to kvm structure. | 108 | * @kvm: pointer to kvm structure. |
@@ -213,7 +218,7 @@ static void unmap_ptes(struct kvm *kvm, pmd_t *pmd, | |||
213 | kvm_tlb_flush_vmid_ipa(kvm, addr); | 218 | kvm_tlb_flush_vmid_ipa(kvm, addr); |
214 | 219 | ||
215 | /* No need to invalidate the cache for device mappings */ | 220 | /* No need to invalidate the cache for device mappings */ |
216 | if ((pte_val(old_pte) & PAGE_S2_DEVICE) != PAGE_S2_DEVICE) | 221 | if (!kvm_is_device_pfn(pte_pfn(old_pte))) |
217 | kvm_flush_dcache_pte(old_pte); | 222 | kvm_flush_dcache_pte(old_pte); |
218 | 223 | ||
219 | put_page(virt_to_page(pte)); | 224 | put_page(virt_to_page(pte)); |
@@ -305,8 +310,7 @@ static void stage2_flush_ptes(struct kvm *kvm, pmd_t *pmd, | |||
305 | 310 | ||
306 | pte = pte_offset_kernel(pmd, addr); | 311 | pte = pte_offset_kernel(pmd, addr); |
307 | do { | 312 | do { |
308 | if (!pte_none(*pte) && | 313 | if (!pte_none(*pte) && !kvm_is_device_pfn(pte_pfn(*pte))) |
309 | (pte_val(*pte) & PAGE_S2_DEVICE) != PAGE_S2_DEVICE) | ||
310 | kvm_flush_dcache_pte(*pte); | 314 | kvm_flush_dcache_pte(*pte); |
311 | } while (pte++, addr += PAGE_SIZE, addr != end); | 315 | } while (pte++, addr += PAGE_SIZE, addr != end); |
312 | } | 316 | } |
@@ -1037,11 +1041,6 @@ static bool kvm_is_write_fault(struct kvm_vcpu *vcpu) | |||
1037 | return kvm_vcpu_dabt_iswrite(vcpu); | 1041 | return kvm_vcpu_dabt_iswrite(vcpu); |
1038 | } | 1042 | } |
1039 | 1043 | ||
1040 | static bool kvm_is_device_pfn(unsigned long pfn) | ||
1041 | { | ||
1042 | return !pfn_valid(pfn); | ||
1043 | } | ||
1044 | |||
1045 | /** | 1044 | /** |
1046 | * stage2_wp_ptes - write protect PMD range | 1045 | * stage2_wp_ptes - write protect PMD range |
1047 | * @pmd: pointer to pmd entry | 1046 | * @pmd: pointer to pmd entry |