KVM: PPC: Book3S HV P9: Stop using vc->dpdes
The P9 path uses vc->dpdes only for msgsndp / SMT emulation. This adds an ordering requirement between vcpu->doorbell_request and vc->dpdes for no real benefit. Use vcpu->doorbell_request directly. Signed-off-by: Nicholas Piggin <npiggin@gmail.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://lore.kernel.org/r/20211123095231.1036501-53-npiggin@gmail.com
This commit is contained in:
Родитель
617326ff01
Коммит
6398326b9b
|
@ -761,6 +761,8 @@ static bool kvmppc_doorbell_pending(struct kvm_vcpu *vcpu)
|
|||
|
||||
if (vcpu->arch.doorbell_request)
|
||||
return true;
|
||||
if (cpu_has_feature(CPU_FTR_ARCH_300))
|
||||
return false;
|
||||
/*
|
||||
* Ensure that the read of vcore->dpdes comes after the read
|
||||
* of vcpu->doorbell_request. This barrier matches the
|
||||
|
@ -2185,8 +2187,10 @@ static int kvmppc_get_one_reg_hv(struct kvm_vcpu *vcpu, u64 id,
|
|||
* either vcore->dpdes or doorbell_request.
|
||||
* On POWER8, doorbell_request is 0.
|
||||
*/
|
||||
*val = get_reg_val(id, vcpu->arch.vcore->dpdes |
|
||||
vcpu->arch.doorbell_request);
|
||||
if (cpu_has_feature(CPU_FTR_ARCH_300))
|
||||
*val = get_reg_val(id, vcpu->arch.doorbell_request);
|
||||
else
|
||||
*val = get_reg_val(id, vcpu->arch.vcore->dpdes);
|
||||
break;
|
||||
case KVM_REG_PPC_VTB:
|
||||
*val = get_reg_val(id, vcpu->arch.vcore->vtb);
|
||||
|
@ -2423,7 +2427,10 @@ static int kvmppc_set_one_reg_hv(struct kvm_vcpu *vcpu, u64 id,
|
|||
vcpu->arch.pspb = set_reg_val(id, *val);
|
||||
break;
|
||||
case KVM_REG_PPC_DPDES:
|
||||
vcpu->arch.vcore->dpdes = set_reg_val(id, *val);
|
||||
if (cpu_has_feature(CPU_FTR_ARCH_300))
|
||||
vcpu->arch.doorbell_request = set_reg_val(id, *val) & 1;
|
||||
else
|
||||
vcpu->arch.vcore->dpdes = set_reg_val(id, *val);
|
||||
break;
|
||||
case KVM_REG_PPC_VTB:
|
||||
vcpu->arch.vcore->vtb = set_reg_val(id, *val);
|
||||
|
@ -4491,11 +4498,6 @@ int kvmhv_run_single_vcpu(struct kvm_vcpu *vcpu, u64 time_limit,
|
|||
|
||||
if (!nested) {
|
||||
kvmppc_core_prepare_to_enter(vcpu);
|
||||
if (vcpu->arch.doorbell_request) {
|
||||
vc->dpdes = 1;
|
||||
smp_wmb();
|
||||
vcpu->arch.doorbell_request = 0;
|
||||
}
|
||||
if (test_bit(BOOK3S_IRQPRIO_EXTERNAL,
|
||||
&vcpu->arch.pending_exceptions))
|
||||
lpcr |= LPCR_MER;
|
||||
|
|
|
@ -649,6 +649,8 @@ void kvmppc_guest_entry_inject_int(struct kvm_vcpu *vcpu)
|
|||
int ext;
|
||||
unsigned long lpcr;
|
||||
|
||||
WARN_ON_ONCE(cpu_has_feature(CPU_FTR_ARCH_300));
|
||||
|
||||
/* Insert EXTERNAL bit into LPCR at the MER bit position */
|
||||
ext = (vcpu->arch.pending_exceptions >> BOOK3S_IRQPRIO_EXTERNAL) & 1;
|
||||
lpcr = mfspr(SPRN_LPCR);
|
||||
|
|
|
@ -780,6 +780,7 @@ int kvmhv_vcpu_entry_p9(struct kvm_vcpu *vcpu, u64 time_limit, unsigned long lpc
|
|||
unsigned long host_pidr;
|
||||
unsigned long host_dawr1;
|
||||
unsigned long host_dawrx1;
|
||||
unsigned long dpdes;
|
||||
|
||||
hdec = time_limit - *tb;
|
||||
if (hdec < 0)
|
||||
|
@ -842,8 +843,10 @@ int kvmhv_vcpu_entry_p9(struct kvm_vcpu *vcpu, u64 time_limit, unsigned long lpc
|
|||
|
||||
if (vc->pcr)
|
||||
mtspr(SPRN_PCR, vc->pcr | PCR_MASK);
|
||||
if (vc->dpdes)
|
||||
mtspr(SPRN_DPDES, vc->dpdes);
|
||||
if (vcpu->arch.doorbell_request) {
|
||||
vcpu->arch.doorbell_request = 0;
|
||||
mtspr(SPRN_DPDES, 1);
|
||||
}
|
||||
|
||||
if (dawr_enabled()) {
|
||||
if (vcpu->arch.dawr0 != host_dawr0)
|
||||
|
@ -1074,7 +1077,10 @@ tm_return_to_guest:
|
|||
vcpu->arch.shregs.sprg2 = mfspr(SPRN_SPRG2);
|
||||
vcpu->arch.shregs.sprg3 = mfspr(SPRN_SPRG3);
|
||||
|
||||
vc->dpdes = mfspr(SPRN_DPDES);
|
||||
dpdes = mfspr(SPRN_DPDES);
|
||||
if (dpdes)
|
||||
vcpu->arch.doorbell_request = 1;
|
||||
|
||||
vc->vtb = mfspr(SPRN_VTB);
|
||||
|
||||
dec = mfspr(SPRN_DEC);
|
||||
|
@ -1136,7 +1142,7 @@ tm_return_to_guest:
|
|||
}
|
||||
}
|
||||
|
||||
if (vc->dpdes)
|
||||
if (dpdes)
|
||||
mtspr(SPRN_DPDES, 0);
|
||||
if (vc->pcr)
|
||||
mtspr(SPRN_PCR, PCR_MASK);
|
||||
|
|
Загрузка…
Ссылка в новой задаче