lkml.org 
[lkml]   [2013]   [Jul]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
SubjectRe: [PATCH v6] power: new trace event to print device suspend and resume time
From
Date
On Fri, 2013-07-19 at 12:27 -0600, Shuah Khan wrote:
> diff --git a/drivers/base/power/main.c b/drivers/base/power/main.c
> index 5a9b656..9f098a8 100644
> --- a/drivers/base/power/main.c
> +++ b/drivers/base/power/main.c
> @@ -28,6 +28,7 @@
> #include <linux/sched.h>
> #include <linux/async.h>
> #include <linux/suspend.h>
> +#include <trace/events/power.h>
> #include <linux/cpuidle.h>
> #include "../base.h"
> #include "power.h"
> @@ -56,6 +57,30 @@ static pm_message_t pm_transition;
>
> static int async_error;
>
> +static char *pm_verb(int event)
> +{
> + switch (event) {
> + case PM_EVENT_SUSPEND:
> + return "suspend";
> + case PM_EVENT_RESUME:
> + return "resume";
> + case PM_EVENT_FREEZE:
> + return "freeze";
> + case PM_EVENT_QUIESCE:
> + return "quiesce";
> + case PM_EVENT_HIBERNATE:
> + return "hibernate";
> + case PM_EVENT_THAW:
> + return "thaw";
> + case PM_EVENT_RESTORE:
> + return "restore";
> + case PM_EVENT_RECOVER:
> + return "recover";
> + default:
> + return "(unknown PM event)";
> + }
> +}
> +
> /**
> * device_pm_sleep_init - Initialize system suspend-related device fields.
> * @dev: Device object being initialized.
> @@ -172,16 +197,21 @@ static ktime_t initcall_debug_start(struct device *dev)
> }
>
> static void initcall_debug_report(struct device *dev, ktime_t calltime,
> - int error)
> + int error, pm_message_t state, char *info)
> {
> - ktime_t delta, rettime;
> + ktime_t rettime;
> + s64 nsecs;
> +
> + rettime = ktime_get();
> + nsecs = (s64) ktime_to_ns(ktime_sub(rettime, calltime));
>
> if (pm_print_times_enabled) {
> - rettime = ktime_get();
> - delta = ktime_sub(rettime, calltime);
> pr_info("call %s+ returned %d after %Ld usecs\n", dev_name(dev),
> - error, (unsigned long long)ktime_to_ns(delta) >> 10);
> + error, (unsigned long long)nsecs >> 10);
> }
> +
> + trace_device_pm_report_time(dev, info, nsecs, pm_verb(state.event),
> + error);
> }
>



> }
> diff --git a/include/trace/events/power.h b/include/trace/events/power.h
> index 8e42410..5d6a208 100644
> --- a/include/trace/events/power.h
> +++ b/include/trace/events/power.h
> @@ -66,6 +66,43 @@ TRACE_EVENT(machine_suspend,
> TP_printk("state=%lu", (unsigned long)__entry->state)
> );
>
> +TRACE_EVENT(device_pm_report_time,
> +
> + TP_PROTO(struct device *dev, const char *pm_ops, s64 ops_time,
> + char *pm_event_str, int error),
> +
> + TP_ARGS(dev, pm_ops, ops_time, pm_event_str, error),
> +
> + TP_STRUCT__entry(
> + __string(device, dev_name(dev))
> + __string(driver, dev_driver_string(dev))
> + __string(parent, dev->parent ? dev_name(dev->parent) : "none")
> + __string(pm_ops, pm_ops ? pm_ops : "none ")
> + __string(pm_event_str, pm_event_str)
> + __field(s64, ops_time)
> + __field(int, error)
> + ),
> +
> + TP_fast_assign(
> + char *tmp_p = dev->parent ? dev_name(dev->parent) : "none";
> + char *tmp_i = pm_ops ? pm_ops : "none ";
> +
> + __assign_str(device, dev_name(dev));
> + __assign_str(driver, dev_driver_string(dev));
> + __assign_str(parent, tmp_p);
> + __assign_str(pm_ops, tmp_i);
> + __assign_str(pm_event_str, pm_event_str);
> + __entry->ops_time = ops_time;
> + __entry->error = error;
> + ),
> +
> + /* ops_str has an extra space at the end */
> + TP_printk("%s %s parent=%s state=%s ops=%snsecs=%lld err=%d",
> + __get_str(driver), __get_str(device), __get_str(parent),
> + __get_str(pm_event_str), __get_str(pm_ops),
> + __entry->ops_time, __entry->error)
> +);
> +
> DECLARE_EVENT_CLASS(wakeup_source,
>
> TP_PROTO(const char *name, unsigned int state),

For the tracepoint logic: Reviewed-by: Steven Rostedt
<rostedt@goodmis.org>

-- Steve




\
 
 \ /
  Last update: 2013-07-19 21:01    [W:0.034 / U:0.512 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site