diff mbox series

[v11,08/19] drm_print: add trace_drm_dbg, trace_drm_devdbg events

Message ID 20220107052942.1349447-9-jim.cromie@gmail.com (mailing list archive)
State New, archived
Headers show
Series dyndbg & drm.debug to tracefs | expand

Commit Message

Jim Cromie Jan. 7, 2022, 5:29 a.m. UTC
__drm_debug() and __drm_dev_dbg() currently printk to syslog.  These 2
underlay the vast bulk of DRM.debug api calls; they are a significant
source of debugging info, and could add useful context to debug traces.

Wire them to emit 2 new trace_*() events: drm_prdbg and drm_devdbg.

These events keep the args of those 2 callers:
- int/enum category, va_format *vaf
- struct device *dev, int/enum category, va_format *vaf

ISTM best to reflect args thru w/o altering; it is simple, least
surprising, and preserves info for possible filtering/selecting
events.

NOTES:

trace_*() additions are strictly redundant with printks to syslog, not
properly placed to reduce overall work.

Reuses trim-trailing-newline trick on vnsprintf

TLDR: The event called by __drm_dev_dbg() depends upon !!dev; theres
little value to storing a null in the trace. Yes, one could know that
devdbg was called with a null, but is that worthwhile ?  And if you
really needed to know the call (not available from control-file
format) the file:line gets you there.

Signed-off-by: Jim Cromie <jim.cromie@gmail.com>
---
 drivers/gpu/drm/drm_print.c | 13 +++++--
 include/trace/events/drm.h  | 68 +++++++++++++++++++++++++++++++++++++
 2 files changed, 78 insertions(+), 3 deletions(-)
 create mode 100644 include/trace/events/drm.h
diff mbox series

Patch

diff --git a/drivers/gpu/drm/drm_print.c b/drivers/gpu/drm/drm_print.c
index f783d4963d4b..cfcb89ffd89d 100644
--- a/drivers/gpu/drm/drm_print.c
+++ b/drivers/gpu/drm/drm_print.c
@@ -36,6 +36,9 @@ 
 #include <drm/drm_drv.h>
 #include <drm/drm_print.h>
 
+#define CREATE_TRACE_POINTS
+#include <trace/events/drm.h>
+
 /*
  * __drm_debug: Enable debug output.
  * Bitmask of DRM_UT_x. See include/drm/drm_print.h for details.
@@ -269,13 +272,15 @@  void drm_dev_dbg(const struct device *dev, enum drm_debug_category category,
 	vaf.fmt = format;
 	vaf.va = &args;
 
-	if (dev)
+	if (dev) {
 		dev_printk(KERN_DEBUG, dev, "[" DRM_NAME ":%ps] %pV",
 			   __builtin_return_address(0), &vaf);
-	else
+		trace_drm_devdbg(dev, category, &vaf);
+	} else {
 		printk(KERN_DEBUG "[" DRM_NAME ":%ps] %pV",
 		       __builtin_return_address(0), &vaf);
-
+		trace_drm_debug(category, &vaf);
+	}
 	va_end(args);
 }
 EXPORT_SYMBOL(drm_dev_dbg);
@@ -295,6 +300,8 @@  void __drm_dbg(enum drm_debug_category category, const char *format, ...)
 	printk(KERN_DEBUG "[" DRM_NAME ":%ps] %pV",
 	       __builtin_return_address(0), &vaf);
 
+	trace_drm_debug(category, &vaf);
+
 	va_end(args);
 }
 EXPORT_SYMBOL(__drm_dbg);
diff --git a/include/trace/events/drm.h b/include/trace/events/drm.h
new file mode 100644
index 000000000000..944aedaf6aa6
--- /dev/null
+++ b/include/trace/events/drm.h
@@ -0,0 +1,68 @@ 
+/* SPDX-License-Identifier: GPL-2.0 */
+#undef TRACE_SYSTEM
+#define TRACE_SYSTEM drm
+
+#if !defined(_TRACE_DRM_H) || defined(TRACE_HEADER_MULTI_READ)
+#define _TRACE_DRM_H
+
+#include <linux/tracepoint.h>
+
+/* drm_debug() was called, pass its args */
+TRACE_EVENT(drm_debug,
+	TP_PROTO(int drm_debug_category, struct va_format *vaf),
+
+	TP_ARGS(drm_debug_category, vaf),
+
+	TP_STRUCT__entry(
+		__field(int, drm_debug_category)
+		__dynamic_array(char, msg, 256)
+	),
+
+	TP_fast_assign(
+		int len;
+
+		__entry->drm_debug_category = drm_debug_category;
+		vsnprintf(__get_str(msg), 256, vaf->fmt, *vaf->va);
+
+		len = strlen(__get_str(msg));
+		if ((len > 0) && (__get_str(msg)[len-1] == '\n'))
+			len -= 1;
+		__get_str(msg)[len] = 0;
+	),
+
+	TP_printk("%s", __get_str(msg))
+);
+
+/* drm_devdbg() was called, pass its args, preserving order */
+TRACE_EVENT(drm_devdbg,
+	TP_PROTO(const struct device *dev, int drm_debug_category, struct va_format *vaf),
+
+	TP_ARGS(dev, drm_debug_category, vaf),
+
+	TP_STRUCT__entry(
+		__field(const struct device*, dev)
+		__field(int, drm_debug_category)
+		__dynamic_array(char, msg, 256)
+	),
+
+	TP_fast_assign(
+		int len;
+
+		__entry->drm_debug_category = drm_debug_category;
+		__entry->dev = dev;
+		vsnprintf(__get_str(msg), 256, vaf->fmt, *vaf->va);
+
+		len = strlen(__get_str(msg));
+		if ((len > 0) && (__get_str(msg)[len-1] == '\n'))
+			len -= 1;
+		__get_str(msg)[len] = 0;
+	),
+
+	TP_printk("cat:%d, %s %s", __entry->drm_debug_category,
+		  dev_name(__entry->dev), __get_str(msg))
+);
+
+#endif /* _TRACE_DRM_H */
+
+/* This part must be outside protection */
+#include <trace/define_trace.h>