Recently added ddebug_trace() issues a single printk:console event.
Replace that event with 2 new ones, defined in a new header:
include/trace/events/dyndbg.h

- dyndbg:prdbg  - from trace_prdbg()  - if !dev
- dyndbg:devdbg - from trace_devdbg() - if !!dev

This links the legacy pr_debug API to tracefs, so pr_debug() and
dev_dbg() calls can add more debug context into the trace-logs, and
then at users option, less into syslog.

The new events allow enabling by event-type in tracefs, and dyndbg
allows individual enablement of prdbg callsites (via +T flag).

Signed-off-by: Jim Cromie <jim.cro...@gmail.com>
---
 drivers/gpu/drm/drm_print.c | 25 ++++++++++++-----
 include/trace/events/drm.h  | 54 +++++++++++++++++++++++++++++++++++++
 2 files changed, 72 insertions(+), 7 deletions(-)
 create mode 100644 include/trace/events/drm.h

diff --git a/drivers/gpu/drm/drm_print.c b/drivers/gpu/drm/drm_print.c
index 5b93c11895bb..c50edbf443d3 100644
--- a/drivers/gpu/drm/drm_print.c
+++ b/drivers/gpu/drm/drm_print.c
@@ -35,6 +35,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.
@@ -293,13 +296,19 @@ void __drm_dev_dbg(struct _ddebug *desc, const struct 
device *dev,
        vaf.fmt = format;
        vaf.va = &args;
 
-       if (dev)
-               dev_printk(KERN_DEBUG, dev, "[" DRM_NAME ":%ps] %pV",
-                          __builtin_return_address(0), &vaf);
-       else
-               printk(KERN_DEBUG "[" DRM_NAME ":%ps] %pV",
-                      __builtin_return_address(0), &vaf);
-
+       if (dev) {
+               if (desc->flags & _DPRINTK_FLAGS_PRINTK)
+                       dev_printk(KERN_DEBUG, dev, "[" DRM_NAME ":%ps] %pV",
+                                  __builtin_return_address(0), &vaf);
+               if (desc->flags & _DPRINTK_FLAGS_TRACE)
+                       trace_drm_devdbg(dev, category, &vaf);
+       } else {
+               if (desc->flags & _DPRINTK_FLAGS_PRINTK)
+                       printk(KERN_DEBUG "[" DRM_NAME ":%ps] %pV",
+                              __builtin_return_address(0), &vaf);
+               if (desc->flags & _DPRINTK_FLAGS_TRACE)
+                       trace_drm_debug(category, &vaf);
+       }
        va_end(args);
 }
 EXPORT_SYMBOL(__drm_dev_dbg);
@@ -319,6 +328,8 @@ void ___drm_dbg(struct _ddebug *desc, enum 
drm_debug_category category, const ch
        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..589fa1e1f2c2
--- /dev/null
+++ b/include/trace/events/drm.h
@@ -0,0 +1,54 @@
+/* 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)
+                   __vstring(msg, vaf->fmt, vaf->va)
+                   ),
+
+           TP_fast_assign(
+                   __entry->drm_debug_category = drm_debug_category;
+                   __assign_vstr(msg, vaf->fmt, vaf->va);
+                   ),
+
+           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)
+                   __vstring(msg, vaf->fmt, vaf->va)
+                   ),
+
+           TP_fast_assign(
+                   __entry->drm_debug_category = drm_debug_category;
+                   __entry->dev = dev;
+                   __assign_vstr(msg, vaf->fmt, vaf->va);
+                   ),
+
+           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>
-- 
2.37.2

Reply via email to