diff options
author | James Hogan <james.hogan@imgtec.com> | 2016-06-15 14:29:58 -0400 |
---|---|---|
committer | Paolo Bonzini <pbonzini@redhat.com> | 2016-06-15 17:58:37 -0400 |
commit | 7414d2f65006ac8609196092f2869e0942599b72 (patch) | |
tree | ded5f615069c23c970bd05563cd690330e37eee9 /arch/mips/kvm | |
parent | 42aa12e74e91f790d239bfb852260d07573ce83f (diff) |
MIPS: KVM: Use host CCA for TLB mappings
KVM TLB mappings for the guest were being created with a cache coherency
attribute (CCA) of 3, which is cached incoherent. Create them instead
with the default host CCA, which should be the correct one for coherency
on SMP systems.
Signed-off-by: James Hogan <james.hogan@imgtec.com>
Cc: Paolo Bonzini <pbonzini@redhat.com>
Cc: Radim Krčmář <rkrcmar@redhat.com>
Cc: Ralf Baechle <ralf@linux-mips.org>
Cc: linux-mips@linux-mips.org
Cc: kvm@vger.kernel.org
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Diffstat (limited to 'arch/mips/kvm')
-rw-r--r-- | arch/mips/kvm/mmu.c | 18 | ||||
-rw-r--r-- | arch/mips/kvm/tlb.c | 3 |
2 files changed, 12 insertions, 9 deletions
diff --git a/arch/mips/kvm/mmu.c b/arch/mips/kvm/mmu.c index 2f494ec5c939..ecead748de04 100644 --- a/arch/mips/kvm/mmu.c +++ b/arch/mips/kvm/mmu.c | |||
@@ -116,9 +116,11 @@ int kvm_mips_handle_kseg0_tlb_fault(unsigned long badvaddr, | |||
116 | pfn1 = kvm->arch.guest_pmap[gfn | 0x1]; | 116 | pfn1 = kvm->arch.guest_pmap[gfn | 0x1]; |
117 | 117 | ||
118 | entrylo0 = mips3_paddr_to_tlbpfn(pfn0 << PAGE_SHIFT) | | 118 | entrylo0 = mips3_paddr_to_tlbpfn(pfn0 << PAGE_SHIFT) | |
119 | (0x3 << ENTRYLO_C_SHIFT) | ENTRYLO_D | ENTRYLO_V; | 119 | ((_page_cachable_default >> _CACHE_SHIFT) << ENTRYLO_C_SHIFT) | |
120 | ENTRYLO_D | ENTRYLO_V; | ||
120 | entrylo1 = mips3_paddr_to_tlbpfn(pfn1 << PAGE_SHIFT) | | 121 | entrylo1 = mips3_paddr_to_tlbpfn(pfn1 << PAGE_SHIFT) | |
121 | (0x3 << ENTRYLO_C_SHIFT) | ENTRYLO_D | ENTRYLO_V; | 122 | ((_page_cachable_default >> _CACHE_SHIFT) << ENTRYLO_C_SHIFT) | |
123 | ENTRYLO_D | ENTRYLO_V; | ||
122 | 124 | ||
123 | preempt_disable(); | 125 | preempt_disable(); |
124 | entryhi = (vaddr | kvm_mips_get_kernel_asid(vcpu)); | 126 | entryhi = (vaddr | kvm_mips_get_kernel_asid(vcpu)); |
@@ -157,13 +159,13 @@ int kvm_mips_handle_mapped_seg_tlb_fault(struct kvm_vcpu *vcpu, | |||
157 | 159 | ||
158 | /* Get attributes from the Guest TLB */ | 160 | /* Get attributes from the Guest TLB */ |
159 | entrylo0 = mips3_paddr_to_tlbpfn(pfn0 << PAGE_SHIFT) | | 161 | entrylo0 = mips3_paddr_to_tlbpfn(pfn0 << PAGE_SHIFT) | |
160 | (0x3 << ENTRYLO_C_SHIFT) | | 162 | ((_page_cachable_default >> _CACHE_SHIFT) << ENTRYLO_C_SHIFT) | |
161 | (tlb->tlb_lo[0] & ENTRYLO_D) | | 163 | (tlb->tlb_lo[0] & ENTRYLO_D) | |
162 | (tlb->tlb_lo[0] & ENTRYLO_V); | 164 | (tlb->tlb_lo[0] & ENTRYLO_V); |
163 | entrylo1 = mips3_paddr_to_tlbpfn(pfn1 << PAGE_SHIFT) | | 165 | entrylo1 = mips3_paddr_to_tlbpfn(pfn1 << PAGE_SHIFT) | |
164 | (0x3 << ENTRYLO_C_SHIFT) | | 166 | ((_page_cachable_default >> _CACHE_SHIFT) << ENTRYLO_C_SHIFT) | |
165 | (tlb->tlb_lo[1] & ENTRYLO_D) | | 167 | (tlb->tlb_lo[1] & ENTRYLO_D) | |
166 | (tlb->tlb_lo[1] & ENTRYLO_V); | 168 | (tlb->tlb_lo[1] & ENTRYLO_V); |
167 | 169 | ||
168 | kvm_debug("@ %#lx tlb_lo0: 0x%08lx tlb_lo1: 0x%08lx\n", vcpu->arch.pc, | 170 | kvm_debug("@ %#lx tlb_lo0: 0x%08lx tlb_lo1: 0x%08lx\n", vcpu->arch.pc, |
169 | tlb->tlb_lo[0], tlb->tlb_lo[1]); | 171 | tlb->tlb_lo[0], tlb->tlb_lo[1]); |
diff --git a/arch/mips/kvm/tlb.c b/arch/mips/kvm/tlb.c index 385fbd34e77d..9699352293e4 100644 --- a/arch/mips/kvm/tlb.c +++ b/arch/mips/kvm/tlb.c | |||
@@ -179,7 +179,8 @@ int kvm_mips_handle_commpage_tlb_fault(unsigned long badvaddr, | |||
179 | pfn = CPHYSADDR(vcpu->arch.kseg0_commpage) >> PAGE_SHIFT; | 179 | pfn = CPHYSADDR(vcpu->arch.kseg0_commpage) >> PAGE_SHIFT; |
180 | pair_idx = (badvaddr >> PAGE_SHIFT) & 1; | 180 | pair_idx = (badvaddr >> PAGE_SHIFT) & 1; |
181 | entrylo[pair_idx] = mips3_paddr_to_tlbpfn(pfn << PAGE_SHIFT) | | 181 | entrylo[pair_idx] = mips3_paddr_to_tlbpfn(pfn << PAGE_SHIFT) | |
182 | (0x3 << ENTRYLO_C_SHIFT) | ENTRYLO_D | ENTRYLO_V; | 182 | ((_page_cachable_default >> _CACHE_SHIFT) << ENTRYLO_C_SHIFT) | |
183 | ENTRYLO_D | ENTRYLO_V; | ||
183 | 184 | ||
184 | local_irq_save(flags); | 185 | local_irq_save(flags); |
185 | 186 | ||