* [PATCH v1 1/2] PM/runtime: introduce trace points for tracing rpm_* functions
@ 2011-09-27 10:12 tom.leiming
2011-09-27 10:12 ` tom.leiming
2011-09-27 10:12 ` [PATCH v1 2/2] PM/runtime: replace dev_dbg with trace_rpm_* tom.leiming
0 siblings, 2 replies; 10+ messages in thread
From: tom.leiming @ 2011-09-27 10:12 UTC (permalink / raw)
To: rjw, stern; +Cc: linux-pm, linux-kernel, mingo, rostedt, fweisbec, Ming Lei
From: Ming Lei <ming.lei@canonical.com>
This patch introduces 3 trace points to prepare for tracing
rpm_idle/rpm_suspend/rpm_resume functions, so we can use these
trace points to replace the current dev_dbg().
Cc: Steven Rostedt rostedt@goodmis.org
Signed-off-by: Ming Lei <ming.lei@canonical.com>
---
v1: takes Steven's suggestions
- use __assign_str to dump device name to trace buffer
- pass _THIS_IP_ to trace_rpm_return_int
---
include/trace/events/rpm.h | 99 ++++++++++++++++++++++++++++++++++++++++++++
kernel/trace/Makefile | 1 +
kernel/trace/rpm-traces.c | 21 +++++++++
3 files changed, 121 insertions(+), 0 deletions(-)
create mode 100644 include/trace/events/rpm.h
create mode 100644 kernel/trace/rpm-traces.c
diff --git a/include/trace/events/rpm.h b/include/trace/events/rpm.h
new file mode 100644
index 0000000..36805d9
--- /dev/null
+++ b/include/trace/events/rpm.h
@@ -0,0 +1,99 @@
+
+#undef TRACE_SYSTEM
+#define TRACE_SYSTEM rpm
+
+#if !defined(_TRACE_RUNTIME_POWER_H) || defined(TRACE_HEADER_MULTI_READ)
+#define _TRACE_RUNTIME_POWER_H
+
+#include <linux/ktime.h>
+#include <linux/tracepoint.h>
+#include <linux/device.h>
+
+/*
+ * The rpm_internal events are used for tracing some important
+ * runtime pm internal functions.
+ */
+DECLARE_EVENT_CLASS(rpm_internal,
+
+ TP_PROTO(struct device *dev, int flags),
+
+ TP_ARGS(dev, flags),
+
+ TP_STRUCT__entry(
+ __string( name, dev_name(dev) )
+ __field( int, flags )
+ __field( int , usage_count )
+ __field( int , disable_depth )
+ __field( int , runtime_auto )
+ __field( int , request_pending )
+ __field( int , irq_safe )
+ __field( int , child_count )
+ ),
+
+ TP_fast_assign(
+ __assign_str(name, dev_name(dev));
+ __entry->flags = flags;
+ __entry->usage_count = atomic_read(
+ &dev->power.usage_count);
+ __entry->disable_depth = dev->power.disable_depth;
+ __entry->runtime_auto = dev->power.runtime_auto;
+ __entry->request_pending = dev->power.request_pending;
+ __entry->irq_safe = dev->power.irq_safe;
+ __entry->child_count = atomic_read(
+ &dev->power.child_count);
+ ),
+
+ TP_printk("%s flags-%x cnt-%-2d dep-%-2d auto-%-1d p-%-1d"
+ " irq-%-1d child-%d",
+ __get_str(name), __entry->flags,
+ __entry->usage_count,
+ __entry->disable_depth,
+ __entry->runtime_auto,
+ __entry->request_pending,
+ __entry->irq_safe,
+ __entry->child_count
+ )
+);
+DEFINE_EVENT(rpm_internal, rpm_suspend,
+
+ TP_PROTO(struct device *dev, int flags),
+
+ TP_ARGS(dev, flags)
+);
+DEFINE_EVENT(rpm_internal, rpm_resume,
+
+ TP_PROTO(struct device *dev, int flags),
+
+ TP_ARGS(dev, flags)
+);
+DEFINE_EVENT(rpm_internal, rpm_idle,
+
+ TP_PROTO(struct device *dev, int flags),
+
+ TP_ARGS(dev, flags)
+);
+
+TRACE_EVENT(rpm_return_int,
+ TP_PROTO(struct device *dev, unsigned long ip, int ret),
+ TP_ARGS(dev, ip, ret),
+
+ TP_STRUCT__entry(
+ __string( name, dev_name(dev))
+ __field( unsigned long, ip )
+ __field( int, ret )
+ ),
+
+ TP_fast_assign(
+ __assign_str(name, dev_name(dev));
+ __entry->ip = ip;
+ __entry->ret = ret;
+ ),
+
+ TP_printk("%pS:%s ret=%d", __entry->ip, __get_str(name),
+ __entry->ret)
+);
+
+#endif /* _TRACE_RUNTIME_POWER_H */
+
+/* This part must be outside protection */
+#include <trace/define_trace.h>
diff --git a/kernel/trace/Makefile b/kernel/trace/Makefile
index 761c510..56bdab5 100644
--- a/kernel/trace/Makefile
+++ b/kernel/trace/Makefile
@@ -53,6 +53,7 @@ endif
obj-$(CONFIG_EVENT_TRACING) += trace_events_filter.o
obj-$(CONFIG_KPROBE_EVENT) += trace_kprobe.o
obj-$(CONFIG_TRACEPOINTS) += power-traces.o
+obj-$(CONFIG_TRACEPOINTS) += rpm-traces.o
ifeq ($(CONFIG_TRACING),y)
obj-$(CONFIG_KGDB_KDB) += trace_kdb.o
endif
diff --git a/kernel/trace/rpm-traces.c b/kernel/trace/rpm-traces.c
new file mode 100644
index 0000000..998949e
--- /dev/null
+++ b/kernel/trace/rpm-traces.c
@@ -0,0 +1,21 @@
+/*
+ * Power trace points
+ *
+ * Copyright (C) 2009 Ming Lei <ming.lei@canonical.com>
+ */
+
+#include <linux/string.h>
+#include <linux/types.h>
+#include <linux/workqueue.h>
+#include <linux/sched.h>
+#include <linux/module.h>
+#include <linux/usb.h>
+
+#define CREATE_TRACE_POINTS
+#include <trace/events/rpm.h>
+
+EXPORT_TRACEPOINT_SYMBOL_GPL(rpm_return_int);
+EXPORT_TRACEPOINT_SYMBOL_GPL(rpm_idle);
+EXPORT_TRACEPOINT_SYMBOL_GPL(rpm_suspend);
+EXPORT_TRACEPOINT_SYMBOL_GPL(rpm_resume);
+
--
1.7.5.4
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH v1 1/2] PM/runtime: introduce trace points for tracing rpm_* functions
2011-09-27 10:12 [PATCH v1 1/2] PM/runtime: introduce trace points for tracing rpm_* functions tom.leiming
@ 2011-09-27 10:12 ` tom.leiming
2011-09-27 20:06 ` Rafael J. Wysocki
2011-09-27 20:29 ` Rafael J. Wysocki
2011-09-27 10:12 ` [PATCH v1 2/2] PM/runtime: replace dev_dbg with trace_rpm_* tom.leiming
1 sibling, 2 replies; 10+ messages in thread
From: tom.leiming @ 2011-09-27 10:12 UTC (permalink / raw)
To: rjw, stern; +Cc: linux-pm, linux-kernel, mingo, rostedt, fweisbec, Ming Lei
From: Ming Lei <ming.lei@canonical.com>
This patch introduces 3 trace points to prepare for tracing
rpm_idle/rpm_suspend/rpm_resume functions, so we can use these
trace points to replace the current dev_dbg().
Cc: Steven Rostedt rostedt@goodmis.org
Signed-off-by: Ming Lei <ming.lei@canonical.com>
---
v1: takes Steven's suggestions
- use __assign_str to dump device name to trace buffer
- pass _THIS_IP_ to trace_rpm_return_int
---
include/trace/events/rpm.h | 99 ++++++++++++++++++++++++++++++++++++++++++++
kernel/trace/Makefile | 1 +
kernel/trace/rpm-traces.c | 21 +++++++++
3 files changed, 121 insertions(+), 0 deletions(-)
create mode 100644 include/trace/events/rpm.h
create mode 100644 kernel/trace/rpm-traces.c
diff --git a/include/trace/events/rpm.h b/include/trace/events/rpm.h
new file mode 100644
index 0000000..36805d9
--- /dev/null
+++ b/include/trace/events/rpm.h
@@ -0,0 +1,99 @@
+
+#undef TRACE_SYSTEM
+#define TRACE_SYSTEM rpm
+
+#if !defined(_TRACE_RUNTIME_POWER_H) || defined(TRACE_HEADER_MULTI_READ)
+#define _TRACE_RUNTIME_POWER_H
+
+#include <linux/ktime.h>
+#include <linux/tracepoint.h>
+#include <linux/device.h>
+
+/*
+ * The rpm_internal events are used for tracing some important
+ * runtime pm internal functions.
+ */
+DECLARE_EVENT_CLASS(rpm_internal,
+
+ TP_PROTO(struct device *dev, int flags),
+
+ TP_ARGS(dev, flags),
+
+ TP_STRUCT__entry(
+ __string( name, dev_name(dev) )
+ __field( int, flags )
+ __field( int , usage_count )
+ __field( int , disable_depth )
+ __field( int , runtime_auto )
+ __field( int , request_pending )
+ __field( int , irq_safe )
+ __field( int , child_count )
+ ),
+
+ TP_fast_assign(
+ __assign_str(name, dev_name(dev));
+ __entry->flags = flags;
+ __entry->usage_count = atomic_read(
+ &dev->power.usage_count);
+ __entry->disable_depth = dev->power.disable_depth;
+ __entry->runtime_auto = dev->power.runtime_auto;
+ __entry->request_pending = dev->power.request_pending;
+ __entry->irq_safe = dev->power.irq_safe;
+ __entry->child_count = atomic_read(
+ &dev->power.child_count);
+ ),
+
+ TP_printk("%s flags-%x cnt-%-2d dep-%-2d auto-%-1d p-%-1d"
+ " irq-%-1d child-%d",
+ __get_str(name), __entry->flags,
+ __entry->usage_count,
+ __entry->disable_depth,
+ __entry->runtime_auto,
+ __entry->request_pending,
+ __entry->irq_safe,
+ __entry->child_count
+ )
+);
+DEFINE_EVENT(rpm_internal, rpm_suspend,
+
+ TP_PROTO(struct device *dev, int flags),
+
+ TP_ARGS(dev, flags)
+);
+DEFINE_EVENT(rpm_internal, rpm_resume,
+
+ TP_PROTO(struct device *dev, int flags),
+
+ TP_ARGS(dev, flags)
+);
+DEFINE_EVENT(rpm_internal, rpm_idle,
+
+ TP_PROTO(struct device *dev, int flags),
+
+ TP_ARGS(dev, flags)
+);
+
+TRACE_EVENT(rpm_return_int,
+ TP_PROTO(struct device *dev, unsigned long ip, int ret),
+ TP_ARGS(dev, ip, ret),
+
+ TP_STRUCT__entry(
+ __string( name, dev_name(dev))
+ __field( unsigned long, ip )
+ __field( int, ret )
+ ),
+
+ TP_fast_assign(
+ __assign_str(name, dev_name(dev));
+ __entry->ip = ip;
+ __entry->ret = ret;
+ ),
+
+ TP_printk("%pS:%s ret=%d", __entry->ip, __get_str(name),
+ __entry->ret)
+);
+
+#endif /* _TRACE_RUNTIME_POWER_H */
+
+/* This part must be outside protection */
+#include <trace/define_trace.h>
diff --git a/kernel/trace/Makefile b/kernel/trace/Makefile
index 761c510..56bdab5 100644
--- a/kernel/trace/Makefile
+++ b/kernel/trace/Makefile
@@ -53,6 +53,7 @@ endif
obj-$(CONFIG_EVENT_TRACING) += trace_events_filter.o
obj-$(CONFIG_KPROBE_EVENT) += trace_kprobe.o
obj-$(CONFIG_TRACEPOINTS) += power-traces.o
+obj-$(CONFIG_TRACEPOINTS) += rpm-traces.o
ifeq ($(CONFIG_TRACING),y)
obj-$(CONFIG_KGDB_KDB) += trace_kdb.o
endif
diff --git a/kernel/trace/rpm-traces.c b/kernel/trace/rpm-traces.c
new file mode 100644
index 0000000..998949e
--- /dev/null
+++ b/kernel/trace/rpm-traces.c
@@ -0,0 +1,21 @@
+/*
+ * Power trace points
+ *
+ * Copyright (C) 2009 Ming Lei <ming.lei@canonical.com>
+ */
+
+#include <linux/string.h>
+#include <linux/types.h>
+#include <linux/workqueue.h>
+#include <linux/sched.h>
+#include <linux/module.h>
+#include <linux/usb.h>
+
+#define CREATE_TRACE_POINTS
+#include <trace/events/rpm.h>
+
+EXPORT_TRACEPOINT_SYMBOL_GPL(rpm_return_int);
+EXPORT_TRACEPOINT_SYMBOL_GPL(rpm_idle);
+EXPORT_TRACEPOINT_SYMBOL_GPL(rpm_suspend);
+EXPORT_TRACEPOINT_SYMBOL_GPL(rpm_resume);
+
--
1.7.5.4
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH v1 2/2] PM/runtime: replace dev_dbg with trace_rpm_*
2011-09-27 10:12 [PATCH v1 1/2] PM/runtime: introduce trace points for tracing rpm_* functions tom.leiming
2011-09-27 10:12 ` tom.leiming
@ 2011-09-27 10:12 ` tom.leiming
1 sibling, 0 replies; 10+ messages in thread
From: tom.leiming @ 2011-09-27 10:12 UTC (permalink / raw)
To: rjw, stern; +Cc: linux-pm, linux-kernel, mingo, rostedt, fweisbec, Ming Lei
From: Ming Lei <ming.lei@canonical.com>
This patch replaces dev_dbg with trace_rpm_* inside
the three important functions:
rpm_idle
rpm_suspend
rpm_resume
Trace points have the below advantages compared with dev_dbg:
- trace points include much runtime information(such as
running cpu, current task, ...)
- most of linux distributions may disable "verbose debug"
driver debug compile switch, so it is very difficult to
report/debug runtime pm related problems from distribution
users without this kind of debug information.
- for upstream kernel users, enableing the debug switch will
produce many useless "rpm_resume" output, and it is very noise.
- dev_dbg inside rpm_suspend/rpm_resume may have some effects
on runtime pm behaviour of console devicer
Cc: Steven Rostedt rostedt@goodmis.org
Signed-off-by: Ming Lei <ming.lei@canonical.com>
---
v1: takes Steven's suggestions
- pass _THIS_IP_ to trace_rpm_return_int
---
drivers/base/power/runtime.c | 11 +++++++----
1 files changed, 7 insertions(+), 4 deletions(-)
diff --git a/drivers/base/power/runtime.c b/drivers/base/power/runtime.c
index acb3f83..74013fa 100644
--- a/drivers/base/power/runtime.c
+++ b/drivers/base/power/runtime.c
@@ -9,6 +9,7 @@
#include <linux/sched.h>
#include <linux/pm_runtime.h>
+#include <trace/events/rpm.h>
#include "power.h"
static int rpm_resume(struct device *dev, int rpmflags);
@@ -171,6 +172,7 @@ static int rpm_idle(struct device *dev, int rpmflags)
int (*callback)(struct device *);
int retval;
+ trace_rpm_idle(dev, rpmflags);
retval = rpm_check_suspend_allowed(dev);
if (retval < 0)
; /* Conditions are wrong. */
@@ -243,6 +245,7 @@ static int rpm_idle(struct device *dev, int rpmflags)
wake_up_all(&dev->power.wait_queue);
out:
+ trace_rpm_return_int(dev, _THIS_IP_, retval);
return retval;
}
@@ -295,7 +298,7 @@ static int rpm_suspend(struct device *dev, int rpmflags)
struct device *parent = NULL;
int retval;
- dev_dbg(dev, "%s flags 0x%x\n", __func__, rpmflags);
+ trace_rpm_suspend(dev, rpmflags);
repeat:
retval = rpm_check_suspend_allowed(dev);
@@ -430,7 +433,7 @@ static int rpm_suspend(struct device *dev, int rpmflags)
}
out:
- dev_dbg(dev, "%s returns %d\n", __func__, retval);
+ trace_rpm_return_int(dev, _THIS_IP_, retval);
return retval;
}
@@ -459,7 +462,7 @@ static int rpm_resume(struct device *dev, int rpmflags)
struct device *parent = NULL;
int retval = 0;
- dev_dbg(dev, "%s flags 0x%x\n", __func__, rpmflags);
+ trace_rpm_resume(dev, rpmflags);
repeat:
if (dev->power.runtime_error)
@@ -615,7 +618,7 @@ static int rpm_resume(struct device *dev, int rpmflags)
spin_lock_irq(&dev->power.lock);
}
- dev_dbg(dev, "%s returns %d\n", __func__, retval);
+ trace_rpm_return_int(dev, _THIS_IP_, retval);
return retval;
}
--
1.7.5.4
^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH v1 1/2] PM/runtime: introduce trace points for tracing rpm_* functions
2011-09-27 10:12 ` tom.leiming
@ 2011-09-27 20:06 ` Rafael J. Wysocki
2011-09-27 20:13 ` Steven Rostedt
2011-09-27 20:29 ` Rafael J. Wysocki
1 sibling, 1 reply; 10+ messages in thread
From: Rafael J. Wysocki @ 2011-09-27 20:06 UTC (permalink / raw)
To: tom.leiming, rostedt
Cc: stern, linux-pm, linux-kernel, mingo, fweisbec, Ming Lei
On Tuesday, September 27, 2011, tom.leiming@gmail.com wrote:
> From: Ming Lei <ming.lei@canonical.com>
>
> This patch introduces 3 trace points to prepare for tracing
> rpm_idle/rpm_suspend/rpm_resume functions, so we can use these
> trace points to replace the current dev_dbg().
>
> Cc: Steven Rostedt rostedt@goodmis.org
> Signed-off-by: Ming Lei <ming.lei@canonical.com>
> ---
> v1: takes Steven's suggestions
> - use __assign_str to dump device name to trace buffer
> - pass _THIS_IP_ to trace_rpm_return_int
Steven, do the patches look good to you now?
Rafael
> ---
> include/trace/events/rpm.h | 99 ++++++++++++++++++++++++++++++++++++++++++++
> kernel/trace/Makefile | 1 +
> kernel/trace/rpm-traces.c | 21 +++++++++
> 3 files changed, 121 insertions(+), 0 deletions(-)
> create mode 100644 include/trace/events/rpm.h
> create mode 100644 kernel/trace/rpm-traces.c
>
> diff --git a/include/trace/events/rpm.h b/include/trace/events/rpm.h
> new file mode 100644
> index 0000000..36805d9
> --- /dev/null
> +++ b/include/trace/events/rpm.h
> @@ -0,0 +1,99 @@
> +
> +#undef TRACE_SYSTEM
> +#define TRACE_SYSTEM rpm
> +
> +#if !defined(_TRACE_RUNTIME_POWER_H) || defined(TRACE_HEADER_MULTI_READ)
> +#define _TRACE_RUNTIME_POWER_H
> +
> +#include <linux/ktime.h>
> +#include <linux/tracepoint.h>
> +#include <linux/device.h>
> +
> +/*
> + * The rpm_internal events are used for tracing some important
> + * runtime pm internal functions.
> + */
> +DECLARE_EVENT_CLASS(rpm_internal,
> +
> + TP_PROTO(struct device *dev, int flags),
> +
> + TP_ARGS(dev, flags),
> +
> + TP_STRUCT__entry(
> + __string( name, dev_name(dev) )
> + __field( int, flags )
> + __field( int , usage_count )
> + __field( int , disable_depth )
> + __field( int , runtime_auto )
> + __field( int , request_pending )
> + __field( int , irq_safe )
> + __field( int , child_count )
> + ),
> +
> + TP_fast_assign(
> + __assign_str(name, dev_name(dev));
> + __entry->flags = flags;
> + __entry->usage_count = atomic_read(
> + &dev->power.usage_count);
> + __entry->disable_depth = dev->power.disable_depth;
> + __entry->runtime_auto = dev->power.runtime_auto;
> + __entry->request_pending = dev->power.request_pending;
> + __entry->irq_safe = dev->power.irq_safe;
> + __entry->child_count = atomic_read(
> + &dev->power.child_count);
> + ),
> +
> + TP_printk("%s flags-%x cnt-%-2d dep-%-2d auto-%-1d p-%-1d"
> + " irq-%-1d child-%d",
> + __get_str(name), __entry->flags,
> + __entry->usage_count,
> + __entry->disable_depth,
> + __entry->runtime_auto,
> + __entry->request_pending,
> + __entry->irq_safe,
> + __entry->child_count
> + )
> +);
> +DEFINE_EVENT(rpm_internal, rpm_suspend,
> +
> + TP_PROTO(struct device *dev, int flags),
> +
> + TP_ARGS(dev, flags)
> +);
> +DEFINE_EVENT(rpm_internal, rpm_resume,
> +
> + TP_PROTO(struct device *dev, int flags),
> +
> + TP_ARGS(dev, flags)
> +);
> +DEFINE_EVENT(rpm_internal, rpm_idle,
> +
> + TP_PROTO(struct device *dev, int flags),
> +
> + TP_ARGS(dev, flags)
> +);
> +
> +TRACE_EVENT(rpm_return_int,
> + TP_PROTO(struct device *dev, unsigned long ip, int ret),
> + TP_ARGS(dev, ip, ret),
> +
> + TP_STRUCT__entry(
> + __string( name, dev_name(dev))
> + __field( unsigned long, ip )
> + __field( int, ret )
> + ),
> +
> + TP_fast_assign(
> + __assign_str(name, dev_name(dev));
> + __entry->ip = ip;
> + __entry->ret = ret;
> + ),
> +
> + TP_printk("%pS:%s ret=%d", __entry->ip, __get_str(name),
> + __entry->ret)
> +);
> +
> +#endif /* _TRACE_RUNTIME_POWER_H */
> +
> +/* This part must be outside protection */
> +#include <trace/define_trace.h>
> diff --git a/kernel/trace/Makefile b/kernel/trace/Makefile
> index 761c510..56bdab5 100644
> --- a/kernel/trace/Makefile
> +++ b/kernel/trace/Makefile
> @@ -53,6 +53,7 @@ endif
> obj-$(CONFIG_EVENT_TRACING) += trace_events_filter.o
> obj-$(CONFIG_KPROBE_EVENT) += trace_kprobe.o
> obj-$(CONFIG_TRACEPOINTS) += power-traces.o
> +obj-$(CONFIG_TRACEPOINTS) += rpm-traces.o
> ifeq ($(CONFIG_TRACING),y)
> obj-$(CONFIG_KGDB_KDB) += trace_kdb.o
> endif
> diff --git a/kernel/trace/rpm-traces.c b/kernel/trace/rpm-traces.c
> new file mode 100644
> index 0000000..998949e
> --- /dev/null
> +++ b/kernel/trace/rpm-traces.c
> @@ -0,0 +1,21 @@
> +/*
> + * Power trace points
> + *
> + * Copyright (C) 2009 Ming Lei <ming.lei@canonical.com>
> + */
> +
> +#include <linux/string.h>
> +#include <linux/types.h>
> +#include <linux/workqueue.h>
> +#include <linux/sched.h>
> +#include <linux/module.h>
> +#include <linux/usb.h>
> +
> +#define CREATE_TRACE_POINTS
> +#include <trace/events/rpm.h>
> +
> +EXPORT_TRACEPOINT_SYMBOL_GPL(rpm_return_int);
> +EXPORT_TRACEPOINT_SYMBOL_GPL(rpm_idle);
> +EXPORT_TRACEPOINT_SYMBOL_GPL(rpm_suspend);
> +EXPORT_TRACEPOINT_SYMBOL_GPL(rpm_resume);
> +
>
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v1 1/2] PM/runtime: introduce trace points for tracing rpm_* functions
2011-09-27 20:06 ` Rafael J. Wysocki
@ 2011-09-27 20:13 ` Steven Rostedt
0 siblings, 0 replies; 10+ messages in thread
From: Steven Rostedt @ 2011-09-27 20:13 UTC (permalink / raw)
To: Rafael J. Wysocki
Cc: tom.leiming, stern, linux-pm, linux-kernel, mingo, fweisbec,
Ming Lei
On Tue, 2011-09-27 at 22:06 +0200, Rafael J. Wysocki wrote:
> On Tuesday, September 27, 2011, tom.leiming@gmail.com wrote:
> > From: Ming Lei <ming.lei@canonical.com>
> >
> > This patch introduces 3 trace points to prepare for tracing
> > rpm_idle/rpm_suspend/rpm_resume functions, so we can use these
> > trace points to replace the current dev_dbg().
> >
> > Cc: Steven Rostedt rostedt@goodmis.org
> > Signed-off-by: Ming Lei <ming.lei@canonical.com>
> > ---
> > v1: takes Steven's suggestions
> > - use __assign_str to dump device name to trace buffer
> > - pass _THIS_IP_ to trace_rpm_return_int
>
> Steven, do the patches look good to you now?
Yep,
Acked-by: Steven Rostedt <rostedt@goodmis.org>
-- Steve
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v1 1/2] PM/runtime: introduce trace points for tracing rpm_* functions
2011-09-27 10:12 ` tom.leiming
2011-09-27 20:06 ` Rafael J. Wysocki
@ 2011-09-27 20:29 ` Rafael J. Wysocki
2011-09-27 20:31 ` Steven Rostedt
1 sibling, 1 reply; 10+ messages in thread
From: Rafael J. Wysocki @ 2011-09-27 20:29 UTC (permalink / raw)
To: tom.leiming
Cc: stern, linux-pm, linux-kernel, mingo, rostedt, fweisbec, Ming Lei
On Tuesday, September 27, 2011, tom.leiming@gmail.com wrote:
> From: Ming Lei <ming.lei@canonical.com>
>
> This patch introduces 3 trace points to prepare for tracing
> rpm_idle/rpm_suspend/rpm_resume functions, so we can use these
> trace points to replace the current dev_dbg().
>
> Cc: Steven Rostedt rostedt@goodmis.org
> Signed-off-by: Ming Lei <ming.lei@canonical.com>
I get the following build warning from it:
GEN /home/rafael/src/build/mainline/tosh/Makefile
CHK include/linux/version.h
Using /home/rafael/src/linux as source for kernel
CHK include/generated/utsrelease.h
CALL /home/rafael/src/linux/scripts/checksyscalls.sh
CHK include/generated/compile.h
CC drivers/base/power/runtime.o
CC kernel/trace/rpm-traces.o
In file included from /home/rafael/src/linux/include/trace/ftrace.h:296:0,
from /home/rafael/src/linux/include/trace/define_trace.h:96,
from /home/rafael/src/linux/include/trace/events/rpm.h:99,
from /home/rafael/src/linux/kernel/trace/rpm-traces.c:15:
/home/rafael/src/linux/include/trace/events/rpm.h: In function ‘ftrace_raw_output_rpm_return_int’:
/home/rafael/src/linux/include/trace/events/rpm.h:76:1: warning: format ‘%p’ expects type ‘void *’, but argument 3 has type ‘long unsigned int’
Care to check?
Rafael
> ---
> v1: takes Steven's suggestions
> - use __assign_str to dump device name to trace buffer
> - pass _THIS_IP_ to trace_rpm_return_int
> ---
> include/trace/events/rpm.h | 99 ++++++++++++++++++++++++++++++++++++++++++++
> kernel/trace/Makefile | 1 +
> kernel/trace/rpm-traces.c | 21 +++++++++
> 3 files changed, 121 insertions(+), 0 deletions(-)
> create mode 100644 include/trace/events/rpm.h
> create mode 100644 kernel/trace/rpm-traces.c
>
> diff --git a/include/trace/events/rpm.h b/include/trace/events/rpm.h
> new file mode 100644
> index 0000000..36805d9
> --- /dev/null
> +++ b/include/trace/events/rpm.h
> @@ -0,0 +1,99 @@
> +
> +#undef TRACE_SYSTEM
> +#define TRACE_SYSTEM rpm
> +
> +#if !defined(_TRACE_RUNTIME_POWER_H) || defined(TRACE_HEADER_MULTI_READ)
> +#define _TRACE_RUNTIME_POWER_H
> +
> +#include <linux/ktime.h>
> +#include <linux/tracepoint.h>
> +#include <linux/device.h>
> +
> +/*
> + * The rpm_internal events are used for tracing some important
> + * runtime pm internal functions.
> + */
> +DECLARE_EVENT_CLASS(rpm_internal,
> +
> + TP_PROTO(struct device *dev, int flags),
> +
> + TP_ARGS(dev, flags),
> +
> + TP_STRUCT__entry(
> + __string( name, dev_name(dev) )
> + __field( int, flags )
> + __field( int , usage_count )
> + __field( int , disable_depth )
> + __field( int , runtime_auto )
> + __field( int , request_pending )
> + __field( int , irq_safe )
> + __field( int , child_count )
> + ),
> +
> + TP_fast_assign(
> + __assign_str(name, dev_name(dev));
> + __entry->flags = flags;
> + __entry->usage_count = atomic_read(
> + &dev->power.usage_count);
> + __entry->disable_depth = dev->power.disable_depth;
> + __entry->runtime_auto = dev->power.runtime_auto;
> + __entry->request_pending = dev->power.request_pending;
> + __entry->irq_safe = dev->power.irq_safe;
> + __entry->child_count = atomic_read(
> + &dev->power.child_count);
> + ),
> +
> + TP_printk("%s flags-%x cnt-%-2d dep-%-2d auto-%-1d p-%-1d"
> + " irq-%-1d child-%d",
> + __get_str(name), __entry->flags,
> + __entry->usage_count,
> + __entry->disable_depth,
> + __entry->runtime_auto,
> + __entry->request_pending,
> + __entry->irq_safe,
> + __entry->child_count
> + )
> +);
> +DEFINE_EVENT(rpm_internal, rpm_suspend,
> +
> + TP_PROTO(struct device *dev, int flags),
> +
> + TP_ARGS(dev, flags)
> +);
> +DEFINE_EVENT(rpm_internal, rpm_resume,
> +
> + TP_PROTO(struct device *dev, int flags),
> +
> + TP_ARGS(dev, flags)
> +);
> +DEFINE_EVENT(rpm_internal, rpm_idle,
> +
> + TP_PROTO(struct device *dev, int flags),
> +
> + TP_ARGS(dev, flags)
> +);
> +
> +TRACE_EVENT(rpm_return_int,
> + TP_PROTO(struct device *dev, unsigned long ip, int ret),
> + TP_ARGS(dev, ip, ret),
> +
> + TP_STRUCT__entry(
> + __string( name, dev_name(dev))
> + __field( unsigned long, ip )
> + __field( int, ret )
> + ),
> +
> + TP_fast_assign(
> + __assign_str(name, dev_name(dev));
> + __entry->ip = ip;
> + __entry->ret = ret;
> + ),
> +
> + TP_printk("%pS:%s ret=%d", __entry->ip, __get_str(name),
> + __entry->ret)
> +);
> +
> +#endif /* _TRACE_RUNTIME_POWER_H */
> +
> +/* This part must be outside protection */
> +#include <trace/define_trace.h>
> diff --git a/kernel/trace/Makefile b/kernel/trace/Makefile
> index 761c510..56bdab5 100644
> --- a/kernel/trace/Makefile
> +++ b/kernel/trace/Makefile
> @@ -53,6 +53,7 @@ endif
> obj-$(CONFIG_EVENT_TRACING) += trace_events_filter.o
> obj-$(CONFIG_KPROBE_EVENT) += trace_kprobe.o
> obj-$(CONFIG_TRACEPOINTS) += power-traces.o
> +obj-$(CONFIG_TRACEPOINTS) += rpm-traces.o
> ifeq ($(CONFIG_TRACING),y)
> obj-$(CONFIG_KGDB_KDB) += trace_kdb.o
> endif
> diff --git a/kernel/trace/rpm-traces.c b/kernel/trace/rpm-traces.c
> new file mode 100644
> index 0000000..998949e
> --- /dev/null
> +++ b/kernel/trace/rpm-traces.c
> @@ -0,0 +1,21 @@
> +/*
> + * Power trace points
> + *
> + * Copyright (C) 2009 Ming Lei <ming.lei@canonical.com>
> + */
> +
> +#include <linux/string.h>
> +#include <linux/types.h>
> +#include <linux/workqueue.h>
> +#include <linux/sched.h>
> +#include <linux/module.h>
> +#include <linux/usb.h>
> +
> +#define CREATE_TRACE_POINTS
> +#include <trace/events/rpm.h>
> +
> +EXPORT_TRACEPOINT_SYMBOL_GPL(rpm_return_int);
> +EXPORT_TRACEPOINT_SYMBOL_GPL(rpm_idle);
> +EXPORT_TRACEPOINT_SYMBOL_GPL(rpm_suspend);
> +EXPORT_TRACEPOINT_SYMBOL_GPL(rpm_resume);
> +
>
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v1 1/2] PM/runtime: introduce trace points for tracing rpm_* functions
2011-09-27 20:29 ` Rafael J. Wysocki
@ 2011-09-27 20:31 ` Steven Rostedt
2011-09-27 20:36 ` Rafael J. Wysocki
0 siblings, 1 reply; 10+ messages in thread
From: Steven Rostedt @ 2011-09-27 20:31 UTC (permalink / raw)
To: Rafael J. Wysocki
Cc: tom.leiming, stern, linux-pm, linux-kernel, mingo, fweisbec,
Ming Lei
On Tue, 2011-09-27 at 22:29 +0200, Rafael J. Wysocki wrote:
> On Tuesday, September 27, 2011, tom.leiming@gmail.com wrote:
> > From: Ming Lei <ming.lei@canonical.com>
> >
> > This patch introduces 3 trace points to prepare for tracing
> > rpm_idle/rpm_suspend/rpm_resume functions, so we can use these
> > trace points to replace the current dev_dbg().
> >
> > Cc: Steven Rostedt rostedt@goodmis.org
> > Signed-off-by: Ming Lei <ming.lei@canonical.com>
>
> I get the following build warning from it:
>
> GEN /home/rafael/src/build/mainline/tosh/Makefile
> CHK include/linux/version.h
> Using /home/rafael/src/linux as source for kernel
> CHK include/generated/utsrelease.h
> CALL /home/rafael/src/linux/scripts/checksyscalls.sh
> CHK include/generated/compile.h
> CC drivers/base/power/runtime.o
> CC kernel/trace/rpm-traces.o
> In file included from /home/rafael/src/linux/include/trace/ftrace.h:296:0,
> from /home/rafael/src/linux/include/trace/define_trace.h:96,
> from /home/rafael/src/linux/include/trace/events/rpm.h:99,
> from /home/rafael/src/linux/kernel/trace/rpm-traces.c:15:
> /home/rafael/src/linux/include/trace/events/rpm.h: In function ‘ftrace_raw_output_rpm_return_int’:
> /home/rafael/src/linux/include/trace/events/rpm.h:76:1: warning: format ‘%p’ expects type ‘void *’, but argument 3 has type ‘long unsigned int’
>
> Care to check?
>
> Rafael
> > +TRACE_EVENT(rpm_return_int,
> > + TP_PROTO(struct device *dev, unsigned long ip, int ret),
> > + TP_ARGS(dev, ip, ret),
> > +
> > + TP_STRUCT__entry(
> > + __string( name, dev_name(dev))
> > + __field( unsigned long, ip )
> > + __field( int, ret )
> > + ),
> > +
> > + TP_fast_assign(
> > + __assign_str(name, dev_name(dev));
> > + __entry->ip = ip;
> > + __entry->ret = ret;
> > + ),
> > +
> > + TP_printk("%pS:%s ret=%d", __entry->ip, __get_str(name),
> > + __entry->ret)
> > +);
> > +
TP_printk("%pS:%s ret=%d", (void *)__entry->ip, __get_str(name),
__entry->ret)
try that.
-- Steve
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v1 1/2] PM/runtime: introduce trace points for tracing rpm_* functions
2011-09-27 20:31 ` Steven Rostedt
@ 2011-09-27 20:36 ` Rafael J. Wysocki
2011-09-27 20:43 ` Steven Rostedt
0 siblings, 1 reply; 10+ messages in thread
From: Rafael J. Wysocki @ 2011-09-27 20:36 UTC (permalink / raw)
To: Steven Rostedt
Cc: tom.leiming, stern, linux-pm, linux-kernel, mingo, fweisbec,
Ming Lei
On Tuesday, September 27, 2011, Steven Rostedt wrote:
> On Tue, 2011-09-27 at 22:29 +0200, Rafael J. Wysocki wrote:
> > On Tuesday, September 27, 2011, tom.leiming@gmail.com wrote:
> > > From: Ming Lei <ming.lei@canonical.com>
> > >
> > > This patch introduces 3 trace points to prepare for tracing
> > > rpm_idle/rpm_suspend/rpm_resume functions, so we can use these
> > > trace points to replace the current dev_dbg().
> > >
> > > Cc: Steven Rostedt rostedt@goodmis.org
> > > Signed-off-by: Ming Lei <ming.lei@canonical.com>
> >
> > I get the following build warning from it:
> >
> > GEN /home/rafael/src/build/mainline/tosh/Makefile
> > CHK include/linux/version.h
> > Using /home/rafael/src/linux as source for kernel
> > CHK include/generated/utsrelease.h
> > CALL /home/rafael/src/linux/scripts/checksyscalls.sh
> > CHK include/generated/compile.h
> > CC drivers/base/power/runtime.o
> > CC kernel/trace/rpm-traces.o
> > In file included from /home/rafael/src/linux/include/trace/ftrace.h:296:0,
> > from /home/rafael/src/linux/include/trace/define_trace.h:96,
> > from /home/rafael/src/linux/include/trace/events/rpm.h:99,
> > from /home/rafael/src/linux/kernel/trace/rpm-traces.c:15:
> > /home/rafael/src/linux/include/trace/events/rpm.h: In function ‘ftrace_raw_output_rpm_return_int’:
> > /home/rafael/src/linux/include/trace/events/rpm.h:76:1: warning: format ‘%p’ expects type ‘void *’, but argument 3 has type ‘long unsigned int’
> >
> > Care to check?
> >
> > Rafael
>
> > > +TRACE_EVENT(rpm_return_int,
> > > + TP_PROTO(struct device *dev, unsigned long ip, int ret),
> > > + TP_ARGS(dev, ip, ret),
> > > +
> > > + TP_STRUCT__entry(
> > > + __string( name, dev_name(dev))
> > > + __field( unsigned long, ip )
> > > + __field( int, ret )
> > > + ),
> > > +
> > > + TP_fast_assign(
> > > + __assign_str(name, dev_name(dev));
> > > + __entry->ip = ip;
> > > + __entry->ret = ret;
> > > + ),
> > > +
> > > + TP_printk("%pS:%s ret=%d", __entry->ip, __get_str(name),
> > > + __entry->ret)
> > > +);
> > > +
>
>
> TP_printk("%pS:%s ret=%d", (void *)__entry->ip, __get_str(name),
> __entry->ret)
>
> try that.
Well, that certainly will work, but is it the right fix?
Rafael
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v1 1/2] PM/runtime: introduce trace points for tracing rpm_* functions
2011-09-27 20:36 ` Rafael J. Wysocki
@ 2011-09-27 20:43 ` Steven Rostedt
2011-09-27 21:03 ` Rafael J. Wysocki
0 siblings, 1 reply; 10+ messages in thread
From: Steven Rostedt @ 2011-09-27 20:43 UTC (permalink / raw)
To: Rafael J. Wysocki
Cc: tom.leiming, stern, linux-pm, linux-kernel, mingo, fweisbec,
Ming Lei
On Tue, 2011-09-27 at 22:36 +0200, Rafael J. Wysocki wrote:
> > TP_printk("%pS:%s ret=%d", (void *)__entry->ip, __get_str(name),
> > __entry->ret)
> >
> > try that.
>
> Well, that certainly will work, but is it the right fix?
Hehe, yes! The pS means to take a pointer and return the string version
of the address. Like "schedule+0x3a". __entry->ip is the address of the
function that called it __THIS_IP__ but we want to convert that into a
string name.
We use ip because both perf and trace-cmd should be smart enough to
parse it too. As they both store the kallsyms into the data file.
The (void *) is used because pS wants a pointer, and we stored the
address as an unsigned long.
-- Steve
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v1 1/2] PM/runtime: introduce trace points for tracing rpm_* functions
2011-09-27 20:43 ` Steven Rostedt
@ 2011-09-27 21:03 ` Rafael J. Wysocki
0 siblings, 0 replies; 10+ messages in thread
From: Rafael J. Wysocki @ 2011-09-27 21:03 UTC (permalink / raw)
To: Steven Rostedt
Cc: tom.leiming, stern, linux-pm, linux-kernel, mingo, fweisbec,
Ming Lei
On Tuesday, September 27, 2011, Steven Rostedt wrote:
> On Tue, 2011-09-27 at 22:36 +0200, Rafael J. Wysocki wrote:
>
> > > TP_printk("%pS:%s ret=%d", (void *)__entry->ip, __get_str(name),
> > > __entry->ret)
> > >
> > > try that.
> >
> > Well, that certainly will work, but is it the right fix?
>
> Hehe, yes! The pS means to take a pointer and return the string version
> of the address. Like "schedule+0x3a". __entry->ip is the address of the
> function that called it __THIS_IP__ but we want to convert that into a
> string name.
>
> We use ip because both perf and trace-cmd should be smart enough to
> parse it too. As they both store the kallsyms into the data file.
>
> The (void *) is used because pS wants a pointer, and we stored the
> address as an unsigned long.
OK, good.
I've applied both patches (with the above fix folded into the first one)
to linux-pm/pm-runtime (and merged into my linux-next branch), so they will be
pushed for 3.2.
Thanks,
Rafael
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2011-09-27 21:01 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-09-27 10:12 [PATCH v1 1/2] PM/runtime: introduce trace points for tracing rpm_* functions tom.leiming
2011-09-27 10:12 ` tom.leiming
2011-09-27 20:06 ` Rafael J. Wysocki
2011-09-27 20:13 ` Steven Rostedt
2011-09-27 20:29 ` Rafael J. Wysocki
2011-09-27 20:31 ` Steven Rostedt
2011-09-27 20:36 ` Rafael J. Wysocki
2011-09-27 20:43 ` Steven Rostedt
2011-09-27 21:03 ` Rafael J. Wysocki
2011-09-27 10:12 ` [PATCH v1 2/2] PM/runtime: replace dev_dbg with trace_rpm_* tom.leiming
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox