Skip to content

Commit cc9085b

Browse files
committed
Merge branch 'kvm-ppc-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc
Fix potential host oops and hangs.
2 parents 33d930e + ad98dd1 commit cc9085b

3 files changed

Lines changed: 25 additions & 14 deletions

File tree

arch/powerpc/kvm/book3s_64_vio.c

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -478,36 +478,41 @@ long kvmppc_h_put_tce(struct kvm_vcpu *vcpu, unsigned long liobn,
478478
return ret;
479479

480480
dir = iommu_tce_direction(tce);
481+
482+
idx = srcu_read_lock(&vcpu->kvm->srcu);
483+
481484
if ((dir != DMA_NONE) && kvmppc_gpa_to_ua(vcpu->kvm,
482-
tce & ~(TCE_PCI_READ | TCE_PCI_WRITE), &ua, NULL))
483-
return H_PARAMETER;
485+
tce & ~(TCE_PCI_READ | TCE_PCI_WRITE), &ua, NULL)) {
486+
ret = H_PARAMETER;
487+
goto unlock_exit;
488+
}
484489

485490
entry = ioba >> stt->page_shift;
486491

487492
list_for_each_entry_lockless(stit, &stt->iommu_tables, next) {
488-
if (dir == DMA_NONE) {
493+
if (dir == DMA_NONE)
489494
ret = kvmppc_tce_iommu_unmap(vcpu->kvm,
490495
stit->tbl, entry);
491-
} else {
492-
idx = srcu_read_lock(&vcpu->kvm->srcu);
496+
else
493497
ret = kvmppc_tce_iommu_map(vcpu->kvm, stit->tbl,
494498
entry, ua, dir);
495-
srcu_read_unlock(&vcpu->kvm->srcu, idx);
496-
}
497499

498500
if (ret == H_SUCCESS)
499501
continue;
500502

501503
if (ret == H_TOO_HARD)
502-
return ret;
504+
goto unlock_exit;
503505

504506
WARN_ON_ONCE(1);
505507
kvmppc_clear_tce(stit->tbl, entry);
506508
}
507509

508510
kvmppc_tce_put(stt, entry, tce);
509511

510-
return H_SUCCESS;
512+
unlock_exit:
513+
srcu_read_unlock(&vcpu->kvm->srcu, idx);
514+
515+
return ret;
511516
}
512517
EXPORT_SYMBOL_GPL(kvmppc_h_put_tce);
513518

arch/powerpc/kvm/book3s_hv_rmhandlers.S

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -989,13 +989,14 @@ ALT_FTR_SECTION_END_IFCLR(CPU_FTR_ARCH_300)
989989
beq no_xive
990990
ld r11, VCPU_XIVE_SAVED_STATE(r4)
991991
li r9, TM_QW1_OS
992-
stdcix r11,r9,r10
993992
eieio
993+
stdcix r11,r9,r10
994994
lwz r11, VCPU_XIVE_CAM_WORD(r4)
995995
li r9, TM_QW1_OS + TM_WORD2
996996
stwcix r11,r9,r10
997997
li r9, 1
998998
stw r9, VCPU_XIVE_PUSHED(r4)
999+
eieio
9991000
no_xive:
10001001
#endif /* CONFIG_KVM_XICS */
10011002

@@ -1310,6 +1311,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR)
13101311
bne 3f
13111312
BEGIN_FTR_SECTION
13121313
PPC_MSGSYNC
1314+
lwsync
13131315
END_FTR_SECTION_IFSET(CPU_FTR_ARCH_300)
13141316
lbz r0, HSTATE_HOST_IPI(r13)
13151317
cmpwi r0, 0
@@ -1400,17 +1402,17 @@ guest_exit_cont: /* r9 = vcpu, r12 = trap, r13 = paca */
14001402
cmpldi cr0, r10, 0
14011403
beq 1f
14021404
/* First load to pull the context, we ignore the value */
1403-
lwzx r11, r7, r10
14041405
eieio
1406+
lwzx r11, r7, r10
14051407
/* Second load to recover the context state (Words 0 and 1) */
14061408
ldx r11, r6, r10
14071409
b 3f
14081410
2: ld r10, HSTATE_XIVE_TIMA_PHYS(r13)
14091411
cmpldi cr0, r10, 0
14101412
beq 1f
14111413
/* First load to pull the context, we ignore the value */
1412-
lwzcix r11, r7, r10
14131414
eieio
1415+
lwzcix r11, r7, r10
14141416
/* Second load to recover the context state (Words 0 and 1) */
14151417
ldcix r11, r6, r10
14161418
3: std r11, VCPU_XIVE_SAVED_STATE(r9)
@@ -1420,6 +1422,7 @@ guest_exit_cont: /* r9 = vcpu, r12 = trap, r13 = paca */
14201422
stw r10, VCPU_XIVE_PUSHED(r9)
14211423
stb r10, (VCPU_XIVE_SAVED_STATE+3)(r9)
14221424
stb r0, (VCPU_XIVE_SAVED_STATE+4)(r9)
1425+
eieio
14231426
1:
14241427
#endif /* CONFIG_KVM_XICS */
14251428
/* Save more register state */
@@ -2788,6 +2791,10 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S)
27882791
PPC_MSGCLR(6)
27892792
/* see if it's a host IPI */
27902793
li r3, 1
2794+
BEGIN_FTR_SECTION
2795+
PPC_MSGSYNC
2796+
lwsync
2797+
END_FTR_SECTION_IFSET(CPU_FTR_ARCH_300)
27912798
lbz r0, HSTATE_HOST_IPI(r13)
27922799
cmpwi r0, 0
27932800
bnelr

arch/powerpc/kvm/powerpc.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -644,8 +644,7 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext)
644644
break;
645645
#endif
646646
case KVM_CAP_PPC_HTM:
647-
r = cpu_has_feature(CPU_FTR_TM_COMP) &&
648-
is_kvmppc_hv_enabled(kvm);
647+
r = cpu_has_feature(CPU_FTR_TM_COMP) && hv_enabled;
649648
break;
650649
default:
651650
r = 0;

0 commit comments

Comments
 (0)