cpuidle: Add new macro to enter a retention idle state
If a CPU is entering a low power idle state where it doesn't lose any context, then there is no need to call cpu_pm_enter()/cpu_pm_exit(). Add a new macro(CPU_PM_CPU_IDLE_ENTER_RETENTION) to be used by cpuidle drivers when they are entering retention state. By not calling cpu_pm_enter and cpu_pm_exit we reduce the latency involved in entering and exiting the retention idle states. CPU_PM_CPU_IDLE_ENTER_RETENTION assumes that no state is lost and hence CPU PM notifiers will not be called. We may need a broader change if we need to support partial retention states effeciently. On ARM64 based Qualcomm Server Platform we measured below overhead for for calling cpu_pm_enter and cpu_pm_exit for retention states. workload: stress --hdd #CPUs --hdd-bytes 32M -t 30 Average overhead of cpu_pm_enter - 1.2us Average overhead of cpu_pm_exit - 3.1us Acked-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> Acked-by: Sudeep Holla <sudeep.holla@arm.com> Signed-off-by: Prashanth Prakash <pprakash@codeaurora.org> Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
This commit is contained in:
parent
1f911c3a11
commit
db50a74d81
|
@ -257,22 +257,30 @@ static inline int cpuidle_register_governor(struct cpuidle_governor *gov)
|
||||||
{return 0;}
|
{return 0;}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define CPU_PM_CPU_IDLE_ENTER(low_level_idle_enter, idx) \
|
#define __CPU_PM_CPU_IDLE_ENTER(low_level_idle_enter, idx, is_retention) \
|
||||||
({ \
|
({ \
|
||||||
int __ret; \
|
int __ret = 0; \
|
||||||
\
|
\
|
||||||
if (!idx) { \
|
if (!idx) { \
|
||||||
cpu_do_idle(); \
|
cpu_do_idle(); \
|
||||||
return idx; \
|
return idx; \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
__ret = cpu_pm_enter(); \
|
if (!is_retention) \
|
||||||
if (!__ret) { \
|
__ret = cpu_pm_enter(); \
|
||||||
__ret = low_level_idle_enter(idx); \
|
if (!__ret) { \
|
||||||
cpu_pm_exit(); \
|
__ret = low_level_idle_enter(idx); \
|
||||||
} \
|
if (!is_retention) \
|
||||||
\
|
cpu_pm_exit(); \
|
||||||
__ret ? -1 : idx; \
|
} \
|
||||||
|
\
|
||||||
|
__ret ? -1 : idx; \
|
||||||
})
|
})
|
||||||
|
|
||||||
|
#define CPU_PM_CPU_IDLE_ENTER(low_level_idle_enter, idx) \
|
||||||
|
__CPU_PM_CPU_IDLE_ENTER(low_level_idle_enter, idx, 0)
|
||||||
|
|
||||||
|
#define CPU_PM_CPU_IDLE_ENTER_RETENTION(low_level_idle_enter, idx) \
|
||||||
|
__CPU_PM_CPU_IDLE_ENTER(low_level_idle_enter, idx, 1)
|
||||||
|
|
||||||
#endif /* _LINUX_CPUIDLE_H */
|
#endif /* _LINUX_CPUIDLE_H */
|
||||||
|
|
Loading…
Reference in New Issue