diff options
Diffstat (limited to 'arch/powerpc/kvm/book3s_32_mmu_host.c')
-rw-r--r-- | arch/powerpc/kvm/book3s_32_mmu_host.c | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/arch/powerpc/kvm/book3s_32_mmu_host.c b/arch/powerpc/kvm/book3s_32_mmu_host.c index 9fecbfbce77..f922c29bb23 100644 --- a/arch/powerpc/kvm/book3s_32_mmu_host.c +++ b/arch/powerpc/kvm/book3s_32_mmu_host.c | |||
@@ -151,13 +151,15 @@ int kvmppc_mmu_map_page(struct kvm_vcpu *vcpu, struct kvmppc_pte *orig_pte) | |||
151 | bool primary = false; | 151 | bool primary = false; |
152 | bool evict = false; | 152 | bool evict = false; |
153 | struct hpte_cache *pte; | 153 | struct hpte_cache *pte; |
154 | int r = 0; | ||
154 | 155 | ||
155 | /* Get host physical address for gpa */ | 156 | /* Get host physical address for gpa */ |
156 | hpaddr = kvmppc_gfn_to_pfn(vcpu, orig_pte->raddr >> PAGE_SHIFT); | 157 | hpaddr = kvmppc_gfn_to_pfn(vcpu, orig_pte->raddr >> PAGE_SHIFT); |
157 | if (is_error_pfn(hpaddr)) { | 158 | if (is_error_pfn(hpaddr)) { |
158 | printk(KERN_INFO "Couldn't get guest page for gfn %lx!\n", | 159 | printk(KERN_INFO "Couldn't get guest page for gfn %lx!\n", |
159 | orig_pte->eaddr); | 160 | orig_pte->eaddr); |
160 | return -EINVAL; | 161 | r = -EINVAL; |
162 | goto out; | ||
161 | } | 163 | } |
162 | hpaddr <<= PAGE_SHIFT; | 164 | hpaddr <<= PAGE_SHIFT; |
163 | 165 | ||
@@ -249,7 +251,8 @@ next_pteg: | |||
249 | 251 | ||
250 | kvmppc_mmu_hpte_cache_map(vcpu, pte); | 252 | kvmppc_mmu_hpte_cache_map(vcpu, pte); |
251 | 253 | ||
252 | return 0; | 254 | out: |
255 | return r; | ||
253 | } | 256 | } |
254 | 257 | ||
255 | static struct kvmppc_sid_map *create_sid_map(struct kvm_vcpu *vcpu, u64 gvsid) | 258 | static struct kvmppc_sid_map *create_sid_map(struct kvm_vcpu *vcpu, u64 gvsid) |
@@ -297,12 +300,14 @@ int kvmppc_mmu_map_segment(struct kvm_vcpu *vcpu, ulong eaddr) | |||
297 | u64 gvsid; | 300 | u64 gvsid; |
298 | u32 sr; | 301 | u32 sr; |
299 | struct kvmppc_sid_map *map; | 302 | struct kvmppc_sid_map *map; |
300 | struct kvmppc_book3s_shadow_vcpu *svcpu = to_svcpu(vcpu); | 303 | struct kvmppc_book3s_shadow_vcpu *svcpu = svcpu_get(vcpu); |
304 | int r = 0; | ||
301 | 305 | ||
302 | if (vcpu->arch.mmu.esid_to_vsid(vcpu, esid, &gvsid)) { | 306 | if (vcpu->arch.mmu.esid_to_vsid(vcpu, esid, &gvsid)) { |
303 | /* Invalidate an entry */ | 307 | /* Invalidate an entry */ |
304 | svcpu->sr[esid] = SR_INVALID; | 308 | svcpu->sr[esid] = SR_INVALID; |
305 | return -ENOENT; | 309 | r = -ENOENT; |
310 | goto out; | ||
306 | } | 311 | } |
307 | 312 | ||
308 | map = find_sid_vsid(vcpu, gvsid); | 313 | map = find_sid_vsid(vcpu, gvsid); |
@@ -315,17 +320,21 @@ int kvmppc_mmu_map_segment(struct kvm_vcpu *vcpu, ulong eaddr) | |||
315 | 320 | ||
316 | dprintk_sr("MMU: mtsr %d, 0x%x\n", esid, sr); | 321 | dprintk_sr("MMU: mtsr %d, 0x%x\n", esid, sr); |
317 | 322 | ||
318 | return 0; | 323 | out: |
324 | svcpu_put(svcpu); | ||
325 | return r; | ||
319 | } | 326 | } |
320 | 327 | ||
321 | void kvmppc_mmu_flush_segments(struct kvm_vcpu *vcpu) | 328 | void kvmppc_mmu_flush_segments(struct kvm_vcpu *vcpu) |
322 | { | 329 | { |
323 | int i; | 330 | int i; |
324 | struct kvmppc_book3s_shadow_vcpu *svcpu = to_svcpu(vcpu); | 331 | struct kvmppc_book3s_shadow_vcpu *svcpu = svcpu_get(vcpu); |
325 | 332 | ||
326 | dprintk_sr("MMU: flushing all segments (%d)\n", ARRAY_SIZE(svcpu->sr)); | 333 | dprintk_sr("MMU: flushing all segments (%d)\n", ARRAY_SIZE(svcpu->sr)); |
327 | for (i = 0; i < ARRAY_SIZE(svcpu->sr); i++) | 334 | for (i = 0; i < ARRAY_SIZE(svcpu->sr); i++) |
328 | svcpu->sr[i] = SR_INVALID; | 335 | svcpu->sr[i] = SR_INVALID; |
336 | |||
337 | svcpu_put(svcpu); | ||
329 | } | 338 | } |
330 | 339 | ||
331 | void kvmppc_mmu_destroy(struct kvm_vcpu *vcpu) | 340 | void kvmppc_mmu_destroy(struct kvm_vcpu *vcpu) |