KVM: PPC: Book3S HV P9: Stop using vc->dpdes
authorNicholas Piggin <npiggin@gmail.com>
Tue, 23 Nov 2021 09:52:30 +0000 (19:52 +1000)
committerMichael Ellerman <mpe@ellerman.id.au>
Wed, 24 Nov 2021 10:09:03 +0000 (21:09 +1100)
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
arch/powerpc/kvm/book3s_hv.c
arch/powerpc/kvm/book3s_hv_builtin.c
arch/powerpc/kvm/book3s_hv_p9_entry.c

index 2d59829..214481e 100644 (file)
@@ -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;
index ad70756..7d6d913 100644 (file)
@@ -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);
index 6120cdf..72119bc 100644 (file)
@@ -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);