diff mbox

arm64: add cpu_idle tracepoints to arch_cpu_idle

Message ID 1442413401-2955-1-git-send-email-jszhang@marvell.com (mailing list archive)
State New, archived
Headers show

Commit Message

Jisheng Zhang Sept. 16, 2015, 2:23 p.m. UTC
Currently, if cpuidle is disabled or not supported, powertop reports
zero wakeups and zero events. This is due to the cpu_idle tracepoints
are missing.

This patch is to make cpu_idle tracepoints always available even if
cpuidle is disabled or not supported.

Signed-off-by: Jisheng Zhang <jszhang@marvell.com>
---
 arch/arm64/kernel/process.c | 3 +++
 1 file changed, 3 insertions(+)

Comments

Lorenzo Pieralisi Sept. 16, 2015, 2:47 p.m. UTC | #1
On Wed, Sep 16, 2015 at 03:23:21PM +0100, Jisheng Zhang wrote:
> Currently, if cpuidle is disabled or not supported, powertop reports
> zero wakeups and zero events. This is due to the cpu_idle tracepoints
> are missing.
> 
> This patch is to make cpu_idle tracepoints always available even if
> cpuidle is disabled or not supported.
> 
> Signed-off-by: Jisheng Zhang <jszhang@marvell.com>

Is there a reason why this code cannot be moved to the generic idle loop ?

Thanks,
Lorenzo

> ---
>  arch/arm64/kernel/process.c | 3 +++
>  1 file changed, 3 insertions(+)
> 
> diff --git a/arch/arm64/kernel/process.c b/arch/arm64/kernel/process.c
> index 223b093..f75b540 100644
> --- a/arch/arm64/kernel/process.c
> +++ b/arch/arm64/kernel/process.c
> @@ -44,6 +44,7 @@
>  #include <linux/hw_breakpoint.h>
>  #include <linux/personality.h>
>  #include <linux/notifier.h>
> +#include <trace/events/power.h>
>  
>  #include <asm/compat.h>
>  #include <asm/cacheflush.h>
> @@ -75,8 +76,10 @@ void arch_cpu_idle(void)
>  	 * This should do all the clock switching and wait for interrupt
>  	 * tricks
>  	 */
> +	trace_cpu_idle_rcuidle(1, smp_processor_id());
>  	cpu_do_idle();
>  	local_irq_enable();
> +	trace_cpu_idle_rcuidle(PWR_EVENT_EXIT, smp_processor_id());
>  }
>  
>  #ifdef CONFIG_HOTPLUG_CPU
> -- 
> 2.5.1
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at  http://www.tux.org/lkml/
>
Jisheng Zhang Sept. 16, 2015, 2:53 p.m. UTC | #2
Dear Lorenzo,

On Wed, 16 Sep 2015 15:47:38 +0100
Lorenzo Pieralisi <lorenzo.pieralisi@arm.com> wrote:

> On Wed, Sep 16, 2015 at 03:23:21PM +0100, Jisheng Zhang wrote:
> > Currently, if cpuidle is disabled or not supported, powertop reports
> > zero wakeups and zero events. This is due to the cpu_idle tracepoints
> > are missing.
> > 
> > This patch is to make cpu_idle tracepoints always available even if
> > cpuidle is disabled or not supported.
> > 
> > Signed-off-by: Jisheng Zhang <jszhang@marvell.com>
> 
> Is there a reason why this code cannot be moved to the generic idle loop ?

Do you mean the cpu_idle_loop() in kernel/sched/idle.c? To be honest, I
dunno. Maybe kernel experts can give some hints.

Thanks,
Jisheng

> 
> Thanks,
> Lorenzo
> 
> > ---
> >  arch/arm64/kernel/process.c | 3 +++
> >  1 file changed, 3 insertions(+)
> > 
> > diff --git a/arch/arm64/kernel/process.c b/arch/arm64/kernel/process.c
> > index 223b093..f75b540 100644
> > --- a/arch/arm64/kernel/process.c
> > +++ b/arch/arm64/kernel/process.c
> > @@ -44,6 +44,7 @@
> >  #include <linux/hw_breakpoint.h>
> >  #include <linux/personality.h>
> >  #include <linux/notifier.h>
> > +#include <trace/events/power.h>
> >  
> >  #include <asm/compat.h>
> >  #include <asm/cacheflush.h>
> > @@ -75,8 +76,10 @@ void arch_cpu_idle(void)
> >  	 * This should do all the clock switching and wait for interrupt
> >  	 * tricks
> >  	 */
> > +	trace_cpu_idle_rcuidle(1, smp_processor_id());
> >  	cpu_do_idle();
> >  	local_irq_enable();
> > +	trace_cpu_idle_rcuidle(PWR_EVENT_EXIT, smp_processor_id());
> >  }
> >  
> >  #ifdef CONFIG_HOTPLUG_CPU
> > -- 
> > 2.5.1
> > 
> > --
> > To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> > the body of a message to majordomo@vger.kernel.org
> > More majordomo info at  http://vger.kernel.org/majordomo-info.html
> > Please read the FAQ at  http://www.tux.org/lkml/
> >
Jisheng Zhang Sept. 16, 2015, 3:11 p.m. UTC | #3
Dear Lorenzo,

