Message ID | 20210305150638.2675513-18-npiggin@gmail.com (mailing list archive) |
---|---|
State | Changes Requested |
Headers | show |
Series | KVM: PPC: Book3S: C-ify the P9 entry/exit code | expand |
Related | show |
Context | Check | Description |
---|---|---|
snowpatch_ozlabs/apply_patch | warning | Failed to apply on branch powerpc/merge (91966823812efbd175f904599e5cf2a854b39809) |
snowpatch_ozlabs/apply_patch | warning | Failed to apply on branch powerpc/next (fe07bfda2fb9cdef8a4d4008a409bb02f35f1bd8) |
snowpatch_ozlabs/apply_patch | warning | Failed to apply on branch linus/master (280d542f6ffac0e6d65dc267f92191d509b13b64) |
snowpatch_ozlabs/apply_patch | warning | Failed to apply on branch powerpc/fixes (5c88a17e15795226b56d83f579cbb9b7a4864f79) |
snowpatch_ozlabs/apply_patch | warning | Failed to apply on branch linux-next (7a7fd0de4a9804299793e564a555a49c1fc924cb) |
snowpatch_ozlabs/apply_patch | fail | Failed to apply to any branch |
On 06/03/2021 02:06, Nicholas Piggin wrote: > This is more symmetric with kvmppc_xive_push_vcpu. The extra test in > the asm will go away in a later change. > > Signed-off-by: Nicholas Piggin <npiggin@gmail.com> > --- > arch/powerpc/include/asm/kvm_ppc.h | 2 ++ > arch/powerpc/kvm/book3s_hv.c | 2 ++ > arch/powerpc/kvm/book3s_hv_rmhandlers.S | 5 ++++ > arch/powerpc/kvm/book3s_xive.c | 31 +++++++++++++++++++++++++ > 4 files changed, 40 insertions(+) > > diff --git a/arch/powerpc/include/asm/kvm_ppc.h b/arch/powerpc/include/asm/kvm_ppc.h > index 9531b1c1b190..73b1ca5a6471 100644 > --- a/arch/powerpc/include/asm/kvm_ppc.h > +++ b/arch/powerpc/include/asm/kvm_ppc.h > @@ -672,6 +672,7 @@ extern int kvmppc_xive_set_icp(struct kvm_vcpu *vcpu, u64 icpval); > extern int kvmppc_xive_set_irq(struct kvm *kvm, int irq_source_id, u32 irq, > int level, bool line_status); > extern void kvmppc_xive_push_vcpu(struct kvm_vcpu *vcpu); > +extern void kvmppc_xive_pull_vcpu(struct kvm_vcpu *vcpu); > > static inline int kvmppc_xive_enabled(struct kvm_vcpu *vcpu) > { > @@ -712,6 +713,7 @@ static inline int kvmppc_xive_set_icp(struct kvm_vcpu *vcpu, u64 icpval) { retur > static inline int kvmppc_xive_set_irq(struct kvm *kvm, int irq_source_id, u32 irq, > int level, bool line_status) { return -ENODEV; } > static inline void kvmppc_xive_push_vcpu(struct kvm_vcpu *vcpu) { } > +static inline void kvmppc_xive_pull_vcpu(struct kvm_vcpu *vcpu) { } > > static inline int kvmppc_xive_enabled(struct kvm_vcpu *vcpu) > { return 0; } > diff --git a/arch/powerpc/kvm/book3s_hv.c b/arch/powerpc/kvm/book3s_hv.c > index b9cae42b9cd5..b265522fc467 100644 > --- a/arch/powerpc/kvm/book3s_hv.c > +++ b/arch/powerpc/kvm/book3s_hv.c > @@ -3565,6 +3565,8 @@ static int kvmhv_load_hv_regs_and_go(struct kvm_vcpu *vcpu, u64 time_limit, > > trap = __kvmhv_vcpu_entry_p9(vcpu); > > + kvmppc_xive_pull_vcpu(vcpu); > + > /* Advance host PURR/SPURR by the amount used by guest */ > purr = mfspr(SPRN_PURR); > spurr = mfspr(SPRN_SPURR); > diff --git a/arch/powerpc/kvm/book3s_hv_rmhandlers.S b/arch/powerpc/kvm/book3s_hv_rmhandlers.S > index 75405ef53238..c11597f815e4 100644 > --- a/arch/powerpc/kvm/book3s_hv_rmhandlers.S > +++ b/arch/powerpc/kvm/book3s_hv_rmhandlers.S > @@ -1442,6 +1442,11 @@ guest_exit_cont: /* r9 = vcpu, r12 = trap, r13 = paca */ > bl kvmhv_accumulate_time > #endif > #ifdef CONFIG_KVM_XICS > + /* If we came in through the P9 short path, xive pull is done in C */ > + lwz r0, STACK_SLOT_SHORT_PATH(r1) > + cmpwi r0, 0 > + bne 1f > + > /* We are exiting, pull the VP from the XIVE */ > lbz r0, VCPU_XIVE_PUSHED(r9) > cmpwi cr0, r0, 0 > diff --git a/arch/powerpc/kvm/book3s_xive.c b/arch/powerpc/kvm/book3s_xive.c > index e7219b6f5f9a..52cdb9e2660a 100644 > --- a/arch/powerpc/kvm/book3s_xive.c > +++ b/arch/powerpc/kvm/book3s_xive.c > @@ -127,6 +127,37 @@ void kvmppc_xive_push_vcpu(struct kvm_vcpu *vcpu) > } > EXPORT_SYMBOL_GPL(kvmppc_xive_push_vcpu); > > +/* > + * Pull a vcpu's context from the XIVE on guest exit. > + * This assumes we are in virtual mode (MMU on) > + */ > +void kvmppc_xive_pull_vcpu(struct kvm_vcpu *vcpu) > +{ > + void __iomem *tima = local_paca->kvm_hstate.xive_tima_virt; > + > + if (!vcpu->arch.xive_pushed) > + return; > + > + /* > + * Sould not have been pushed if there is no tima s/Sould/Should/ Otherwise good Reviewed-by: Alexey Kardashevskiy <aik@ozlabs.ru> > + */ > + if (WARN_ON(!tima)) > + return; > + > + eieio(); > + /* First load to pull the context, we ignore the value */ > + __raw_readl(tima + TM_SPC_PULL_OS_CTX); > + /* Second load to recover the context state (Words 0 and 1) */ > + vcpu->arch.xive_saved_state.w01 = __raw_readq(tima + TM_QW1_OS); > + > + /* Fixup some of the state for the next load */ > + vcpu->arch.xive_saved_state.lsmfb = 0; > + vcpu->arch.xive_saved_state.ack = 0xff; > + vcpu->arch.xive_pushed = 0; > + eieio(); > +} > +EXPORT_SYMBOL_GPL(kvmppc_xive_pull_vcpu); > + > /* > * This is a simple trigger for a generic XIVE IRQ. This must > * only be called for interrupts that support a trigger page >
On 3/5/21 4:06 PM, Nicholas Piggin wrote: > This is more symmetric with kvmppc_xive_push_vcpu. The extra test in > the asm will go away in a later change. > > Signed-off-by: Nicholas Piggin <npiggin@gmail.com> Reviewed-by: Cédric Le Goater <clg@kaod.org> > --- > arch/powerpc/include/asm/kvm_ppc.h | 2 ++ > arch/powerpc/kvm/book3s_hv.c | 2 ++ > arch/powerpc/kvm/book3s_hv_rmhandlers.S | 5 ++++ > arch/powerpc/kvm/book3s_xive.c | 31 +++++++++++++++++++++++++ > 4 files changed, 40 insertions(+) > > diff --git a/arch/powerpc/include/asm/kvm_ppc.h b/arch/powerpc/include/asm/kvm_ppc.h > index 9531b1c1b190..73b1ca5a6471 100644 > --- a/arch/powerpc/include/asm/kvm_ppc.h > +++ b/arch/powerpc/include/asm/kvm_ppc.h > @@ -672,6 +672,7 @@ extern int kvmppc_xive_set_icp(struct kvm_vcpu *vcpu, u64 icpval); > extern int kvmppc_xive_set_irq(struct kvm *kvm, int irq_source_id, u32 irq, > int level, bool line_status); > extern void kvmppc_xive_push_vcpu(struct kvm_vcpu *vcpu); > +extern void kvmppc_xive_pull_vcpu(struct kvm_vcpu *vcpu); > > static inline int kvmppc_xive_enabled(struct kvm_vcpu *vcpu) > { > @@ -712,6 +713,7 @@ static inline int kvmppc_xive_set_icp(struct kvm_vcpu *vcpu, u64 icpval) { retur > static inline int kvmppc_xive_set_irq(struct kvm *kvm, int irq_source_id, u32 irq, > int level, bool line_status) { return -ENODEV; } > static inline void kvmppc_xive_push_vcpu(struct kvm_vcpu *vcpu) { } > +static inline void kvmppc_xive_pull_vcpu(struct kvm_vcpu *vcpu) { } > > static inline int kvmppc_xive_enabled(struct kvm_vcpu *vcpu) > { return 0; } > diff --git a/arch/powerpc/kvm/book3s_hv.c b/arch/powerpc/kvm/book3s_hv.c > index b9cae42b9cd5..b265522fc467 100644 > --- a/arch/powerpc/kvm/book3s_hv.c > +++ b/arch/powerpc/kvm/book3s_hv.c > @@ -3565,6 +3565,8 @@ static int kvmhv_load_hv_regs_and_go(struct kvm_vcpu *vcpu, u64 time_limit, > > trap = __kvmhv_vcpu_entry_p9(vcpu); > > + kvmppc_xive_pull_vcpu(vcpu); > + > /* Advance host PURR/SPURR by the amount used by guest */ > purr = mfspr(SPRN_PURR); > spurr = mfspr(SPRN_SPURR); > diff --git a/arch/powerpc/kvm/book3s_hv_rmhandlers.S b/arch/powerpc/kvm/book3s_hv_rmhandlers.S > index 75405ef53238..c11597f815e4 100644 > --- a/arch/powerpc/kvm/book3s_hv_rmhandlers.S > +++ b/arch/powerpc/kvm/book3s_hv_rmhandlers.S > @@ -1442,6 +1442,11 @@ guest_exit_cont: /* r9 = vcpu, r12 = trap, r13 = paca */ > bl kvmhv_accumulate_time > #endif > #ifdef CONFIG_KVM_XICS > + /* If we came in through the P9 short path, xive pull is done in C */ > + lwz r0, STACK_SLOT_SHORT_PATH(r1) > + cmpwi r0, 0 > + bne 1f > + > /* We are exiting, pull the VP from the XIVE */ > lbz r0, VCPU_XIVE_PUSHED(r9) > cmpwi cr0, r0, 0 > diff --git a/arch/powerpc/kvm/book3s_xive.c b/arch/powerpc/kvm/book3s_xive.c > index e7219b6f5f9a..52cdb9e2660a 100644 > --- a/arch/powerpc/kvm/book3s_xive.c > +++ b/arch/powerpc/kvm/book3s_xive.c > @@ -127,6 +127,37 @@ void kvmppc_xive_push_vcpu(struct kvm_vcpu *vcpu) > } > EXPORT_SYMBOL_GPL(kvmppc_xive_push_vcpu); > > +/* > + * Pull a vcpu's context from the XIVE on guest exit. > + * This assumes we are in virtual mode (MMU on) should we add an assert on is_rm() ? > + */ > +void kvmppc_xive_pull_vcpu(struct kvm_vcpu *vcpu) > +{ > + void __iomem *tima = local_paca->kvm_hstate.xive_tima_virt; > + > + if (!vcpu->arch.xive_pushed) > + return; > + > + /* > + * Sould not have been pushed if there is no tima > + */ > + if (WARN_ON(!tima)) > + return; > + > + eieio(); > + /* First load to pull the context, we ignore the value */ > + __raw_readl(tima + TM_SPC_PULL_OS_CTX); > + /* Second load to recover the context state (Words 0 and 1) */ > + vcpu->arch.xive_saved_state.w01 = __raw_readq(tima + TM_QW1_OS); > + > + /* Fixup some of the state for the next load */ > + vcpu->arch.xive_saved_state.lsmfb = 0; > + vcpu->arch.xive_saved_state.ack = 0xff; > + vcpu->arch.xive_pushed = 0; > + eieio(); > +} > +EXPORT_SYMBOL_GPL(kvmppc_xive_pull_vcpu); > + > /* > * This is a simple trigger for a generic XIVE IRQ. This must > * only be called for interrupts that support a trigger page >
Excerpts from Cédric Le Goater's message of March 23, 2021 2:19 am: > On 3/5/21 4:06 PM, Nicholas Piggin wrote: >> This is more symmetric with kvmppc_xive_push_vcpu. The extra test in >> the asm will go away in a later change. >> >> Signed-off-by: Nicholas Piggin <npiggin@gmail.com> > > Reviewed-by: Cédric Le Goater <clg@kaod.org> >> diff --git a/arch/powerpc/kvm/book3s_xive.c b/arch/powerpc/kvm/book3s_xive.c >> index e7219b6f5f9a..52cdb9e2660a 100644 >> --- a/arch/powerpc/kvm/book3s_xive.c >> +++ b/arch/powerpc/kvm/book3s_xive.c >> @@ -127,6 +127,37 @@ void kvmppc_xive_push_vcpu(struct kvm_vcpu *vcpu) >> } >> EXPORT_SYMBOL_GPL(kvmppc_xive_push_vcpu); >> >> +/* >> + * Pull a vcpu's context from the XIVE on guest exit. >> + * This assumes we are in virtual mode (MMU on) > > should we add an assert on is_rm() ? I thought the same thing at first, but I think it should be okay. kvmppc_xive_push_cpu does not have an assert, and in the next patch the push and pull get moved out to where it is much clearer to see the MMU is on. Thanks, Nick
diff --git a/arch/powerpc/include/asm/kvm_ppc.h b/arch/powerpc/include/asm/kvm_ppc.h index 9531b1c1b190..73b1ca5a6471 100644 --- a/arch/powerpc/include/asm/kvm_ppc.h +++ b/arch/powerpc/include/asm/kvm_ppc.h @@ -672,6 +672,7 @@ extern int kvmppc_xive_set_icp(struct kvm_vcpu *vcpu, u64 icpval); extern int kvmppc_xive_set_irq(struct kvm *kvm, int irq_source_id, u32 irq, int level, bool line_status); extern void kvmppc_xive_push_vcpu(struct kvm_vcpu *vcpu); +extern void kvmppc_xive_pull_vcpu(struct kvm_vcpu *vcpu); static inline int kvmppc_xive_enabled(struct kvm_vcpu *vcpu) { @@ -712,6 +713,7 @@ static inline int kvmppc_xive_set_icp(struct kvm_vcpu *vcpu, u64 icpval) { retur static inline int kvmppc_xive_set_irq(struct kvm *kvm, int irq_source_id, u32 irq, int level, bool line_status) { return -ENODEV; } static inline void kvmppc_xive_push_vcpu(struct kvm_vcpu *vcpu) { } +static inline void kvmppc_xive_pull_vcpu(struct kvm_vcpu *vcpu) { } static inline int kvmppc_xive_enabled(struct kvm_vcpu *vcpu) { return 0; } diff --git a/arch/powerpc/kvm/book3s_hv.c b/arch/powerpc/kvm/book3s_hv.c index b9cae42b9cd5..b265522fc467 100644 --- a/arch/powerpc/kvm/book3s_hv.c +++ b/arch/powerpc/kvm/book3s_hv.c @@ -3565,6 +3565,8 @@ static int kvmhv_load_hv_regs_and_go(struct kvm_vcpu *vcpu, u64 time_limit, trap = __kvmhv_vcpu_entry_p9(vcpu); + kvmppc_xive_pull_vcpu(vcpu); + /* Advance host PURR/SPURR by the amount used by guest */ purr = mfspr(SPRN_PURR); spurr = mfspr(SPRN_SPURR); diff --git a/arch/powerpc/kvm/book3s_hv_rmhandlers.S b/arch/powerpc/kvm/book3s_hv_rmhandlers.S index 75405ef53238..c11597f815e4 100644 --- a/arch/powerpc/kvm/book3s_hv_rmhandlers.S +++ b/arch/powerpc/kvm/book3s_hv_rmhandlers.S @@ -1442,6 +1442,11 @@ guest_exit_cont: /* r9 = vcpu, r12 = trap, r13 = paca */ bl kvmhv_accumulate_time #endif #ifdef CONFIG_KVM_XICS + /* If we came in through the P9 short path, xive pull is done in C */ + lwz r0, STACK_SLOT_SHORT_PATH(r1) + cmpwi r0, 0 + bne 1f + /* We are exiting, pull the VP from the XIVE */ lbz r0, VCPU_XIVE_PUSHED(r9) cmpwi cr0, r0, 0 diff --git a/arch/powerpc/kvm/book3s_xive.c b/arch/powerpc/kvm/book3s_xive.c index e7219b6f5f9a..52cdb9e2660a 100644 --- a/arch/powerpc/kvm/book3s_xive.c +++ b/arch/powerpc/kvm/book3s_xive.c @@ -127,6 +127,37 @@ void kvmppc_xive_push_vcpu(struct kvm_vcpu *vcpu) } EXPORT_SYMBOL_GPL(kvmppc_xive_push_vcpu); +/* + * Pull a vcpu's context from the XIVE on guest exit. + * This assumes we are in virtual mode (MMU on) + */ +void kvmppc_xive_pull_vcpu(struct kvm_vcpu *vcpu) +{ + void __iomem *tima = local_paca->kvm_hstate.xive_tima_virt; + + if (!vcpu->arch.xive_pushed) + return; + + /* + * Sould not have been pushed if there is no tima + */ + if (WARN_ON(!tima)) + return; + + eieio(); + /* First load to pull the context, we ignore the value */ + __raw_readl(tima + TM_SPC_PULL_OS_CTX); + /* Second load to recover the context state (Words 0 and 1) */ + vcpu->arch.xive_saved_state.w01 = __raw_readq(tima + TM_QW1_OS); + + /* Fixup some of the state for the next load */ + vcpu->arch.xive_saved_state.lsmfb = 0; + vcpu->arch.xive_saved_state.ack = 0xff; + vcpu->arch.xive_pushed = 0; + eieio(); +} +EXPORT_SYMBOL_GPL(kvmppc_xive_pull_vcpu); + /* * This is a simple trigger for a generic XIVE IRQ. This must * only be called for interrupts that support a trigger page
This is more symmetric with kvmppc_xive_push_vcpu. The extra test in the asm will go away in a later change. Signed-off-by: Nicholas Piggin <npiggin@gmail.com> --- arch/powerpc/include/asm/kvm_ppc.h | 2 ++ arch/powerpc/kvm/book3s_hv.c | 2 ++ arch/powerpc/kvm/book3s_hv_rmhandlers.S | 5 ++++ arch/powerpc/kvm/book3s_xive.c | 31 +++++++++++++++++++++++++ 4 files changed, 40 insertions(+)