Message ID | 20171123043619.15301-11-benh@kernel.crashing.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Thu, Nov 23, 2017 at 03:36:19PM +1100, Benjamin Herrenschmidt wrote: > This shaves off a bunch of cycles from the KVM exit path > and the XIVE related hypercall. Comment below... > diff --git a/arch/powerpc/kvm/book3s_hv_rmhandlers.S b/arch/powerpc/kvm/book3s_hv_rmhandlers.S > index 83862fba8cfb..ade13f7a9077 100644 > --- a/arch/powerpc/kvm/book3s_hv_rmhandlers.S > +++ b/arch/powerpc/kvm/book3s_hv_rmhandlers.S > @@ -81,6 +81,8 @@ _GLOBAL_TOC(kvmppc_hv_entry_trampoline) > RFI > > kvmppc_call_hv_entry: > + li r0,0 > + stb r0,HSTATE_EXIT_VIRT(r13) Don't we need to clear HSTATE_EXIT_VIRT(r13) similarly in the entry path for offline secondary CPU threads, i.e. somewhere around the kvm_secondary_got_guest label? Paul.
On Sat, 2017-11-25 at 16:17 +1100, Paul Mackerras wrote: > On Thu, Nov 23, 2017 at 03:36:19PM +1100, Benjamin Herrenschmidt wrote: > > This shaves off a bunch of cycles from the KVM exit path > > and the XIVE related hypercall. > > Comment below... > > > diff --git a/arch/powerpc/kvm/book3s_hv_rmhandlers.S b/arch/powerpc/kvm/book3s_hv_rmhandlers.S > > index 83862fba8cfb..ade13f7a9077 100644 > > --- a/arch/powerpc/kvm/book3s_hv_rmhandlers.S > > +++ b/arch/powerpc/kvm/book3s_hv_rmhandlers.S > > @@ -81,6 +81,8 @@ _GLOBAL_TOC(kvmppc_hv_entry_trampoline) > > RFI > > > > kvmppc_call_hv_entry: > > + li r0,0 > > + stb r0,HSTATE_EXIT_VIRT(r13) > > Don't we need to clear HSTATE_EXIT_VIRT(r13) similarly in the entry > path for offline secondary CPU threads, i.e. somewhere around the > kvm_secondary_got_guest label? Quite possibly, I am not too familiar with that path. I'll have a look. Cheers, Ben.
diff --git a/arch/powerpc/kvm/book3s_hv_builtin.c b/arch/powerpc/kvm/book3s_hv_builtin.c index 90644db9d38e..45525b76b724 100644 --- a/arch/powerpc/kvm/book3s_hv_builtin.c +++ b/arch/powerpc/kvm/book3s_hv_builtin.c @@ -209,8 +209,7 @@ long kvmppc_h_random(struct kvm_vcpu *vcpu) { int r; - /* Only need to do the expensive mfmsr() on radix */ - if (kvm_is_radix(vcpu->kvm) && (mfmsr() & MSR_IR)) + if (local_paca->kvm_hstate.exit_virt) r = powernv_get_random_long(&vcpu->arch.gpr[4]); else r = powernv_get_random_real_mode(&vcpu->arch.gpr[4]); @@ -524,7 +523,7 @@ static long kvmppc_read_one_intr(bool *again) #ifdef CONFIG_KVM_XICS static inline bool is_rm(void) { - return !(mfmsr() & MSR_DR); + return !local_paca->kvm_hstate.exit_virt; } unsigned long kvmppc_rm_h_xirr(struct kvm_vcpu *vcpu) diff --git a/arch/powerpc/kvm/book3s_hv_rmhandlers.S b/arch/powerpc/kvm/book3s_hv_rmhandlers.S index 83862fba8cfb..ade13f7a9077 100644 --- a/arch/powerpc/kvm/book3s_hv_rmhandlers.S +++ b/arch/powerpc/kvm/book3s_hv_rmhandlers.S @@ -81,6 +81,8 @@ _GLOBAL_TOC(kvmppc_hv_entry_trampoline) RFI kvmppc_call_hv_entry: + li r0,0 + stb r0,HSTATE_EXIT_VIRT(r13) ld r4, HSTATE_KVM_VCPU(r13) bl kvmppc_hv_entry @@ -176,8 +178,8 @@ END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_300) * we will be in virtual mode at this point, which makes it a * little easier to get back to the caller. */ - mfmsr r0 - andi. r0, r0, MSR_IR /* in real mode? */ + lbz r0,HSTATE_EXIT_VIRT(r13) + cmpwi r0,0 bne .Lvirt_return /* RFI into the highmem handler */ @@ -1440,8 +1442,9 @@ guest_exit_cont: /* r9 = vcpu, r12 = trap, r13 = paca */ beq 1f li r7, TM_SPC_PULL_OS_CTX li r6, TM_QW1_OS - mfmsr r0 - andi. r0, r0, MSR_DR /* in real mode? */ + /* Are we in virtual or real mode ? */ + lbz r0,HSTATE_EXIT_VIRT(r13) + cmpwi r0,0 beq 2f ld r10, HSTATE_XIVE_TIMA_VIRT(r13) cmpldi cr0, r10, 0 @@ -2749,8 +2752,9 @@ kvm_cede_exit: stb r0, VCPU_CEDED(r9) 1: /* Enable XIVE escalation */ li r5, XIVE_ESB_SET_PQ_00 - mfmsr r0 - andi. r0, r0, MSR_DR /* in real mode? */ + /* Are we in virtual or real mode ? */ + lbz r0,HSTATE_EXIT_VIRT(r13) + cmpwi r0,0 beq 1f ld r10, VCPU_XIVE_ESC_VADDR(r9) cmpdi r10, 0
This shaves off a bunch of cycles from the KVM exit path and the XIVE related hypercall. Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> --- arch/powerpc/kvm/book3s_hv_builtin.c | 5 ++--- arch/powerpc/kvm/book3s_hv_rmhandlers.S | 16 ++++++++++------ 2 files changed, 12 insertions(+), 9 deletions(-)