On Fri, 17 Jan 2025 12:01:32 +0800 Keita Morisaki <k...@google.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