Loading arch/powerpc/kvm/book3s_64_vio.c +14 −9 Original line number Diff line number Diff line Loading @@ -478,28 +478,30 @@ long kvmppc_h_put_tce(struct kvm_vcpu *vcpu, unsigned long liobn, return ret; dir = iommu_tce_direction(tce); idx = srcu_read_lock(&vcpu->kvm->srcu); if ((dir != DMA_NONE) && kvmppc_gpa_to_ua(vcpu->kvm, tce & ~(TCE_PCI_READ | TCE_PCI_WRITE), &ua, NULL)) return H_PARAMETER; tce & ~(TCE_PCI_READ | TCE_PCI_WRITE), &ua, NULL)) { ret = H_PARAMETER; goto unlock_exit; } entry = ioba >> stt->page_shift; list_for_each_entry_lockless(stit, &stt->iommu_tables, next) { if (dir == DMA_NONE) { if (dir == DMA_NONE) ret = kvmppc_tce_iommu_unmap(vcpu->kvm, stit->tbl, entry); } else { idx = srcu_read_lock(&vcpu->kvm->srcu); else ret = kvmppc_tce_iommu_map(vcpu->kvm, stit->tbl, entry, ua, dir); srcu_read_unlock(&vcpu->kvm->srcu, idx); } if (ret == H_SUCCESS) continue; if (ret == H_TOO_HARD) return ret; goto unlock_exit; WARN_ON_ONCE(1); kvmppc_clear_tce(stit->tbl, entry); Loading @@ -507,7 +509,10 @@ long kvmppc_h_put_tce(struct kvm_vcpu *vcpu, unsigned long liobn, kvmppc_tce_put(stt, entry, tce); return H_SUCCESS; unlock_exit: srcu_read_unlock(&vcpu->kvm->srcu, idx); return ret; } EXPORT_SYMBOL_GPL(kvmppc_h_put_tce); Loading arch/powerpc/kvm/book3s_hv_rmhandlers.S +10 −3 Original line number Diff line number Diff line Loading @@ -989,13 +989,14 @@ ALT_FTR_SECTION_END_IFCLR(CPU_FTR_ARCH_300) beq no_xive ld r11, VCPU_XIVE_SAVED_STATE(r4) li r9, TM_QW1_OS stdcix r11,r9,r10 eieio stdcix r11,r9,r10 lwz r11, VCPU_XIVE_CAM_WORD(r4) li r9, TM_QW1_OS + TM_WORD2 stwcix r11,r9,r10 li r9, 1 stw r9, VCPU_XIVE_PUSHED(r4) eieio no_xive: #endif /* CONFIG_KVM_XICS */ Loading Loading @@ -1310,6 +1311,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR) bne 3f BEGIN_FTR_SECTION PPC_MSGSYNC lwsync END_FTR_SECTION_IFSET(CPU_FTR_ARCH_300) lbz r0, HSTATE_HOST_IPI(r13) cmpwi r0, 0 Loading Loading @@ -1400,8 +1402,8 @@ guest_exit_cont: /* r9 = vcpu, r12 = trap, r13 = paca */ cmpldi cr0, r10, 0 beq 1f /* First load to pull the context, we ignore the value */ lwzx r11, r7, r10 eieio lwzx r11, r7, r10 /* Second load to recover the context state (Words 0 and 1) */ ldx r11, r6, r10 b 3f Loading @@ -1409,8 +1411,8 @@ guest_exit_cont: /* r9 = vcpu, r12 = trap, r13 = paca */ cmpldi cr0, r10, 0 beq 1f /* First load to pull the context, we ignore the value */ lwzcix r11, r7, r10 eieio lwzcix r11, r7, r10 /* Second load to recover the context state (Words 0 and 1) */ ldcix r11, r6, r10 3: std r11, VCPU_XIVE_SAVED_STATE(r9) Loading @@ -1420,6 +1422,7 @@ guest_exit_cont: /* r9 = vcpu, r12 = trap, r13 = paca */ stw r10, VCPU_XIVE_PUSHED(r9) stb r10, (VCPU_XIVE_SAVED_STATE+3)(r9) stb r0, (VCPU_XIVE_SAVED_STATE+4)(r9) eieio 1: #endif /* CONFIG_KVM_XICS */ /* Save more register state */ Loading Loading @@ -2788,6 +2791,10 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S) PPC_MSGCLR(6) /* see if it's a host IPI */ li r3, 1 BEGIN_FTR_SECTION PPC_MSGSYNC lwsync END_FTR_SECTION_IFSET(CPU_FTR_ARCH_300) lbz r0, HSTATE_HOST_IPI(r13) cmpwi r0, 0 bnelr Loading arch/powerpc/kvm/powerpc.c +1 −2 Original line number Diff line number Diff line Loading @@ -644,8 +644,7 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext) break; #endif case KVM_CAP_PPC_HTM: r = cpu_has_feature(CPU_FTR_TM_COMP) && is_kvmppc_hv_enabled(kvm); r = cpu_has_feature(CPU_FTR_TM_COMP) && hv_enabled; break; default: r = 0; Loading Loading
arch/powerpc/kvm/book3s_64_vio.c +14 −9 Original line number Diff line number Diff line Loading @@ -478,28 +478,30 @@ long kvmppc_h_put_tce(struct kvm_vcpu *vcpu, unsigned long liobn, return ret; dir = iommu_tce_direction(tce); idx = srcu_read_lock(&vcpu->kvm->srcu); if ((dir != DMA_NONE) && kvmppc_gpa_to_ua(vcpu->kvm, tce & ~(TCE_PCI_READ | TCE_PCI_WRITE), &ua, NULL)) return H_PARAMETER; tce & ~(TCE_PCI_READ | TCE_PCI_WRITE), &ua, NULL)) { ret = H_PARAMETER; goto unlock_exit; } entry = ioba >> stt->page_shift; list_for_each_entry_lockless(stit, &stt->iommu_tables, next) { if (dir == DMA_NONE) { if (dir == DMA_NONE) ret = kvmppc_tce_iommu_unmap(vcpu->kvm, stit->tbl, entry); } else { idx = srcu_read_lock(&vcpu->kvm->srcu); else ret = kvmppc_tce_iommu_map(vcpu->kvm, stit->tbl, entry, ua, dir); srcu_read_unlock(&vcpu->kvm->srcu, idx); } if (ret == H_SUCCESS) continue; if (ret == H_TOO_HARD) return ret; goto unlock_exit; WARN_ON_ONCE(1); kvmppc_clear_tce(stit->tbl, entry); Loading @@ -507,7 +509,10 @@ long kvmppc_h_put_tce(struct kvm_vcpu *vcpu, unsigned long liobn, kvmppc_tce_put(stt, entry, tce); return H_SUCCESS; unlock_exit: srcu_read_unlock(&vcpu->kvm->srcu, idx); return ret; } EXPORT_SYMBOL_GPL(kvmppc_h_put_tce); Loading
arch/powerpc/kvm/book3s_hv_rmhandlers.S +10 −3 Original line number Diff line number Diff line Loading @@ -989,13 +989,14 @@ ALT_FTR_SECTION_END_IFCLR(CPU_FTR_ARCH_300) beq no_xive ld r11, VCPU_XIVE_SAVED_STATE(r4) li r9, TM_QW1_OS stdcix r11,r9,r10 eieio stdcix r11,r9,r10 lwz r11, VCPU_XIVE_CAM_WORD(r4) li r9, TM_QW1_OS + TM_WORD2 stwcix r11,r9,r10 li r9, 1 stw r9, VCPU_XIVE_PUSHED(r4) eieio no_xive: #endif /* CONFIG_KVM_XICS */ Loading Loading @@ -1310,6 +1311,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR) bne 3f BEGIN_FTR_SECTION PPC_MSGSYNC lwsync END_FTR_SECTION_IFSET(CPU_FTR_ARCH_300) lbz r0, HSTATE_HOST_IPI(r13) cmpwi r0, 0 Loading Loading @@ -1400,8 +1402,8 @@ guest_exit_cont: /* r9 = vcpu, r12 = trap, r13 = paca */ cmpldi cr0, r10, 0 beq 1f /* First load to pull the context, we ignore the value */ lwzx r11, r7, r10 eieio lwzx r11, r7, r10 /* Second load to recover the context state (Words 0 and 1) */ ldx r11, r6, r10 b 3f Loading @@ -1409,8 +1411,8 @@ guest_exit_cont: /* r9 = vcpu, r12 = trap, r13 = paca */ cmpldi cr0, r10, 0 beq 1f /* First load to pull the context, we ignore the value */ lwzcix r11, r7, r10 eieio lwzcix r11, r7, r10 /* Second load to recover the context state (Words 0 and 1) */ ldcix r11, r6, r10 3: std r11, VCPU_XIVE_SAVED_STATE(r9) Loading @@ -1420,6 +1422,7 @@ guest_exit_cont: /* r9 = vcpu, r12 = trap, r13 = paca */ stw r10, VCPU_XIVE_PUSHED(r9) stb r10, (VCPU_XIVE_SAVED_STATE+3)(r9) stb r0, (VCPU_XIVE_SAVED_STATE+4)(r9) eieio 1: #endif /* CONFIG_KVM_XICS */ /* Save more register state */ Loading Loading @@ -2788,6 +2791,10 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S) PPC_MSGCLR(6) /* see if it's a host IPI */ li r3, 1 BEGIN_FTR_SECTION PPC_MSGSYNC lwsync END_FTR_SECTION_IFSET(CPU_FTR_ARCH_300) lbz r0, HSTATE_HOST_IPI(r13) cmpwi r0, 0 bnelr Loading
arch/powerpc/kvm/powerpc.c +1 −2 Original line number Diff line number Diff line Loading @@ -644,8 +644,7 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext) break; #endif case KVM_CAP_PPC_HTM: r = cpu_has_feature(CPU_FTR_TM_COMP) && is_kvmppc_hv_enabled(kvm); r = cpu_has_feature(CPU_FTR_TM_COMP) && hv_enabled; break; default: r = 0; Loading