diff options
author | Shreyas B. Prabhu <shreyas@linux.vnet.ibm.com> | 2014-12-09 13:56:52 -0500 |
---|---|---|
committer | Michael Ellerman <mpe@ellerman.id.au> | 2014-12-14 18:46:40 -0500 |
commit | 7cba160ad789a3ad7e68b92bf20eaad6ed171f80 (patch) | |
tree | ef57d54fcf61e5acf912e03004c0913457d3832b /arch/powerpc/include/asm/paca.h | |
parent | 8eb8ac89a364305d05ad16be983b7890eb462cc3 (diff) |
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>
Diffstat (limited to 'arch/powerpc/include/asm/paca.h')
-rw-r--r-- | arch/powerpc/include/asm/paca.h | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/arch/powerpc/include/asm/paca.h b/arch/powerpc/include/asm/paca.h index 24a386cbb928..a0a16847bd40 100644 --- a/arch/powerpc/include/asm/paca.h +++ b/arch/powerpc/include/asm/paca.h | |||
@@ -152,6 +152,14 @@ struct paca_struct { | |||
152 | u64 tm_scratch; /* TM scratch area for reclaim */ | 152 | u64 tm_scratch; /* TM scratch area for reclaim */ |
153 | #endif | 153 | #endif |
154 | 154 | ||
155 | #ifdef CONFIG_PPC_POWERNV | ||
156 | /* Per-core mask tracking idle threads and a lock bit-[L][TTTTTTTT] */ | ||
157 | u32 *core_idle_state_ptr; | ||
158 | u8 thread_idle_state; /* PNV_THREAD_RUNNING/NAP/SLEEP */ | ||
159 | /* Mask to indicate thread id in core */ | ||
160 | u8 thread_mask; | ||
161 | #endif | ||
162 | |||
155 | #ifdef CONFIG_PPC_BOOK3S_64 | 163 | #ifdef CONFIG_PPC_BOOK3S_64 |
156 | /* Exclusive emergency stack pointer for machine check exception. */ | 164 | /* Exclusive emergency stack pointer for machine check exception. */ |
157 | void *mc_emergency_sp; | 165 | void *mc_emergency_sp; |