powernv/cpuidle: Redesign idle states management
Deep idle states like sleep and winkle are per core idle states. A core enters these states only when all the threads enter either the particular idle state or a deeper one. There are tasks like fastsleep hardware bug workaround and hypervisor core state save which have to be done only by the last thread of the core entering deep idle state and similarly tasks like timebase resync, hypervisor core register restore that have to be done only by the first thread waking up from these state. The current idle state management does not have a way to distinguish the first/last thread of the core waking/entering idle states. Tasks like timebase resync are done for all the threads. This is not only is suboptimal, but can cause functionality issues when subcores and kvm is involved. This patch adds the necessary infrastructure to track idle states of threads in a per-core structure. It uses this info to perform tasks like fastsleep workaround and timebase resync only once per core. Signed-off-by: Shreyas B. Prabhu <shreyas@linux.vnet.ibm.com> Originally-by: Preeti U. Murthy <preeti@linux.vnet.ibm.com> Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org> Cc: Paul Mackerras <paulus@samba.org> Cc: Michael Ellerman <mpe@ellerman.id.au> Cc: Rafael J. Wysocki <rjw@rjwysocki.net> Cc: linux-pm@vger.kernel.org Cc: linuxppc-dev@lists.ozlabs.org Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
This commit is contained in:

committed by
Michael Ellerman

parent
8eb8ac89a3
commit
7cba160ad7
@@ -15,6 +15,7 @@
|
||||
#include <asm/hw_irq.h>
|
||||
#include <asm/exception-64s.h>
|
||||
#include <asm/ptrace.h>
|
||||
#include <asm/cpuidle.h>
|
||||
|
||||
/*
|
||||
* We layout physical memory as follows:
|
||||
@@ -109,15 +110,19 @@ BEGIN_FTR_SECTION
|
||||
rlwinm. r13,r13,47-31,30,31
|
||||
beq 9f
|
||||
|
||||
/* waking up from powersave (nap) state */
|
||||
cmpwi cr1,r13,2
|
||||
/* Total loss of HV state is fatal, we could try to use the
|
||||
* PIR to locate a PACA, then use an emergency stack etc...
|
||||
* OPAL v3 based powernv platforms have new idle states
|
||||
* which fall in this catagory.
|
||||
*/
|
||||
bgt cr1,8f
|
||||
cmpwi cr3,r13,2
|
||||
|
||||
GET_PACA(r13)
|
||||
lbz r0,PACA_THREAD_IDLE_STATE(r13)
|
||||
cmpwi cr2,r0,PNV_THREAD_NAP
|
||||
bgt cr2,8f /* Either sleep or Winkle */
|
||||
|
||||
/* Waking up from nap should not cause hypervisor state loss */
|
||||
bgt cr3,.
|
||||
|
||||
/* Waking up from nap */
|
||||
li r0,PNV_THREAD_RUNNING
|
||||
stb r0,PACA_THREAD_IDLE_STATE(r13) /* Clear thread state */
|
||||
|
||||
#ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE
|
||||
li r0,KVM_HWTHREAD_IN_KERNEL
|
||||
@@ -133,7 +138,7 @@ BEGIN_FTR_SECTION
|
||||
|
||||
/* Return SRR1 from power7_nap() */
|
||||
mfspr r3,SPRN_SRR1
|
||||
beq cr1,2f
|
||||
beq cr3,2f
|
||||
b power7_wakeup_noloss
|
||||
2: b power7_wakeup_loss
|
||||
|
||||
@@ -1382,6 +1387,7 @@ machine_check_handle_early:
|
||||
MACHINE_CHECK_HANDLER_WINDUP
|
||||
GET_PACA(r13)
|
||||
ld r1,PACAR1(r13)
|
||||
li r3,PNV_THREAD_NAP
|
||||
b power7_enter_nap_mode
|
||||
4:
|
||||
#endif
|
||||
|
Reference in New Issue
Block a user