Message ID | 20171117140807.22105-2-npiggin@gmail.com (mailing list archive) |
---|---|
State | Accepted |
Commit | 3d4fbffdd703d2b968db443911f2147c732a4a48 |
Headers | show |
Series | one more try at idle improvements | expand |
* Nicholas Piggin <npiggin@gmail.com> [2017-11-18 00:08:05]: > Implement a new function to invoke stop, power9_offline_stop, which is > like power9_idle_stop but used by the cpu hotplug code. > > Move KVM secondary state manipulation code to the offline case. > > Signed-off-by: Nicholas Piggin <npiggin@gmail.com> Reviewed-by: Vaidyanathan Srinivasan <svaidy@linux.vnet.ibm.com> > --- > arch/powerpc/include/asm/processor.h | 1 + > arch/powerpc/kernel/idle_book3s.S | 24 ++++++++++++++++++------ > arch/powerpc/platforms/powernv/idle.c | 2 +- > 3 files changed, 20 insertions(+), 7 deletions(-) > > diff --git a/arch/powerpc/include/asm/processor.h b/arch/powerpc/include/asm/processor.h > index bdab3b74eb98..0ebdb58460ce 100644 > --- a/arch/powerpc/include/asm/processor.h > +++ b/arch/powerpc/include/asm/processor.h > @@ -500,6 +500,7 @@ extern int powersave_nap; /* set if nap mode can be used in idle loop */ > extern unsigned long power7_idle_insn(unsigned long type); /* PNV_THREAD_NAP/etc*/ > extern void power7_idle_type(unsigned long type); > extern unsigned long power9_idle_stop(unsigned long psscr_val); > +extern unsigned long power9_offline_stop(unsigned long psscr_val); > extern void power9_idle_type(unsigned long stop_psscr_val, > unsigned long stop_psscr_mask); > > diff --git a/arch/powerpc/kernel/idle_book3s.S b/arch/powerpc/kernel/idle_book3s.S > index 01e1c1997893..2f8364e7b489 100644 > --- a/arch/powerpc/kernel/idle_book3s.S > +++ b/arch/powerpc/kernel/idle_book3s.S > @@ -325,12 +325,6 @@ enter_winkle: > * r3 - PSSCR value corresponding to the requested stop state. > */ > power_enter_stop: > -#ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE > - /* Tell KVM we're entering idle */ > - li r4,KVM_HWTHREAD_IN_IDLE > - /* DO THIS IN REAL MODE! See comment above. */ > - stb r4,HSTATE_HWTHREAD_STATE(r13) > -#endif > /* > * Check if we are executing the lite variant with ESL=EC=0 > */ > @@ -435,6 +429,24 @@ _GLOBAL(power9_idle_stop) > b pnv_powersave_common > /* No return */ > > +/* > + * Entered with MSR[EE]=0 and no soft-masked interrupts pending. > + * r3 contains desired PSSCR register value. > + */ > +_GLOBAL(power9_offline_stop) > + std r3, PACA_REQ_PSSCR(r13) > + mtspr SPRN_PSSCR,r3 > +#ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE > + /* Tell KVM we're entering idle */ > + li r4,KVM_HWTHREAD_IN_IDLE > + /* DO THIS IN REAL MODE! See comment above. */ > + stb r4,HSTATE_HWTHREAD_STATE(r13) > +#endif > + LOAD_REG_ADDR(r4,power_enter_stop) > + b pnv_powersave_common > + /* No return */ > + Good optimization. This code is needed only when an offline thread is wokenup at 0x100 to get into guest. Can be skipped in idle wakeup case. > + > /* > * On waking up from stop 0,1,2 with ESL=1 on POWER9 DD1, > * HSPRG0 will be set to the HSPRG0 value of one of the > diff --git a/arch/powerpc/platforms/powernv/idle.c b/arch/powerpc/platforms/powernv/idle.c > index 443d5ca71995..a921d5428d76 100644 > --- a/arch/powerpc/platforms/powernv/idle.c > +++ b/arch/powerpc/platforms/powernv/idle.c > @@ -434,7 +434,7 @@ unsigned long pnv_cpu_offline(unsigned int cpu) > psscr = mfspr(SPRN_PSSCR); > psscr = (psscr & ~pnv_deepest_stop_psscr_mask) | > pnv_deepest_stop_psscr_val; > - srr1 = power9_idle_stop(psscr); > + srr1 = power9_offline_stop(psscr); > > } else if ((idle_states & OPAL_PM_WINKLE_ENABLED) && > (idle_states & OPAL_PM_LOSE_FULL_CONTEXT)) { > -- > 2.15.0 >
On Fri, 2017-11-17 at 14:08:05 UTC, Nicholas Piggin wrote: > Implement a new function to invoke stop, power9_offline_stop, which is > like power9_idle_stop but used by the cpu hotplug code. > > Move KVM secondary state manipulation code to the offline case. > > Signed-off-by: Nicholas Piggin <npiggin@gmail.com> > Reviewed-by: Vaidyanathan Srinivasan <svaidy@linux.vnet.ibm.com> Applied to powerpc next, thanks. https://git.kernel.org/powerpc/c/3d4fbffdd703d2b968db443911f214 cheers
On Wed, 4 Apr 2018 02:03:18 +1000 (AEST) Michael Ellerman <patch-notifications@ellerman.id.au> wrote: > On Fri, 2017-11-17 at 14:08:05 UTC, Nicholas Piggin wrote: > > Implement a new function to invoke stop, power9_offline_stop, which is > > like power9_idle_stop but used by the cpu hotplug code. > > > > Move KVM secondary state manipulation code to the offline case. > > > > Signed-off-by: Nicholas Piggin <npiggin@gmail.com> > > Reviewed-by: Vaidyanathan Srinivasan <svaidy@linux.vnet.ibm.com> > > Applied to powerpc next, thanks. > > https://git.kernel.org/powerpc/c/3d4fbffdd703d2b968db443911f214 > > cheers I sent out a new series for this which is rebased and a bit cleaner. I probably wasn't clear enough about the change, sorry. This patch will need to be adjusted for the force SMT4 change. The end result should look like this, https://patchwork.ozlabs.org/patch/893948/ Thanks, Nick
Nicholas Piggin <npiggin@gmail.com> writes: > On Wed, 4 Apr 2018 02:03:18 +1000 (AEST) > Michael Ellerman <patch-notifications@ellerman.id.au> wrote: >> On Fri, 2017-11-17 at 14:08:05 UTC, Nicholas Piggin wrote: >> > Implement a new function to invoke stop, power9_offline_stop, which is >> > like power9_idle_stop but used by the cpu hotplug code. >> > >> > Move KVM secondary state manipulation code to the offline case. >> > >> > Signed-off-by: Nicholas Piggin <npiggin@gmail.com> >> > Reviewed-by: Vaidyanathan Srinivasan <svaidy@linux.vnet.ibm.com> >> >> Applied to powerpc next, thanks. >> >> https://git.kernel.org/powerpc/c/3d4fbffdd703d2b968db443911f214 > > I sent out a new series for this which is rebased and a bit cleaner. > I probably wasn't clear enough about the change, sorry. No that's OK, I just already had the previous series applied (partially) in my testing tree and didn't see the new series in time to back it out. > This patch will need to be adjusted for the force SMT4 change. The > end result should look like this, > > https://patchwork.ozlabs.org/patch/893948/ Thanks. I did a patch to get everything in sync, and confirmed the result is the same as applying your new series. cheers
diff --git a/arch/powerpc/include/asm/processor.h b/arch/powerpc/include/asm/processor.h index bdab3b74eb98..0ebdb58460ce 100644 --- a/arch/powerpc/include/asm/processor.h +++ b/arch/powerpc/include/asm/processor.h @@ -500,6 +500,7 @@ extern int powersave_nap; /* set if nap mode can be used in idle loop */ extern unsigned long power7_idle_insn(unsigned long type); /* PNV_THREAD_NAP/etc*/ extern void power7_idle_type(unsigned long type); extern unsigned long power9_idle_stop(unsigned long psscr_val); +extern unsigned long power9_offline_stop(unsigned long psscr_val); extern void power9_idle_type(unsigned long stop_psscr_val, unsigned long stop_psscr_mask); diff --git a/arch/powerpc/kernel/idle_book3s.S b/arch/powerpc/kernel/idle_book3s.S index 01e1c1997893..2f8364e7b489 100644 --- a/arch/powerpc/kernel/idle_book3s.S +++ b/arch/powerpc/kernel/idle_book3s.S @@ -325,12 +325,6 @@ enter_winkle: * r3 - PSSCR value corresponding to the requested stop state. */ power_enter_stop: -#ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE - /* Tell KVM we're entering idle */ - li r4,KVM_HWTHREAD_IN_IDLE - /* DO THIS IN REAL MODE! See comment above. */ - stb r4,HSTATE_HWTHREAD_STATE(r13) -#endif /* * Check if we are executing the lite variant with ESL=EC=0 */ @@ -435,6 +429,24 @@ _GLOBAL(power9_idle_stop) b pnv_powersave_common /* No return */ +/* + * Entered with MSR[EE]=0 and no soft-masked interrupts pending. + * r3 contains desired PSSCR register value. + */ +_GLOBAL(power9_offline_stop) + std r3, PACA_REQ_PSSCR(r13) + mtspr SPRN_PSSCR,r3 +#ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE + /* Tell KVM we're entering idle */ + li r4,KVM_HWTHREAD_IN_IDLE + /* DO THIS IN REAL MODE! See comment above. */ + stb r4,HSTATE_HWTHREAD_STATE(r13) +#endif + LOAD_REG_ADDR(r4,power_enter_stop) + b pnv_powersave_common + /* No return */ + + /* * On waking up from stop 0,1,2 with ESL=1 on POWER9 DD1, * HSPRG0 will be set to the HSPRG0 value of one of the diff --git a/arch/powerpc/platforms/powernv/idle.c b/arch/powerpc/platforms/powernv/idle.c index 443d5ca71995..a921d5428d76 100644 --- a/arch/powerpc/platforms/powernv/idle.c +++ b/arch/powerpc/platforms/powernv/idle.c @@ -434,7 +434,7 @@ unsigned long pnv_cpu_offline(unsigned int cpu) psscr = mfspr(SPRN_PSSCR); psscr = (psscr & ~pnv_deepest_stop_psscr_mask) | pnv_deepest_stop_psscr_val; - srr1 = power9_idle_stop(psscr); + srr1 = power9_offline_stop(psscr); } else if ((idle_states & OPAL_PM_WINKLE_ENABLED) && (idle_states & OPAL_PM_LOSE_FULL_CONTEXT)) {
Implement a new function to invoke stop, power9_offline_stop, which is like power9_idle_stop but used by the cpu hotplug code. Move KVM secondary state manipulation code to the offline case. Signed-off-by: Nicholas Piggin <npiggin@gmail.com> --- arch/powerpc/include/asm/processor.h | 1 + arch/powerpc/kernel/idle_book3s.S | 24 ++++++++++++++++++------ arch/powerpc/platforms/powernv/idle.c | 2 +- 3 files changed, 20 insertions(+), 7 deletions(-)