mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson
synced 2025-09-01 15:14:52 +00:00
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:
parent
617326ff01
commit
6398326b9b
@ -761,6 +761,8 @@ static bool kvmppc_doorbell_pending(struct kvm_vcpu *vcpu)
|
|||||||
|
|
||||||
if (vcpu->arch.doorbell_request)
|
if (vcpu->arch.doorbell_request)
|
||||||
return true;
|
return true;
|
||||||
|
if (cpu_has_feature(CPU_FTR_ARCH_300))
|
||||||
|
return false;
|
||||||
/*
|
/*
|
||||||
* Ensure that the read of vcore->dpdes comes after the read
|
* Ensure that the read of vcore->dpdes comes after the read
|
||||||
* of vcpu->doorbell_request. This barrier matches the
|
* 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.
|
* either vcore->dpdes or doorbell_request.
|
||||||
* On POWER8, doorbell_request is 0.
|
* On POWER8, doorbell_request is 0.
|
||||||
*/
|
*/
|
||||||
*val = get_reg_val(id, vcpu->arch.vcore->dpdes |
|
if (cpu_has_feature(CPU_FTR_ARCH_300))
|
||||||
vcpu->arch.doorbell_request);
|
*val = get_reg_val(id, vcpu->arch.doorbell_request);
|
||||||
|
else
|
||||||
|
*val = get_reg_val(id, vcpu->arch.vcore->dpdes);
|
||||||
break;
|
break;
|
||||||
case KVM_REG_PPC_VTB:
|
case KVM_REG_PPC_VTB:
|
||||||
*val = get_reg_val(id, vcpu->arch.vcore->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);
|
vcpu->arch.pspb = set_reg_val(id, *val);
|
||||||
break;
|
break;
|
||||||
case KVM_REG_PPC_DPDES:
|
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;
|
break;
|
||||||
case KVM_REG_PPC_VTB:
|
case KVM_REG_PPC_VTB:
|
||||||
vcpu->arch.vcore->vtb = set_reg_val(id, *val);
|
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) {
|
if (!nested) {
|
||||||
kvmppc_core_prepare_to_enter(vcpu);
|
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,
|
if (test_bit(BOOK3S_IRQPRIO_EXTERNAL,
|
||||||
&vcpu->arch.pending_exceptions))
|
&vcpu->arch.pending_exceptions))
|
||||||
lpcr |= LPCR_MER;
|
lpcr |= LPCR_MER;
|
||||||
|
@ -649,6 +649,8 @@ void kvmppc_guest_entry_inject_int(struct kvm_vcpu *vcpu)
|
|||||||
int ext;
|
int ext;
|
||||||
unsigned long lpcr;
|
unsigned long lpcr;
|
||||||
|
|
||||||
|
WARN_ON_ONCE(cpu_has_feature(CPU_FTR_ARCH_300));
|
||||||
|
|
||||||
/* Insert EXTERNAL bit into LPCR at the MER bit position */
|
/* Insert EXTERNAL bit into LPCR at the MER bit position */
|
||||||
ext = (vcpu->arch.pending_exceptions >> BOOK3S_IRQPRIO_EXTERNAL) & 1;
|
ext = (vcpu->arch.pending_exceptions >> BOOK3S_IRQPRIO_EXTERNAL) & 1;
|
||||||
lpcr = mfspr(SPRN_LPCR);
|
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_pidr;
|
||||||
unsigned long host_dawr1;
|
unsigned long host_dawr1;
|
||||||
unsigned long host_dawrx1;
|
unsigned long host_dawrx1;
|
||||||
|
unsigned long dpdes;
|
||||||
|
|
||||||
hdec = time_limit - *tb;
|
hdec = time_limit - *tb;
|
||||||
if (hdec < 0)
|
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)
|
if (vc->pcr)
|
||||||
mtspr(SPRN_PCR, vc->pcr | PCR_MASK);
|
mtspr(SPRN_PCR, vc->pcr | PCR_MASK);
|
||||||
if (vc->dpdes)
|
if (vcpu->arch.doorbell_request) {
|
||||||
mtspr(SPRN_DPDES, vc->dpdes);
|
vcpu->arch.doorbell_request = 0;
|
||||||
|
mtspr(SPRN_DPDES, 1);
|
||||||
|
}
|
||||||
|
|
||||||
if (dawr_enabled()) {
|
if (dawr_enabled()) {
|
||||||
if (vcpu->arch.dawr0 != host_dawr0)
|
if (vcpu->arch.dawr0 != host_dawr0)
|
||||||
@ -1074,7 +1077,10 @@ int kvmhv_vcpu_entry_p9(struct kvm_vcpu *vcpu, u64 time_limit, unsigned long lpc
|
|||||||
vcpu->arch.shregs.sprg2 = mfspr(SPRN_SPRG2);
|
vcpu->arch.shregs.sprg2 = mfspr(SPRN_SPRG2);
|
||||||
vcpu->arch.shregs.sprg3 = mfspr(SPRN_SPRG3);
|
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);
|
vc->vtb = mfspr(SPRN_VTB);
|
||||||
|
|
||||||
dec = mfspr(SPRN_DEC);
|
dec = mfspr(SPRN_DEC);
|
||||||
@ -1136,7 +1142,7 @@ int kvmhv_vcpu_entry_p9(struct kvm_vcpu *vcpu, u64 time_limit, unsigned long lpc
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (vc->dpdes)
|
if (dpdes)
|
||||||
mtspr(SPRN_DPDES, 0);
|
mtspr(SPRN_DPDES, 0);
|
||||||
if (vc->pcr)
|
if (vc->pcr)
|
||||||
mtspr(SPRN_PCR, PCR_MASK);
|
mtspr(SPRN_PCR, PCR_MASK);
|
||||||
|
Loading…
Reference in New Issue
Block a user