aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/arm/kvm/mmu.c20
1 files changed, 15 insertions, 5 deletions
diff --git a/arch/arm/kvm/mmu.c b/arch/arm/kvm/mmu.c
index cb924c6d56a6..f2a9874ff5cb 100644
--- a/arch/arm/kvm/mmu.c
+++ b/arch/arm/kvm/mmu.c
@@ -919,7 +919,7 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa,
919 if (!hugetlb && !force_pte) 919 if (!hugetlb && !force_pte)
920 hugetlb = transparent_hugepage_adjust(&pfn, &fault_ipa); 920 hugetlb = transparent_hugepage_adjust(&pfn, &fault_ipa);
921 921
922 fault_ipa_uncached = false; 922 fault_ipa_uncached = memslot->flags & KVM_MEMSLOT_INCOHERENT;
923 923
924 if (hugetlb) { 924 if (hugetlb) {
925 pmd_t new_pmd = pfn_pmd(pfn, mem_type); 925 pmd_t new_pmd = pfn_pmd(pfn, mem_type);
@@ -1298,11 +1298,12 @@ int kvm_arch_prepare_memory_region(struct kvm *kvm,
1298 hva = vm_end; 1298 hva = vm_end;
1299 } while (hva < reg_end); 1299 } while (hva < reg_end);
1300 1300
1301 if (ret) { 1301 spin_lock(&kvm->mmu_lock);
1302 spin_lock(&kvm->mmu_lock); 1302 if (ret)
1303 unmap_stage2_range(kvm, mem->guest_phys_addr, mem->memory_size); 1303 unmap_stage2_range(kvm, mem->guest_phys_addr, mem->memory_size);
1304 spin_unlock(&kvm->mmu_lock); 1304 else
1305 } 1305 stage2_flush_memslot(kvm, memslot);
1306 spin_unlock(&kvm->mmu_lock);
1306 return ret; 1307 return ret;
1307} 1308}
1308 1309
@@ -1314,6 +1315,15 @@ void kvm_arch_free_memslot(struct kvm *kvm, struct kvm_memory_slot *free,
1314int kvm_arch_create_memslot(struct kvm *kvm, struct kvm_memory_slot *slot, 1315int kvm_arch_create_memslot(struct kvm *kvm, struct kvm_memory_slot *slot,
1315 unsigned long npages) 1316 unsigned long npages)
1316{ 1317{
1318 /*
1319 * Readonly memslots are not incoherent with the caches by definition,
1320 * but in practice, they are used mostly to emulate ROMs or NOR flashes
1321 * that the guest may consider devices and hence map as uncached.
1322 * To prevent incoherency issues in these cases, tag all readonly
1323 * regions as incoherent.
1324 */
1325 if (slot->flags & KVM_MEM_READONLY)
1326 slot->flags |= KVM_MEMSLOT_INCOHERENT;
1317 return 0; 1327 return 0;
1318} 1328}
1319 1329