* [RFC PATCH 1/2] PM/runtime: introduce trace points for tracing rpm_* functions
@ 2011-09-22 4:11 tom.leiming
2011-09-22 4:11 ` [RFC PATCH 2/2] PM/runtime: replace dev_dbg with trace_rpm_* tom.leiming
` (2 more replies)
0 siblings, 3 replies; 8+ messages in thread
From: tom.leiming @ 2011-09-22 4:11 UTC (permalink / raw)
To: rjw, stern; +Cc: linux-pm, linux-kernel, mingo, rostedt, fweisbec, Ming Lei
From: Ming Lei <tom.leiming@gmail.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().
Signed-off-by: Ming Lei <tom.leiming@gmail.com>
---
include/trace/events/rpm.h | 98 ++++++++++++++++++++++++++++++++++++++++++++
kernel/trace/Makefile | 1 +
kernel/trace/rpm-traces.c | 21 +++++++++
3 files changed, 120 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..ecd40bb
--- /dev/null
+++ b/include/trace/events/rpm.h
@@ -0,0 +1,98 @@
+
+#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(
+ __field( const char *, name )
+ __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(
+ __entry->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",
+ __entry->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, const char *func, int ret),
+ TP_ARGS(dev, func, ret),
+
+ TP_STRUCT__entry(
+ __field( const char *, name )
+ __field( const char *, func )
+ __field( int, ret )
+ ),
+
+ TP_fast_assign(
+ __entry->name = dev_name(dev);
+ __entry->ret = ret;
+ __entry->func = func;
+ ),
+
+ TP_printk("%s:%s ret=%d", __entry->func, __entry->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 <tom.leiming@gmail.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 [flat|nested] 8+ messages in thread* [RFC PATCH 2/2] PM/runtime: replace dev_dbg with trace_rpm_* 2011-09-22 4:11 [RFC PATCH 1/2] PM/runtime: introduce trace points for tracing rpm_* functions tom.leiming @ 2011-09-22 4:11 ` tom.leiming 2011-09-25 14:43 ` [RFC PATCH 1/2] PM/runtime: introduce trace points for tracing rpm_* functions Rafael J. Wysocki 2011-09-26 13:40 ` Steven Rostedt 2 siblings, 0 replies; 8+ messages in thread From: tom.leiming @ 2011-09-22 4:11 UTC (permalink / raw) To: rjw, stern; +Cc: linux-pm, linux-kernel, mingo, rostedt, fweisbec, Ming Lei From: Ming Lei <tom.leiming@gmail.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 Signed-off-by: Ming Lei <tom.leiming@gmail.com> --- 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..f41469a 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, __func__, 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, __func__, 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, __func__, retval); return retval; } -- 1.7.5.4 ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [RFC PATCH 1/2] PM/runtime: introduce trace points for tracing rpm_* functions 2011-09-22 4:11 [RFC PATCH 1/2] PM/runtime: introduce trace points for tracing rpm_* functions tom.leiming 2011-09-22 4:11 ` [RFC PATCH 2/2] PM/runtime: replace dev_dbg with trace_rpm_* tom.leiming @ 2011-09-25 14:43 ` Rafael J. Wysocki 2011-09-26 13:40 ` Steven Rostedt 2 siblings, 0 replies; 8+ messages in thread From: Rafael J. Wysocki @ 2011-09-25 14:43 UTC (permalink / raw) To: tom.leiming, mingo, rostedt; +Cc: stern, linux-pm, linux-kernel, fweisbec On Thursday, September 22, 2011, tom.leiming@gmail.com wrote: > From: Ming Lei <tom.leiming@gmail.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(). > > Signed-off-by: Ming Lei <tom.leiming@gmail.com> I like the patches and would like to push them for 3.2, but I need to know if the tracing people are OK with them. Steven, Ingo? Thanks, Rafael > --- > include/trace/events/rpm.h | 98 ++++++++++++++++++++++++++++++++++++++++++++ > kernel/trace/Makefile | 1 + > kernel/trace/rpm-traces.c | 21 +++++++++ > 3 files changed, 120 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..ecd40bb > --- /dev/null > +++ b/include/trace/events/rpm.h > @@ -0,0 +1,98 @@ > + > +#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( > + __field( const char *, name ) > + __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( > + __entry->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", > + __entry->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, const char *func, int ret), > + TP_ARGS(dev, func, ret), > + > + TP_STRUCT__entry( > + __field( const char *, name ) > + __field( const char *, func ) > + __field( int, ret ) > + ), > + > + TP_fast_assign( > + __entry->name = dev_name(dev); > + __entry->ret = ret; > + __entry->func = func; > + ), > + > + TP_printk("%s:%s ret=%d", __entry->func, __entry->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 <tom.leiming@gmail.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] 8+ messages in thread
* Re: [RFC PATCH 1/2] PM/runtime: introduce trace points for tracing rpm_* functions 2011-09-22 4:11 [RFC PATCH 1/2] PM/runtime: introduce trace points for tracing rpm_* functions tom.leiming 2011-09-22 4:11 ` [RFC PATCH 2/2] PM/runtime: replace dev_dbg with trace_rpm_* tom.leiming 2011-09-25 14:43 ` [RFC PATCH 1/2] PM/runtime: introduce trace points for tracing rpm_* functions Rafael J. Wysocki @ 2011-09-26 13:40 ` Steven Rostedt 2011-09-27 0:53 ` Ming Lei 2 siblings, 1 reply; 8+ messages in thread From: Steven Rostedt @ 2011-09-26 13:40 UTC (permalink / raw) To: tom.leiming; +Cc: rjw, stern, linux-pm, linux-kernel, mingo, fweisbec On Thu, 2011-09-22 at 12:11 +0800, tom.leiming@gmail.com wrote: > From: Ming Lei <tom.leiming@gmail.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(). > > Signed-off-by: Ming Lei <tom.leiming@gmail.com> > --- > include/trace/events/rpm.h | 98 ++++++++++++++++++++++++++++++++++++++++++++ > kernel/trace/Makefile | 1 + > kernel/trace/rpm-traces.c | 21 +++++++++ > 3 files changed, 120 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..ecd40bb > --- /dev/null > +++ b/include/trace/events/rpm.h > @@ -0,0 +1,98 @@ > + > +#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( > + __field( const char *, name ) > + __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( > + __entry->name = dev_name(dev); Don't use pointers, you must copy the name here. Otherwise, if the trace is read after the device has left, you will be referencing a invalid pointer and possible crash the kernel. We have ways to express dynamic string fields. Use them. > + __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", > + __entry->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, const char *func, int ret), > + TP_ARGS(dev, func, ret), > + > + TP_STRUCT__entry( > + __field( const char *, name ) > + __field( const char *, func ) > + __field( int, ret ) > + ), > + > + TP_fast_assign( > + __entry->name = dev_name(dev); Same here. > + __entry->ret = ret; > + __entry->func = func; And here. But as this is just __func__, you could use %pS and save the pointer to the function. This is acceptable as kallsyms will will used to find the function, and instead pass in __THIS_IP__ to the tracepoint. -- Steve > + ), > + > + TP_printk("%s:%s ret=%d", __entry->func, __entry->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 <tom.leiming@gmail.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] 8+ messages in thread
* Re: [RFC PATCH 1/2] PM/runtime: introduce trace points for tracing rpm_* functions 2011-09-26 13:40 ` Steven Rostedt @ 2011-09-27 0:53 ` Ming Lei 2011-09-27 1:11 ` Steven Rostedt 0 siblings, 1 reply; 8+ messages in thread From: Ming Lei @ 2011-09-27 0:53 UTC (permalink / raw) To: Steven Rostedt; +Cc: rjw, stern, linux-pm, linux-kernel, mingo, fweisbec Hi, On Mon, Sep 26, 2011 at 9:40 PM, Steven Rostedt <rostedt@goodmis.org> wrote: > On Thu, 2011-09-22 at 12:11 +0800, tom.leiming@gmail.com wrote: >> From: Ming Lei <tom.leiming@gmail.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(). >> >> Signed-off-by: Ming Lei <tom.leiming@gmail.com> >> --- >> include/trace/events/rpm.h | 98 ++++++++++++++++++++++++++++++++++++++++++++ >> kernel/trace/Makefile | 1 + >> kernel/trace/rpm-traces.c | 21 +++++++++ >> 3 files changed, 120 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..ecd40bb >> --- /dev/null >> +++ b/include/trace/events/rpm.h >> @@ -0,0 +1,98 @@ >> + >> +#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( >> + __field( const char *, name ) >> + __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( >> + __entry->name = dev_name(dev); > > Don't use pointers, you must copy the name here. Otherwise, if the trace > is read after the device has left, you will be referencing a invalid > pointer and possible crash the kernel. Yes, you right, but __get_str() may introduce some extra loading, could it be changed to below just like what dev_printk does? __entry->name = dev ? dev_name(dev) : NULL; > > We have ways to express dynamic string fields. Use them. > >> + __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", >> + __entry->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, const char *func, int ret), >> + TP_ARGS(dev, func, ret), >> + >> + TP_STRUCT__entry( >> + __field( const char *, name ) >> + __field( const char *, func ) >> + __field( int, ret ) >> + ), >> + >> + TP_fast_assign( >> + __entry->name = dev_name(dev); > > Same here. > >> + __entry->ret = ret; >> + __entry->func = func; > > And here. But as this is just __func__, you could use %pS and save the > pointer to the function. This is acceptable as kallsyms will will used > to find the function, and instead pass in __THIS_IP__ to the tracepoint. IMO, __func__ is better than %pS here because %pS will dump some offset info (such as runtime_suspend+0x0/0x158), but which is not needed in this case.( we just need to make return value to match the previous function name, such as below) rpm_suspend: omap_hsmmc.0 flags=9 ... rpm_return_int: rpm_suspend:omap_hsmmc.0 ret=0 > > -- Steve > > >> + ), >> + >> + TP_printk("%s:%s ret=%d", __entry->func, __entry->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 <tom.leiming@gmail.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); >> + > > > thanks, -- Ming Lei ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [RFC PATCH 1/2] PM/runtime: introduce trace points for tracing rpm_* functions 2011-09-27 0:53 ` Ming Lei @ 2011-09-27 1:11 ` Steven Rostedt 2011-09-27 1:45 ` Ming Lei 0 siblings, 1 reply; 8+ messages in thread From: Steven Rostedt @ 2011-09-27 1:11 UTC (permalink / raw) To: Ming Lei; +Cc: rjw, stern, linux-pm, linux-kernel, mingo, fweisbec On Tue, 2011-09-27 at 08:53 +0800, Ming Lei wrote: > Hi, > > On Mon, Sep 26, 2011 at 9:40 PM, Steven Rostedt <rostedt@goodmis.org> wrote: > > On Thu, 2011-09-22 at 12:11 +0800, tom.leiming@gmail.com wrote: > >> From: Ming Lei <tom.leiming@gmail.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(). > >> > >> Signed-off-by: Ming Lei <tom.leiming@gmail.com> > >> --- > >> include/trace/events/rpm.h | 98 ++++++++++++++++++++++++++++++++++++++++++++ > >> kernel/trace/Makefile | 1 + > >> kernel/trace/rpm-traces.c | 21 +++++++++ > >> 3 files changed, 120 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..ecd40bb > >> --- /dev/null > >> +++ b/include/trace/events/rpm.h > >> @@ -0,0 +1,98 @@ > >> + > >> +#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( > >> + __field( const char *, name ) > >> + __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( > >> + __entry->name = dev_name(dev); > > > > Don't use pointers, you must copy the name here. Otherwise, if the trace > > is read after the device has left, you will be referencing a invalid > > pointer and possible crash the kernel. > > Yes, you right, but __get_str() may introduce some extra loading, could > it be changed to below just like what dev_printk does? > > __entry->name = dev ? dev_name(dev) : NULL; Doesn't help. You just stored a pointer into the buffer. Now if the device's module is removed, when you go and read the buffer you will be reading a string that no longer exists. Not to mention, this will never work with tools such as perf or trace-cmd, that will just get a pointer address and will try to read a string that points inside the kernel. > > > > > We have ways to express dynamic string fields. Use them. > > > >> + __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", > >> + __entry->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, const char *func, int ret), > >> + TP_ARGS(dev, func, ret), > >> + > >> + TP_STRUCT__entry( > >> + __field( const char *, name ) > >> + __field( const char *, func ) > >> + __field( int, ret ) > >> + ), > >> + > >> + TP_fast_assign( > >> + __entry->name = dev_name(dev); > > > > Same here. > > > >> + __entry->ret = ret; > >> + __entry->func = func; > > > > And here. But as this is just __func__, you could use %pS and save the > > pointer to the function. This is acceptable as kallsyms will will used > > to find the function, and instead pass in __THIS_IP__ to the tracepoint. > > IMO, __func__ is better than %pS here because %pS will dump some > offset info (such as runtime_suspend+0x0/0x158), but which is > not needed in this case.( we just need to make return value to match the > previous function name, such as below) This will only work with reading the trace data from /debug/tracing/trace, but not from any tools. The pS *will* work with the tools as the tools load the kallsyms data, and is smart enough to figure this pointer out. -- Steve > > rpm_suspend: omap_hsmmc.0 flags=9 > ... > rpm_return_int: rpm_suspend:omap_hsmmc.0 ret=0 > > > > > -- Steve > > > > > >> + ), > >> + > >> + TP_printk("%s:%s ret=%d", __entry->func, __entry->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 <tom.leiming@gmail.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); > >> + > > > > > > > > > thanks, ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [RFC PATCH 1/2] PM/runtime: introduce trace points for tracing rpm_* functions 2011-09-27 1:11 ` Steven Rostedt @ 2011-09-27 1:45 ` Ming Lei 2011-09-27 2:37 ` Steven Rostedt 0 siblings, 1 reply; 8+ messages in thread From: Ming Lei @ 2011-09-27 1:45 UTC (permalink / raw) To: Steven Rostedt; +Cc: rjw, stern, linux-pm, linux-kernel, mingo, fweisbec On Tue, Sep 27, 2011 at 9:11 AM, Steven Rostedt <rostedt@goodmis.org> wrote: > On Tue, 2011-09-27 at 08:53 +0800, Ming Lei wrote: >> Hi, >> >> On Mon, Sep 26, 2011 at 9:40 PM, Steven Rostedt <rostedt@goodmis.org> wrote: >> > On Thu, 2011-09-22 at 12:11 +0800, tom.leiming@gmail.com wrote: >> >> From: Ming Lei <tom.leiming@gmail.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(). >> >> >> >> Signed-off-by: Ming Lei <tom.leiming@gmail.com> >> >> --- >> >> include/trace/events/rpm.h | 98 ++++++++++++++++++++++++++++++++++++++++++++ >> >> kernel/trace/Makefile | 1 + >> >> kernel/trace/rpm-traces.c | 21 +++++++++ >> >> 3 files changed, 120 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..ecd40bb >> >> --- /dev/null >> >> +++ b/include/trace/events/rpm.h >> >> @@ -0,0 +1,98 @@ >> >> + >> >> +#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( >> >> + __field( const char *, name ) >> >> + __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( >> >> + __entry->name = dev_name(dev); >> > >> > Don't use pointers, you must copy the name here. Otherwise, if the trace >> > is read after the device has left, you will be referencing a invalid >> > pointer and possible crash the kernel. >> >> Yes, you right, but __get_str() may introduce some extra loading, could >> it be changed to below just like what dev_printk does? >> >> __entry->name = dev ? dev_name(dev) : NULL; > > Doesn't help. You just stored a pointer into the buffer. Now if the > device's module is removed, when you go and read the buffer you will be > reading a string that no longer exists. > > Not to mention, this will never work with tools such as perf or > trace-cmd, that will just get a pointer address and will try to read a > string that points inside the kernel. Ok, sounds like dev_name does not work for the case, I will update the patch, but I am wondering why no such problem for dev_dbg? printk still may buffer these for sometime in some cases. > >> >> > >> > We have ways to express dynamic string fields. Use them. >> > >> >> + __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", >> >> + __entry->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, const char *func, int ret), >> >> + TP_ARGS(dev, func, ret), >> >> + >> >> + TP_STRUCT__entry( >> >> + __field( const char *, name ) >> >> + __field( const char *, func ) >> >> + __field( int, ret ) >> >> + ), >> >> + >> >> + TP_fast_assign( >> >> + __entry->name = dev_name(dev); >> > >> > Same here. >> > >> >> + __entry->ret = ret; >> >> + __entry->func = func; >> > >> > And here. But as this is just __func__, you could use %pS and save the >> > pointer to the function. This is acceptable as kallsyms will will used >> > to find the function, and instead pass in __THIS_IP__ to the tracepoint. >> >> IMO, __func__ is better than %pS here because %pS will dump some >> offset info (such as runtime_suspend+0x0/0x158), but which is >> not needed in this case.( we just need to make return value to match the >> previous function name, such as below) > > This will only work with reading the trace data > from /debug/tracing/trace, but not from any tools. The pS *will* work > with the tools as the tools load the kallsyms data, and is smart enough > to figure this pointer out. __func__ points to a const string, which will be stored in kernel global read-only section, I think perf can read correct string from the pointer anytime, don't I? thanks, -- Ming Lei > > -- Steve > >> >> rpm_suspend: omap_hsmmc.0 flags=9 >> ... >> rpm_return_int: rpm_suspend:omap_hsmmc.0 ret=0 >> >> > >> > -- Steve >> > >> > >> >> + ), >> >> + >> >> + TP_printk("%s:%s ret=%d", __entry->func, __entry->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 <tom.leiming@gmail.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); >> >> + >> > >> > >> > >> >> >> thanks, > > > -- Ming Lei ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [RFC PATCH 1/2] PM/runtime: introduce trace points for tracing rpm_* functions 2011-09-27 1:45 ` Ming Lei @ 2011-09-27 2:37 ` Steven Rostedt 0 siblings, 0 replies; 8+ messages in thread From: Steven Rostedt @ 2011-09-27 2:37 UTC (permalink / raw) To: Ming Lei; +Cc: rjw, stern, linux-pm, linux-kernel, mingo, fweisbec On Tue, 2011-09-27 at 09:45 +0800, Ming Lei wrote: > > Not to mention, this will never work with tools such as perf or > > trace-cmd, that will just get a pointer address and will try to read a > > string that points inside the kernel. > > Ok, sounds like dev_name does not work for the case, I will update > the patch, but I am wondering why no such problem for dev_dbg? > printk still may buffer these for sometime in some cases. > printk will push out to the console immediately. Whatever is in the buffer has already been processed into a string. With tracing, we save the data as defined by TP_fast_assign() and is printed later when the user asks in TP_printk(). > > > > This will only work with reading the trace data > > from /debug/tracing/trace, but not from any tools. The pS *will* work > > with the tools as the tools load the kallsyms data, and is smart enough > > to figure this pointer out. > > __func__ points to a const string, which will be stored in kernel global > read-only section, I think perf can read correct string from the pointer > anytime, don't I? That would be very dangerous to let a userspace app have any access to reading the kernel memory. Not to mention, this data may be sent out over the network to another machine, which must be able to read this data too. -- Steve ^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2011-09-27 2:38 UTC | newest] Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2011-09-22 4:11 [RFC PATCH 1/2] PM/runtime: introduce trace points for tracing rpm_* functions tom.leiming 2011-09-22 4:11 ` [RFC PATCH 2/2] PM/runtime: replace dev_dbg with trace_rpm_* tom.leiming 2011-09-25 14:43 ` [RFC PATCH 1/2] PM/runtime: introduce trace points for tracing rpm_* functions Rafael J. Wysocki 2011-09-26 13:40 ` Steven Rostedt 2011-09-27 0:53 ` Ming Lei 2011-09-27 1:11 ` Steven Rostedt 2011-09-27 1:45 ` Ming Lei 2011-09-27 2:37 ` Steven Rostedt
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox
Powered by JetHome