[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <20250117105132.4122940b@gandalf.local.home>
Date: Fri, 17 Jan 2025 10:51:32 -0500
From: Steven Rostedt <rostedt@...dmis.org>
To: Keita Morisaki <keyz@...gle.com>
Cc: mhiramat@...nel.org, mathieu.desnoyers@...icios.com,
linux-kernel@...r.kernel.org, linux-trace-kernel@...r.kernel.org,
lpieralisi@...nel.org, sudeep.holla@....com, rafael@...nel.org,
daniel.lezcano@...aro.org, linux-pm@...r.kernel.org, aarontian@...gle.com,
yimingtseng@...gle.com
Subject: Re: [PATCH] cpuidle: psci: Add trace for PSCI domain idle
On Fri, 17 Jan 2025 12:01:32 +0800
Keita Morisaki <keyz@...gle.com> wrote:
> @@ -74,7 +75,9 @@ static __cpuidle int __psci_enter_domain_idle_state(struct cpuidle_device *dev,
> if (!state)
> state = states[idx];
>
> + trace_psci_domain_idle(dev->cpu, state, true, s2idle);
> ret = psci_cpu_suspend_enter(state) ? -1 : idx;
> + trace_psci_domain_idle(dev->cpu, state, false, s2idle);
Why not make that into two different events:
+ trace_psci_domain_idle_enter(dev->cpu, state, s2idle);
ret = psci_cpu_suspend_enter(state) ? -1 : idx;
+ trace_psci_domain_idle_exit(dev->cpu, state, s2idle);
>
> if (s2idle)
> dev_pm_genpd_resume(pd_dev);
> diff --git a/include/trace/events/power.h b/include/trace/events/power.h
> index d2349b6b531a..82ad8bb1c477 100644
> --- a/include/trace/events/power.h
> +++ b/include/trace/events/power.h
> @@ -62,6 +62,31 @@ TRACE_EVENT(cpu_idle_miss,
> (unsigned long)__entry->state, (__entry->below)?"below":"above")
> );
>
> +TRACE_EVENT(psci_domain_idle,
> +
> + TP_PROTO(unsigned int cpu_id, unsigned int state, bool enter, bool s2idle),
> +
> + TP_ARGS(cpu_id, state, enter, s2idle),
> +
> + TP_STRUCT__entry(
> + __field(u32, cpu_id)
> + __field(u32, state)
> + __field(bool, enter)
> + __field(bool, s2idle)
> + ),
> +
> + TP_fast_assign(
> + __entry->cpu_id = cpu_id;
> + __entry->state = state;
> + __entry->enter = enter;
> + __entry->s2idle = s2idle;
> + ),
> +
> + TP_printk("cpu_id=%lu state=0x%lx type=%s, is_s2idle=%s",
> + (unsigned long)__entry->cpu_id, (unsigned long)__entry->state,
> + (__entry->enter)?"enter":"exit", (__entry->s2idle)?"yes":"no")
> +);
> +
Then make the above into a DECLARE_EVENT_CLASS:
DECLARE_EVENT_CLASS(psci_domain_idle_template,
TP_PROTO(unsigned int cpu_id, unsigned int state, bool s2idle),
TP_ARGS(cpu_id, state, s2idle),
TP_STRUCT__entry(
__field(u32, cpu_id)
__field(u32, state)
__field(bool, s2idle)
),
TP_fast_assign(
__entry->cpu_id = cpu_id;
__entry->state = state;
__entry->s2idle = s2idle;
),
TP_printk("cpu_id=%lu state=0x%lx type=%s, is_s2idle=%s",
(unsigned long)__entry->cpu_id, (unsigned long)__entry->state,
(__entry->s2idle)?"yes":"no")
);
DEFINE_EVENT(psci_domain_idle_template, psci_domain_idle_enter,
TP_PROTO(unsigned int cpu_id, unsigned int state, bool s2idle),
TP_ARGS(cpu_id, state, s2idle),
);
DEFINE_EVENT(psci_domain_idle_template, psci_domain_idle_exit,
TP_PROTO(unsigned int cpu_id, unsigned int state, bool s2idle),
TP_ARGS(cpu_id, state, s2idle),
);
And then you could easily attach synthetic events to them to get the
timings and such.
-- Steve
Powered by blists - more mailing lists