On Wed, 16 Sep 2015 22:53:12 +0800
Jisheng Zhang <jszhang@marvell.com> wrote:

> Dear Lorenzo,
> 
> On Wed, 16 Sep 2015 15:47:38 +0100
> Lorenzo Pieralisi <lorenzo.pieralisi@arm.com> wrote:
> 
> > On Wed, Sep 16, 2015 at 03:23:21PM +0100, Jisheng Zhang wrote:
> > > Currently, if cpuidle is disabled or not supported, powertop reports
> > > zero wakeups and zero events. This is due to the cpu_idle tracepoints
> > > are missing.
> > > 
> > > This patch is to make cpu_idle tracepoints always available even if
> > > cpuidle is disabled or not supported.
> > > 
> > > Signed-off-by: Jisheng Zhang <jszhang@marvell.com>
> > 
> > Is there a reason why this code cannot be moved to the generic idle loop ?
> 
> Do you mean the cpu_idle_loop() in kernel/sched/idle.c? To be honest, I

Maybe I know now. we need to trace different idle level, for example:

WFI idle: trace_cpu_idle_rcuidle(1, ...);

deeper idle: trace_cpu_idle_rcuidle(2, ...);

Usually, the first argument of trace_cpu_idle_rcuidle() equals to the index
of the idle level.

so generic idle loop is not a good candidate.

> dunno. Maybe kernel experts can give some hints.
> 
> Thanks,
> Jisheng
> 
> > 
> > Thanks,
> > Lorenzo
> > 
> > > ---
> > >  arch/arm64/kernel/process.c | 3 +++
> > >  1 file changed, 3 insertions(+)
> > > 
> > > diff --git a/arch/arm64/kernel/process.c b/arch/arm64/kernel/process.c
> > > index 223b093..f75b540 100644
> > > --- a/arch/arm64/kernel/process.c
> > > +++ b/arch/arm64/kernel/process.c
> > > @@ -44,6 +44,7 @@
> > >  #include <linux/hw_breakpoint.h>
> > >  #include <linux/personality.h>
> > >  #include <linux/notifier.h>
> > > +#include <trace/events/power.h>
> > >  
> > >  #include <asm/compat.h>
> > >  #include <asm/cacheflush.h>
> > > @@ -75,8 +76,10 @@ void arch_cpu_idle(void)
> > >  	 * This should do all the clock switching and wait for interrupt
> > >  	 * tricks
> > >  	 */
> > > +	trace_cpu_idle_rcuidle(1, smp_processor_id());
> > >  	cpu_do_idle();
> > >  	local_irq_enable();
> > > +	trace_cpu_idle_rcuidle(PWR_EVENT_EXIT, smp_processor_id());
> > >  }
> > >  
> > >  #ifdef CONFIG_HOTPLUG_CPU
> > > -- 
> > > 2.5.1
> > > 
> > > --
> > > To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> > > the body of a message to majordomo@vger.kernel.org
> > > More majordomo info at  http://vger.kernel.org/majordomo-info.html
> > > Please read the FAQ at  http://www.tux.org/lkml/
> > > 
> 
> 
> _______________________________________________
> linux-arm-kernel mailing list
> linux-arm-kernel@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
Lorenzo Pieralisi Sept. 16, 2015, 4:16 p.m. UTC | #4
On Wed, Sep 16, 2015 at 04:11:05PM +0100, Jisheng Zhang wrote:
> Dear Lorenzo,
> 
> On Wed, 16 Sep 2015 22:53:12 +0800
> Jisheng Zhang <jszhang@marvell.com> wrote:
> 
> > Dear Lorenzo,
> > 
> > On Wed, 16 Sep 2015 15:47:38 +0100
> > Lorenzo Pieralisi <lorenzo.pieralisi@arm.com> wrote:
> > 
> > > On Wed, Sep 16, 2015 at 03:23:21PM +0100, Jisheng Zhang wrote:
> > > > Currently, if cpuidle is disabled or not supported, powertop reports
> > > > zero wakeups and zero events. This is due to the cpu_idle tracepoints
> > > > are missing.
> > > > 
> > > > This patch is to make cpu_idle tracepoints always available even if
> > > > cpuidle is disabled or not supported.
> > > > 
> > > > Signed-off-by: Jisheng Zhang <jszhang@marvell.com>
> > > 
> > > Is there a reason why this code cannot be moved to the generic idle loop ?
> > 
> > Do you mean the cpu_idle_loop() in kernel/sched/idle.c? To be honest, I
> 
> Maybe I know now. we need to trace different idle level, for example:
> 
> WFI idle: trace_cpu_idle_rcuidle(1, ...);
> 
> deeper idle: trace_cpu_idle_rcuidle(2, ...);
> 
> Usually, the first argument of trace_cpu_idle_rcuidle() equals to the index
> of the idle level.
> 
> so generic idle loop is not a good candidate.

You are adding a trace for tracing state 1 (ie default idle state),
called from arch_cpu_idle(), which is the default idle call when the
CPUidle framework is not available, so I suggested moving the traces
you add to arm/arm64 arch_cpu_idle() calls to kernel/sched/idle.c
(see default_idle_call()) instead of patching architecture code.

I think you can't do that because on x86 calling arch_cpu_idle()
does not always mean entering idle state index 1 if I read the code
correctly (in particular the mwait based implementation - mwait_idle()).

So never mind, patch is fine (on arm64, on arm you should be careful
because some arm_pm_idle implementations trace state 1 already -
see omap3_pm_idle and if you add traces to arch_cpu_idle you should
remove the traces from mach implementations).

Acked-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Jisheng Zhang Sept. 16, 2015, 4:56 p.m. UTC | #5
On Wed, 16 Sep 2015 17:16:05 +0100
Lorenzo Pieralisi <lorenzo.pieralisi@arm.com> wrote:

> On Wed, Sep 16, 2015 at 04:11:05PM +0100, Jisheng Zhang wrote:
> > Dear Lorenzo,
> > 
> > On Wed, 16 Sep 2015 22:53:12 +0800
> > Jisheng Zhang <jszhang@marvell.com> wrote:
> > 
> > > Dear Lorenzo,
> > > 
> > > On Wed, 16 Sep 2015 15:47:38 +0100
> > > Lorenzo Pieralisi <lorenzo.pieralisi@arm.com> wrote:
> > > 
> > > > On Wed, Sep 16, 2015 at 03:23:21PM +0100, Jisheng Zhang wrote:
> > > > > Currently, if cpuidle is disabled or not supported, powertop reports
> > > > > zero wakeups and zero events. This is due to the cpu_idle tracepoints
> > > > > are missing.
> > > > > 
> > > > > This patch is to make cpu_idle tracepoints always available even if
> > > > > cpuidle is disabled or not supported.
> > > > > 
> > > > > Signed-off-by: Jisheng Zhang <jszhang@marvell.com>
> > > > 
> > > > Is there a reason why this code cannot be moved to the generic idle loop ?
> > > 
> > > Do you mean the cpu_idle_loop() in kernel/sched/idle.c? To be honest, I
> > 
> > Maybe I know now. we need to trace different idle level, for example:
> > 
> > WFI idle: trace_cpu_idle_rcuidle(1, ...);
> > 
> > deeper idle: trace_cpu_idle_rcuidle(2, ...);
> > 
> > Usually, the first argument of trace_cpu_idle_rcuidle() equals to the index
> > of the idle level.
> > 
> > so generic idle loop is not a good candidate.
> 
> You are adding a trace for tracing state 1 (ie default idle state),
> called from arch_cpu_idle(), which is the default idle call when the
> CPUidle framework is not available, so I suggested moving the traces
> you add to arm/arm64 arch_cpu_idle() calls to kernel/sched/idle.c
> (see default_idle_call()) instead of patching architecture code.
> 
> I think you can't do that because on x86 calling arch_cpu_idle()
> does not always mean entering idle state index 1 if I read the code
> correctly (in particular the mwait based implementation - mwait_idle()).
> 
> So never mind, patch is fine (on arm64, on arm you should be careful
> because some arm_pm_idle implementations trace state 1 already -
> see omap3_pm_idle and if you add traces to arch_cpu_idle you should
> remove the traces from mach implementations).

OOPs, I was debugging the cascaded irq issues on Marvell BG4CT SoC. Yes, this
arm_pm_idle should be taken care on arm, I should ignore arm_pm_idle, I'll
cook v2 for arm platform.

Thanks a lot,
Jisheng

> 
> Acked-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Catalin Marinas Oct. 19, 2015, 5:47 p.m. UTC | #6
On Wed, Sep 16, 2015 at 10:23:21PM +0800, Jisheng Zhang wrote:
> Currently, if cpuidle is disabled or not supported, powertop reports
> zero wakeups and zero events. This is due to the cpu_idle tracepoints
> are missing.
> 
> This patch is to make cpu_idle tracepoints always available even if
> cpuidle is disabled or not supported.
> 
> Signed-off-by: Jisheng Zhang <jszhang@marvell.com>

Queued for 4.4. Thanks.
diff mbox

Patch

diff --git a/arch/arm64/kernel/process.c b/arch/arm64/kernel/process.c
index 223b093..f75b540 100644
--- a/arch/arm64/kernel/process.c
+++ b/arch/arm64/kernel/process.c
@@ -44,6 +44,7 @@ 
 #include <linux/hw_breakpoint.h>
 #include <linux/personality.h>
 #include <linux/notifier.h>
+#include <trace/events/power.h>
 
 #include <asm/compat.h>
 #include <asm/cacheflush.h>
@@ -75,8 +76,10 @@  void arch_cpu_idle(void)
 	 * This should do all the clock switching and wait for interrupt
 	 * tricks
 	 */
+	trace_cpu_idle_rcuidle(1, smp_processor_id());
 	cpu_do_idle();
 	local_irq_enable();
+	trace_cpu_idle_rcuidle(PWR_EVENT_EXIT, smp_processor_id());
 }
 
 #ifdef CONFIG_HOTPLUG_CPU