* [PATCH v3 0/2] Avoid calling cpu_pm functions for retention idle states
@ 2017-11-15 17:11 Prashanth Prakash
2017-11-15 17:11 ` [PATCH v3 1/2] cpuidle: Add new macro to enter a retention idle state Prashanth Prakash
` (2 more replies)
0 siblings, 3 replies; 6+ messages in thread
From: Prashanth Prakash @ 2017-11-15 17:11 UTC (permalink / raw)
To: linux-pm, linux-arm-kernel
Cc: sudeep.holla, rjw, daniel.lezcano, will.deacon, catalin.marinas,
Prashanth Prakash
CPU_PM_CPU_IDLE_ENTER() treats all idle states whose idx != 0 as a
state that loses some context, but we can have deeper idle states that
doesn't lose any software context. If a CPU is entering such a low power
idle state where it retains the 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 states.
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
Overhead of cpu_pm_enter - 1.2us(Average), 6.5us(Max)
Overhead of cpu_pm_exit - 3.1us(Average), 11.1us(Max)
Listed below are 5 functions that were notified on ENTER/EXIT on the
test platform:
gic_cpu_pm_notifier
arch_timer_cpu_pm_notify
cpu_pm_pmu_notify
hyp_init_cpu_pm_notifier
fpsimd_cpu_pm_notifier
Prashanth Prakash (2):
cpuidle: Add new macro to enter a retention idle state
ARM64 / cpuidle: Use new cpuidle macro for entering retention state
Changes in v3:
- Added additional clarification to commit message (Sudeep)
Changes in v2:
- Reordered cpuidle.h macros for better readablity (Rafael)
arch/arm64/kernel/cpuidle.c | 8 +++++++-
include/linux/cpuidle.h | 40 ++++++++++++++++++++++++----------------
2 files changed, 31 insertions(+), 17 deletions(-)
--
Qualcomm Datacenter Technologies on behalf of Qualcomm Technologies, Inc.
Qualcomm Technologies, Inc. is a member of the
Code Aurora Forum, a Linux Foundation Collaborative Project.
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v3 1/2] cpuidle: Add new macro to enter a retention idle state
2017-11-15 17:11 [PATCH v3 0/2] Avoid calling cpu_pm functions for retention idle states Prashanth Prakash
@ 2017-11-15 17:11 ` Prashanth Prakash
2017-12-13 1:05 ` Rafael J. Wysocki
2017-11-15 17:11 ` [PATCH v3 2/2] ARM64 / cpuidle: Use new cpuidle macro for entering retention state Prashanth Prakash
2018-01-02 14:04 ` [PATCH v3 0/2] Avoid calling cpu_pm functions for retention idle states Catalin Marinas
2 siblings, 1 reply; 6+ messages in thread
From: Prashanth Prakash @ 2017-11-15 17:11 UTC (permalink / raw)
To: linux-pm, linux-arm-kernel
Cc: sudeep.holla, rjw, daniel.lezcano, will.deacon, catalin.marinas,
Prashanth Prakash
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
Signed-off-by: Prashanth Prakash <pprakash@codeaurora.org>
Acked-by: Sudeep Holla <sudeep.holla@arm.com>
---
include/linux/cpuidle.h | 40 ++++++++++++++++++++++++----------------
1 file changed, 24 insertions(+), 16 deletions(-)
diff --git a/include/linux/cpuidle.h b/include/linux/cpuidle.h
index 8f7788d..871f9e2 100644
--- a/include/linux/cpuidle.h
+++ b/include/linux/cpuidle.h
@@ -257,22 +257,30 @@ static inline int cpuidle_register_governor(struct cpuidle_governor *gov)
{return 0;}
#endif
-#define CPU_PM_CPU_IDLE_ENTER(low_level_idle_enter, idx) \
-({ \
- int __ret; \
- \
- if (!idx) { \
- cpu_do_idle(); \
- return idx; \
- } \
- \
- __ret = cpu_pm_enter(); \
- if (!__ret) { \
- __ret = low_level_idle_enter(idx); \
- cpu_pm_exit(); \
- } \
- \
- __ret ? -1 : idx; \
+#define __CPU_PM_CPU_IDLE_ENTER(low_level_idle_enter, idx, is_retention) \
+({ \
+ int __ret = 0; \
+ \
+ if (!idx) { \
+ cpu_do_idle(); \
+ return idx; \
+ } \
+ \
+ if (!is_retention) \
+ __ret = cpu_pm_enter(); \
+ if (!__ret) { \
+ __ret = low_level_idle_enter(idx); \
+ if (!is_retention) \
+ cpu_pm_exit(); \
+ } \
+ \
+ __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 */
--
Qualcomm Datacenter Technologies on behalf of Qualcomm Technologies, Inc.
Qualcomm Technologies, Inc. is a member of the
Code Aurora Forum, a Linux Foundation Collaborative Project.
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH v3 2/2] ARM64 / cpuidle: Use new cpuidle macro for entering retention state
2017-11-15 17:11 [PATCH v3 0/2] Avoid calling cpu_pm functions for retention idle states Prashanth Prakash
2017-11-15 17:11 ` [PATCH v3 1/2] cpuidle: Add new macro to enter a retention idle state Prashanth Prakash
@ 2017-11-15 17:11 ` Prashanth Prakash
2018-01-02 11:42 ` Sudeep Holla
2018-01-02 14:04 ` [PATCH v3 0/2] Avoid calling cpu_pm functions for retention idle states Catalin Marinas
2 siblings, 1 reply; 6+ messages in thread
From: Prashanth Prakash @ 2017-11-15 17:11 UTC (permalink / raw)
To: linux-pm, linux-arm-kernel
Cc: sudeep.holla, rjw, daniel.lezcano, will.deacon, catalin.marinas,
Prashanth Prakash
CPU_PM_CPU_IDLE_ENTER_RETENTION skips calling cpu_pm_enter() and
cpu_pm_exit(). By not calling cpu_pm functions in idle entry/exit
paths we can reduce the latency involved in entering and exiting
the low power idle state.
On ARM64 based Qualcomm server platform we measured below overhead
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
Signed-off-by: Prashanth Prakash <pprakash@codeaurora.org>
---
arch/arm64/kernel/cpuidle.c | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/arch/arm64/kernel/cpuidle.c b/arch/arm64/kernel/cpuidle.c
index fd69108..f2d1381 100644
--- a/arch/arm64/kernel/cpuidle.c
+++ b/arch/arm64/kernel/cpuidle.c
@@ -47,6 +47,8 @@ int arm_cpuidle_suspend(int index)
#include <acpi/processor.h>
+#define ARM64_LPI_IS_RETENTION_STATE(arch_flags) (!(arch_flags))
+
int acpi_processor_ffh_lpi_probe(unsigned int cpu)
{
return arm_cpuidle_init(cpu);
@@ -54,6 +56,10 @@ int acpi_processor_ffh_lpi_probe(unsigned int cpu)
int acpi_processor_ffh_lpi_enter(struct acpi_lpi_state *lpi)
{
- return CPU_PM_CPU_IDLE_ENTER(arm_cpuidle_suspend, lpi->index);
+ if (ARM64_LPI_IS_RETENTION_STATE(lpi->arch_flags))
+ return CPU_PM_CPU_IDLE_ENTER_RETENTION(arm_cpuidle_suspend,
+ lpi->index);
+ else
+ return CPU_PM_CPU_IDLE_ENTER(arm_cpuidle_suspend, lpi->index);
}
#endif
--
Qualcomm Datacenter Technologies on behalf of Qualcomm Technologies, Inc.
Qualcomm Technologies, Inc. is a member of the
Code Aurora Forum, a Linux Foundation Collaborative Project.
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH v3 1/2] cpuidle: Add new macro to enter a retention idle state
2017-11-15 17:11 ` [PATCH v3 1/2] cpuidle: Add new macro to enter a retention idle state Prashanth Prakash
@ 2017-12-13 1:05 ` Rafael J. Wysocki
0 siblings, 0 replies; 6+ messages in thread
From: Rafael J. Wysocki @ 2017-12-13 1:05 UTC (permalink / raw)
To: Prashanth Prakash
Cc: linux-pm, linux-arm-kernel, sudeep.holla, daniel.lezcano,
will.deacon, catalin.marinas
On Wednesday, November 15, 2017 6:11:49 PM CET Prashanth Prakash wrote:
> 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
>
> Signed-off-by: Prashanth Prakash <pprakash@codeaurora.org>
> Acked-by: Sudeep Holla <sudeep.holla@arm.com>
> ---
> include/linux/cpuidle.h | 40 ++++++++++++++++++++++++----------------
> 1 file changed, 24 insertions(+), 16 deletions(-)
>
> diff --git a/include/linux/cpuidle.h b/include/linux/cpuidle.h
> index 8f7788d..871f9e2 100644
> --- a/include/linux/cpuidle.h
> +++ b/include/linux/cpuidle.h
> @@ -257,22 +257,30 @@ static inline int cpuidle_register_governor(struct cpuidle_governor *gov)
> {return 0;}
> #endif
>
> -#define CPU_PM_CPU_IDLE_ENTER(low_level_idle_enter, idx) \
> -({ \
> - int __ret; \
> - \
> - if (!idx) { \
> - cpu_do_idle(); \
> - return idx; \
> - } \
> - \
> - __ret = cpu_pm_enter(); \
> - if (!__ret) { \
> - __ret = low_level_idle_enter(idx); \
> - cpu_pm_exit(); \
> - } \
> - \
> - __ret ? -1 : idx; \
> +#define __CPU_PM_CPU_IDLE_ENTER(low_level_idle_enter, idx, is_retention) \
> +({ \
> + int __ret = 0; \
> + \
> + if (!idx) { \
> + cpu_do_idle(); \
> + return idx; \
> + } \
> + \
> + if (!is_retention) \
> + __ret = cpu_pm_enter(); \
> + if (!__ret) { \
> + __ret = low_level_idle_enter(idx); \
> + if (!is_retention) \
> + cpu_pm_exit(); \
> + } \
> + \
> + __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 */
>
This change is fine by me, so you can add
Acked-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
to it, but it kind of doesn't make sense to apply it alone, so please feel free
to route it via ARM64.
Thanks,
Rafael
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v3 2/2] ARM64 / cpuidle: Use new cpuidle macro for entering retention state
2017-11-15 17:11 ` [PATCH v3 2/2] ARM64 / cpuidle: Use new cpuidle macro for entering retention state Prashanth Prakash
@ 2018-01-02 11:42 ` Sudeep Holla
0 siblings, 0 replies; 6+ messages in thread
From: Sudeep Holla @ 2018-01-02 11:42 UTC (permalink / raw)
To: Prashanth Prakash, linux-pm, linux-arm-kernel
Cc: Sudeep Holla, rjw, daniel.lezcano, will.deacon, catalin.marinas
On 15/11/17 17:11, Prashanth Prakash wrote:
> CPU_PM_CPU_IDLE_ENTER_RETENTION skips calling cpu_pm_enter() and
> cpu_pm_exit(). By not calling cpu_pm functions in idle entry/exit
> paths we can reduce the latency involved in entering and exiting
> the low power idle state.
>
> On ARM64 based Qualcomm server platform we measured below overhead
> 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
>
> Signed-off-by: Prashanth Prakash <pprakash@codeaurora.org>
Acked-by: Sudeep Holla <sudeep.holla@arm.com>
--
Regards,
Sudeep
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v3 0/2] Avoid calling cpu_pm functions for retention idle states
2017-11-15 17:11 [PATCH v3 0/2] Avoid calling cpu_pm functions for retention idle states Prashanth Prakash
2017-11-15 17:11 ` [PATCH v3 1/2] cpuidle: Add new macro to enter a retention idle state Prashanth Prakash
2017-11-15 17:11 ` [PATCH v3 2/2] ARM64 / cpuidle: Use new cpuidle macro for entering retention state Prashanth Prakash
@ 2018-01-02 14:04 ` Catalin Marinas
2 siblings, 0 replies; 6+ messages in thread
From: Catalin Marinas @ 2018-01-02 14:04 UTC (permalink / raw)
To: Prashanth Prakash
Cc: linux-pm, linux-arm-kernel, sudeep.holla, rjw, daniel.lezcano,
will.deacon
On Wed, Nov 15, 2017 at 10:11:48AM -0700, Prashanth Prakash wrote:
> CPU_PM_CPU_IDLE_ENTER() treats all idle states whose idx != 0 as a
> state that loses some context, but we can have deeper idle states that
> doesn't lose any software context. If a CPU is entering such a low power
> idle state where it retains the 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 states.
>
> 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
> Overhead of cpu_pm_enter - 1.2us(Average), 6.5us(Max)
> Overhead of cpu_pm_exit - 3.1us(Average), 11.1us(Max)
I queued the patches in the arm64 tree for 4.16. Thanks.
--
Catalin
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2018-01-02 14:04 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-11-15 17:11 [PATCH v3 0/2] Avoid calling cpu_pm functions for retention idle states Prashanth Prakash
2017-11-15 17:11 ` [PATCH v3 1/2] cpuidle: Add new macro to enter a retention idle state Prashanth Prakash
2017-12-13 1:05 ` Rafael J. Wysocki
2017-11-15 17:11 ` [PATCH v3 2/2] ARM64 / cpuidle: Use new cpuidle macro for entering retention state Prashanth Prakash
2018-01-02 11:42 ` Sudeep Holla
2018-01-02 14:04 ` [PATCH v3 0/2] Avoid calling cpu_pm functions for retention idle states Catalin Marinas
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).