Commit b9ee31e1 authored by Nicholas Piggin's avatar Nicholas Piggin Committed by Michael Ellerman

powerpc/64s/idle: POWER9 ESL=0 stop avoid save/restore overhead

When stop is executed with EC=ESL=0, it appears to execute like a
normal instruction (resuming from NIP when woken by interrupt). So all
the save/restore handling can be avoided completely. In particular NV
GPRs do not have to be saved, and MSR does not have to be switched
back to kernel MSR.

So move the test for EC=ESL=0 sleep states out to power9_idle_stop,
and return directly to the caller after stop in that case.

This improves performance for ping-pong benchmark with the stop0_lite
idle state by 2.54% for 2 threads in the same core, and 2.57% for
different cores. Performance increase with HV_POSSIBLE defined will be
improved further by avoiding the hwsync.
Signed-off-by: default avatarNicholas Piggin <npiggin@gmail.com>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent d0b791c0
...@@ -324,32 +324,8 @@ enter_winkle: ...@@ -324,32 +324,8 @@ enter_winkle:
/* /*
* r3 - PSSCR value corresponding to the requested stop state. * r3 - PSSCR value corresponding to the requested stop state.
*/ */
power_enter_stop: power_enter_stop_esl:
/*
* Check if we are executing the lite variant with ESL=EC=0
*/
andis. r4,r3,PSSCR_EC_ESL_MASK_SHIFTED
clrldi r3,r3,60 /* r3 = Bits[60:63] = Requested Level (RL) */ clrldi r3,r3,60 /* r3 = Bits[60:63] = Requested Level (RL) */
bne .Lhandle_esl_ec_set
PPC_STOP
li r3,0 /* Since we didn't lose state, return 0 */
std r3, PACA_REQ_PSSCR(r13)
/*
* pnv_wakeup_noloss() expects r12 to contain the SRR1 value so
* it can determine if the wakeup reason is an HMI in
* CHECK_HMI_INTERRUPT.
*
* However, when we wakeup with ESL=0, SRR1 will not contain the wakeup
* reason, so there is no point setting r12 to SRR1.
*
* Further, we clear r12 here, so that we don't accidentally enter the
* HMI in pnv_wakeup_noloss() if the value of r12[42:45] == WAKE_HMI.
*/
li r12, 0
b pnv_wakeup_noloss
.Lhandle_esl_ec_set:
BEGIN_FTR_SECTION BEGIN_FTR_SECTION
/* /*
* POWER9 DD2.0 or earlier can incorrectly set PMAO when waking up after * POWER9 DD2.0 or earlier can incorrectly set PMAO when waking up after
...@@ -441,21 +417,32 @@ _GLOBAL(power9_offline_stop) ...@@ -441,21 +417,32 @@ _GLOBAL(power9_offline_stop)
/* fall through */ /* fall through */
_GLOBAL(power9_idle_stop) _GLOBAL(power9_idle_stop)
mtspr SPRN_PSSCR,r3
/*
* The ESL=EC=0 case does not wake up at 0x100, and it does not
* allow SMT mode switching, so it does not require PSSCR to be
* saved.
*/
andis. r4,r3,PSSCR_EC_ESL_MASK_SHIFTED
bne 1f
PPC_STOP
li r3,0 /* Since we didn't lose state, return 0 */
blr
1:
std r3, PACA_REQ_PSSCR(r13) std r3, PACA_REQ_PSSCR(r13)
#ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE #ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE
BEGIN_FTR_SECTION BEGIN_FTR_SECTION
sync sync
lwz r5, PACA_DONT_STOP(r13) lwz r5, PACA_DONT_STOP(r13)
cmpwi r5, 0 cmpwi r5, 0
bne 1f bne 2f
END_FTR_SECTION_IFSET(CPU_FTR_P9_TM_XER_SO_BUG) END_FTR_SECTION_IFSET(CPU_FTR_P9_TM_XER_SO_BUG)
#endif #endif
mtspr SPRN_PSSCR,r3 LOAD_REG_ADDR(r4,power_enter_stop_esl)
LOAD_REG_ADDR(r4,power_enter_stop)
b pnv_powersave_common b pnv_powersave_common
/* No return */ /* No return */
#ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE #ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE
1: 2:
/* /*
* We get here when TM / thread reconfiguration bug workaround * We get here when TM / thread reconfiguration bug workaround
* code wants to get the CPU into SMT4 mode, and therefore * code wants to get the CPU into SMT4 mode, and therefore
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment