diff options
| -rw-r--r-- | arch/powerpc/kvm/book3s_64_vio.c | 23 | ||||
| -rw-r--r-- | arch/powerpc/kvm/book3s_hv_rmhandlers.S | 13 | ||||
| -rw-r--r-- | arch/powerpc/kvm/powerpc.c | 3 |
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; | 512 | unlock_exit: |
| 513 | srcu_read_unlock(&vcpu->kvm->srcu, idx); | ||
| 514 | |||
| 515 | return ret; | ||
| 511 | } | 516 | } |
| 512 | EXPORT_SYMBOL_GPL(kvmppc_h_put_tce); | 517 | EXPORT_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 | ||
| 999 | no_xive: | 1000 | no_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 |
| 1311 | BEGIN_FTR_SECTION | 1312 | BEGIN_FTR_SECTION |
| 1312 | PPC_MSGSYNC | 1313 | PPC_MSGSYNC |
| 1314 | lwsync | ||
| 1313 | END_FTR_SECTION_IFSET(CPU_FTR_ARCH_300) | 1315 | END_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 |
| 1416 | 3: std r11, VCPU_XIVE_SAVED_STATE(r9) | 1418 | 3: 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 | ||
| 1423 | 1: | 1426 | 1: |
| 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 |
| 2794 | BEGIN_FTR_SECTION | ||
| 2795 | PPC_MSGSYNC | ||
| 2796 | lwsync | ||
| 2797 | END_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; |
