aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/powerpc/kvm/book3s_64_vio.c23
-rw-r--r--arch/powerpc/kvm/book3s_hv_rmhandlers.S13
-rw-r--r--arch/powerpc/kvm/powerpc.c3
3 files changed, 25 insertions, 14 deletions
diff --git a/arch/powerpc/kvm/book3s_64_vio.c b/arch/powerpc/kvm/book3s_64_vio.c
index 8f2da8bba737..4dffa611376d 100644
--- a/arch/powerpc/kvm/book3s_64_vio.c
+++ b/arch/powerpc/kvm/book3s_64_vio.c
@@ -478,28 +478,30 @@ long kvmppc_h_put_tce(struct kvm_vcpu *vcpu, unsigned long liobn,
478 return ret; 478 return ret;
479 479
480 dir = iommu_tce_direction(tce); 480 dir = iommu_tce_direction(tce);
481
482 idx = srcu_read_lock(&vcpu->kvm->srcu);
483
481 if ((dir != DMA_NONE) && kvmppc_gpa_to_ua(vcpu->kvm, 484 if ((dir != DMA_NONE) && kvmppc_gpa_to_ua(vcpu->kvm,
482 tce & ~(TCE_PCI_READ | TCE_PCI_WRITE), &ua, NULL)) 485 tce & ~(TCE_PCI_READ | TCE_PCI_WRITE), &ua, NULL)) {
483 return H_PARAMETER; 486 ret = H_PARAMETER;
487 goto unlock_exit;
488 }
484 489
485 entry = ioba >> stt->page_shift; 490 entry = ioba >> stt->page_shift;
486 491
487 list_for_each_entry_lockless(stit, &stt->iommu_tables, next) { 492 list_for_each_entry_lockless(stit, &stt->iommu_tables, next) {
488 if (dir == DMA_NONE) { 493 if (dir == DMA_NONE)
489 ret = kvmppc_tce_iommu_unmap(vcpu->kvm, 494 ret = kvmppc_tce_iommu_unmap(vcpu->kvm,
490 stit->tbl, entry); 495 stit->tbl, entry);
491 } else { 496 else
492 idx = srcu_read_lock(&vcpu->kvm->srcu);
493 ret = kvmppc_tce_iommu_map(vcpu->kvm, stit->tbl, 497 ret = kvmppc_tce_iommu_map(vcpu->kvm, stit->tbl,
494 entry, ua, dir); 498 entry, ua, dir);
495 srcu_read_unlock(&vcpu->kvm->srcu, idx);
496 }
497 499
498 if (ret == H_SUCCESS) 500 if (ret == H_SUCCESS)
499 continue; 501 continue;
500 502
501 if (ret == H_TOO_HARD) 503 if (ret == H_TOO_HARD)
502 return ret; 504 goto unlock_exit;
503 505
504 WARN_ON_ONCE(1); 506 WARN_ON_ONCE(1);
505 kvmppc_clear_tce(stit->tbl, entry); 507 kvmppc_clear_tce(stit->tbl, entry);
@@ -507,7 +509,10 @@ long kvmppc_h_put_tce(struct kvm_vcpu *vcpu, unsigned long liobn,
507 509
508 kvmppc_tce_put(stt, entry, tce); 510 kvmppc_tce_put(stt, entry, tce);
509 511
510 return H_SUCCESS; 512unlock_exit:
513 srcu_read_unlock(&vcpu->kvm->srcu, idx);
514
515 return ret;
511} 516}
512EXPORT_SYMBOL_GPL(kvmppc_h_put_tce); 517EXPORT_SYMBOL_GPL(kvmppc_h_put_tce);
513 518
diff --git a/arch/powerpc/kvm/book3s_hv_rmhandlers.S b/arch/powerpc/kvm/book3s_hv_rmhandlers.S
index ec69fa45d5a2..42639fba89e8 100644
--- a/arch/powerpc/kvm/book3s_hv_rmhandlers.S
+++ b/arch/powerpc/kvm/book3s_hv_rmhandlers.S
@@ -989,13 +989,14 @@ ALT_FTR_SECTION_END_IFCLR(CPU_FTR_ARCH_300)
989 beq no_xive 989 beq no_xive
990 ld r11, VCPU_XIVE_SAVED_STATE(r4) 990 ld r11, VCPU_XIVE_SAVED_STATE(r4)
991 li r9, TM_QW1_OS 991 li r9, TM_QW1_OS
992 stdcix r11,r9,r10
993 eieio 992 eieio
993 stdcix r11,r9,r10
994 lwz r11, VCPU_XIVE_CAM_WORD(r4) 994 lwz r11, VCPU_XIVE_CAM_WORD(r4)
995 li r9, TM_QW1_OS + TM_WORD2 995 li r9, TM_QW1_OS + TM_WORD2
996 stwcix r11,r9,r10 996 stwcix r11,r9,r10
997 li r9, 1 997 li r9, 1
998 stw r9, VCPU_XIVE_PUSHED(r4) 998 stw r9, VCPU_XIVE_PUSHED(r4)
999 eieio
999no_xive: 1000no_xive:
1000#endif /* CONFIG_KVM_XICS */ 1001#endif /* CONFIG_KVM_XICS */
1001 1002
@@ -1310,6 +1311,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR)
1310 bne 3f 1311 bne 3f
1311BEGIN_FTR_SECTION 1312BEGIN_FTR_SECTION
1312 PPC_MSGSYNC 1313 PPC_MSGSYNC
1314 lwsync
1313END_FTR_SECTION_IFSET(CPU_FTR_ARCH_300) 1315END_FTR_SECTION_IFSET(CPU_FTR_ARCH_300)
1314 lbz r0, HSTATE_HOST_IPI(r13) 1316 lbz r0, HSTATE_HOST_IPI(r13)
1315 cmpwi r0, 0 1317 cmpwi r0, 0
@@ -1400,8 +1402,8 @@ guest_exit_cont: /* r9 = vcpu, r12 = trap, r13 = paca */
1400 cmpldi cr0, r10, 0 1402 cmpldi cr0, r10, 0
1401 beq 1f 1403 beq 1f
1402 /* First load to pull the context, we ignore the value */ 1404 /* First load to pull the context, we ignore the value */
1403 lwzx r11, r7, r10
1404 eieio 1405 eieio
1406 lwzx r11, r7, r10
1405 /* Second load to recover the context state (Words 0 and 1) */ 1407 /* Second load to recover the context state (Words 0 and 1) */
1406 ldx r11, r6, r10 1408 ldx r11, r6, r10
1407 b 3f 1409 b 3f
@@ -1409,8 +1411,8 @@ guest_exit_cont: /* r9 = vcpu, r12 = trap, r13 = paca */
1409 cmpldi cr0, r10, 0 1411 cmpldi cr0, r10, 0
1410 beq 1f 1412 beq 1f
1411 /* First load to pull the context, we ignore the value */ 1413 /* First load to pull the context, we ignore the value */
1412 lwzcix r11, r7, r10
1413 eieio 1414 eieio
1415 lwzcix r11, r7, r10
1414 /* Second load to recover the context state (Words 0 and 1) */ 1416 /* Second load to recover the context state (Words 0 and 1) */
1415 ldcix r11, r6, r10 1417 ldcix r11, r6, r10
14163: std r11, VCPU_XIVE_SAVED_STATE(r9) 14183: std r11, VCPU_XIVE_SAVED_STATE(r9)
@@ -1420,6 +1422,7 @@ guest_exit_cont: /* r9 = vcpu, r12 = trap, r13 = paca */
1420 stw r10, VCPU_XIVE_PUSHED(r9) 1422 stw r10, VCPU_XIVE_PUSHED(r9)
1421 stb r10, (VCPU_XIVE_SAVED_STATE+3)(r9) 1423 stb r10, (VCPU_XIVE_SAVED_STATE+3)(r9)
1422 stb r0, (VCPU_XIVE_SAVED_STATE+4)(r9) 1424 stb r0, (VCPU_XIVE_SAVED_STATE+4)(r9)
1425 eieio
14231: 14261:
1424#endif /* CONFIG_KVM_XICS */ 1427#endif /* CONFIG_KVM_XICS */
1425 /* Save more register state */ 1428 /* Save more register state */
@@ -2788,6 +2791,10 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S)
2788 PPC_MSGCLR(6) 2791 PPC_MSGCLR(6)
2789 /* see if it's a host IPI */ 2792 /* see if it's a host IPI */
2790 li r3, 1 2793 li r3, 1
2794BEGIN_FTR_SECTION
2795 PPC_MSGSYNC
2796 lwsync
2797END_FTR_SECTION_IFSET(CPU_FTR_ARCH_300)
2791 lbz r0, HSTATE_HOST_IPI(r13) 2798 lbz r0, HSTATE_HOST_IPI(r13)
2792 cmpwi r0, 0 2799 cmpwi r0, 0
2793 bnelr 2800 bnelr
diff --git a/arch/powerpc/kvm/powerpc.c b/arch/powerpc/kvm/powerpc.c
index 3480faaf1ef8..ee279c7f4802 100644
--- a/arch/powerpc/kvm/powerpc.c
+++ b/arch/powerpc/kvm/powerpc.c
@@ -644,8 +644,7 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext)
644 break; 644 break;
645#endif 645#endif
646 case KVM_CAP_PPC_HTM: 646 case KVM_CAP_PPC_HTM:
647 r = cpu_has_feature(CPU_FTR_TM_COMP) && 647 r = cpu_has_feature(CPU_FTR_TM_COMP) && hv_enabled;
648 is_kvmppc_hv_enabled(kvm);
649 break; 648 break;
650 default: 649 default:
651 r = 0; 650 r = 0;