KVM: PPC: Book3S HV P9: Move SPR loading after expiry time check
authorNicholas Piggin <npiggin@gmail.com>
Fri, 28 May 2021 09:07:38 +0000 (19:07 +1000)
committerMichael Ellerman <mpe@ellerman.id.au>
Thu, 10 Jun 2021 12:12:14 +0000 (22:12 +1000)
This is wasted work if the time limit is exceeded.

Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20210528090752.3542186-19-npiggin@gmail.com
arch/powerpc/kvm/book3s_hv_p9_entry.c

index 8a56141..f24a126 100644 (file)
@@ -123,21 +123,16 @@ int kvmhv_vcpu_entry_p9(struct kvm_vcpu *vcpu, u64 time_limit, unsigned long lpc
        u64 tb, purr, spurr;
        u64 *exsave;
        bool ri_set;
-       unsigned long msr = mfmsr();
        int trap;
-       unsigned long host_hfscr = mfspr(SPRN_HFSCR);
-       unsigned long host_ciabr = mfspr(SPRN_CIABR);
-       unsigned long host_dawr0 = mfspr(SPRN_DAWR0);
-       unsigned long host_dawrx0 = mfspr(SPRN_DAWRX0);
-       unsigned long host_psscr = mfspr(SPRN_PSSCR);
-       unsigned long host_pidr = mfspr(SPRN_PID);
-       unsigned long host_dawr1 = 0;
-       unsigned long host_dawrx1 = 0;
-
-       if (cpu_has_feature(CPU_FTR_DAWR1)) {
-               host_dawr1 = mfspr(SPRN_DAWR1);
-               host_dawrx1 = mfspr(SPRN_DAWRX1);
-       }
+       unsigned long msr;
+       unsigned long host_hfscr;
+       unsigned long host_ciabr;
+       unsigned long host_dawr0;
+       unsigned long host_dawrx0;
+       unsigned long host_psscr;
+       unsigned long host_pidr;
+       unsigned long host_dawr1;
+       unsigned long host_dawrx1;
 
        hdec = time_limit - mftb();
        if (hdec < 0)
@@ -154,6 +149,19 @@ int kvmhv_vcpu_entry_p9(struct kvm_vcpu *vcpu, u64 time_limit, unsigned long lpc
                vc->tb_offset_applied = vc->tb_offset;
        }
 
+       msr = mfmsr();
+
+       host_hfscr = mfspr(SPRN_HFSCR);
+       host_ciabr = mfspr(SPRN_CIABR);
+       host_dawr0 = mfspr(SPRN_DAWR0);
+       host_dawrx0 = mfspr(SPRN_DAWRX0);
+       host_psscr = mfspr(SPRN_PSSCR);
+       host_pidr = mfspr(SPRN_PID);
+       if (cpu_has_feature(CPU_FTR_DAWR1)) {
+               host_dawr1 = mfspr(SPRN_DAWR1);
+               host_dawrx1 = mfspr(SPRN_DAWRX1);
+       }
+
        if (vc->pcr)
                mtspr(SPRN_PCR, vc->pcr | PCR_MASK);
        mtspr(SPRN_DPDES, vc->dpdes);