From: Jim Cromie <jim.cromie@gmail.com>
To: jbaron@akamai.com
Cc: Jim Cromie <jim.cromie@gmail.com>,
nouveau@lists.freedesktop.org, intel-gfx@lists.freedesktop.org,
amd-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org
Subject: [PATCH v3 10/41] dyndbg: add class_id to pr_debug callsites
Date: Mon, 18 Jul 2022 00:35:54 -0600 [thread overview]
Message-ID: <20220718063641.9179-11-jim.cromie@gmail.com> (raw)
In-Reply-To: <20220718063641.9179-1-jim.cromie@gmail.com>
DRM issues ~10 exclusive categories of debug messages; to represent
this directly in dyndbg, add a new field: struct _ddebug.class_id:5.
This gives us 32 classes, which is a practical usability limit
with a bitmap interface:
#> echo 0x012345678 > /sys/module/drm/parameters/debug
All existing callsites are initialized with _DPRINTK_CLASS_DFLT, which
is 2^5-1. This reserves 0-30 for use in new categorized/class'd
pr_debugs, which fits perfectly with natural enums (ints: 0..N).
Then extend the init macro: DEFINE_DYNAMIC_DEBUG_METADATA() with
_CLS(cls, ...), and redef old name using extended name.
And extend the factory macro callchain with _cls() versions to provide
the callsite.class_id, with old-names passing _DPRINTK_CLASS_DFLT.
This sets us up to create class'd prdebug callsites (class'd callsites
are those with .class_id != _DPRINTK_CLASS_DFLT).
No behavior change.
Signed-off-by: Jim Cromie <jim.cromie@gmail.com>
---
include/linux/dynamic_debug.h | 71 +++++++++++++++++++++++++++--------
1 file changed, 55 insertions(+), 16 deletions(-)
diff --git a/include/linux/dynamic_debug.h b/include/linux/dynamic_debug.h
index 8d9eec5f6d8b..d1429812be2e 100644
--- a/include/linux/dynamic_debug.h
+++ b/include/linux/dynamic_debug.h
@@ -6,6 +6,8 @@
#include <linux/jump_label.h>
#endif
+#include <linux/build_bug.h>
+
/*
* An instance of this structure is created in a special
* ELF section at every dynamic debug callsite. At runtime,
@@ -21,6 +23,9 @@ struct _ddebug {
const char *filename;
const char *format;
unsigned int lineno:18;
+#define CLS_BITS 5
+ unsigned int class_id:CLS_BITS;
+#define _DPRINTK_CLASS_DFLT ((1 << CLS_BITS) - 1)
/*
* The flags field controls the behaviour at the callsite.
* The bits here are changed dynamically when the user
@@ -84,7 +89,7 @@ void __dynamic_ibdev_dbg(struct _ddebug *descriptor,
const struct ib_device *ibdev,
const char *fmt, ...);
-#define DEFINE_DYNAMIC_DEBUG_METADATA(name, fmt) \
+#define DEFINE_DYNAMIC_DEBUG_METADATA_CLS(name, cls, fmt) \
static struct _ddebug __aligned(8) \
__section("__dyndbg") name = { \
.modname = KBUILD_MODNAME, \
@@ -93,8 +98,14 @@ void __dynamic_ibdev_dbg(struct _ddebug *descriptor,
.format = (fmt), \
.lineno = __LINE__, \
.flags = _DPRINTK_FLAGS_DEFAULT, \
+ .class_id = cls, \
_DPRINTK_KEY_INIT \
- }
+ }; \
+ BUILD_BUG_ON_MSG(cls > _DPRINTK_CLASS_DFLT, \
+ "classid value overflow")
+
+#define DEFINE_DYNAMIC_DEBUG_METADATA(name, fmt) \
+ DEFINE_DYNAMIC_DEBUG_METADATA_CLS(name, _DPRINTK_CLASS_DFLT, fmt)
#ifdef CONFIG_JUMP_LABEL
@@ -125,17 +136,34 @@ void __dynamic_ibdev_dbg(struct _ddebug *descriptor,
#endif /* CONFIG_JUMP_LABEL */
-#define __dynamic_func_call(id, fmt, func, ...) do { \
- DEFINE_DYNAMIC_DEBUG_METADATA(id, fmt); \
- if (DYNAMIC_DEBUG_BRANCH(id)) \
- func(&id, ##__VA_ARGS__); \
-} while (0)
-
-#define __dynamic_func_call_no_desc(id, fmt, func, ...) do { \
- DEFINE_DYNAMIC_DEBUG_METADATA(id, fmt); \
+/*
+ * Factory macros: ($prefix)dynamic_func_call($suffix)
+ *
+ * Lower layer (with __ prefix) gets the callsite metadata, and wraps
+ * the func inside a debug-branch/static-key construct. Upper layer
+ * (with _ prefix) does the UNIQUE_ID once, so that lower can ref the
+ * name/label multiple times, and tie the elements together.
+ * Multiple flavors:
+ * (|_cls): adds in _DPRINT_CLASS_DFLT as needed
+ * (|_no_desc): former gets callsite descriptor as 1st arg (for prdbgs)
+ */
+#define __dynamic_func_call_cls(id, cls, fmt, func, ...) do { \
+ DEFINE_DYNAMIC_DEBUG_METADATA_CLS(id, cls, fmt); \
if (DYNAMIC_DEBUG_BRANCH(id)) \
- func(__VA_ARGS__); \
+ func(&id, ##__VA_ARGS__); \
} while (0)
+#define __dynamic_func_call(id, fmt, func, ...) \
+ __dynamic_func_call_cls(id, _DPRINTK_CLASS_DFLT, fmt, \
+ func, ##__VA_ARGS__)
+
+#define __dynamic_func_call_cls_no_desc(id, cls, fmt, func, ...) do { \
+ DEFINE_DYNAMIC_DEBUG_METADATA_CLS(id, cls, fmt); \
+ if (DYNAMIC_DEBUG_BRANCH(id)) \
+ func(__VA_ARGS__); \
+} while (0)
+#define __dynamic_func_call_no_desc(id, fmt, func, ...) \
+ __dynamic_func_call_cls_no_desc(id, _DPRINTK_CLASS_DFLT, \
+ fmt, func, ##__VA_ARGS__)
/*
* "Factory macro" for generating a call to func, guarded by a
@@ -145,22 +173,33 @@ void __dynamic_ibdev_dbg(struct _ddebug *descriptor,
* the varargs. Note that fmt is repeated in invocations of this
* macro.
*/
+#define _dynamic_func_call_cls(cls, fmt, func, ...) \
+ __dynamic_func_call_cls(__UNIQUE_ID(ddebug), cls, fmt, func, ##__VA_ARGS__)
#define _dynamic_func_call(fmt, func, ...) \
- __dynamic_func_call(__UNIQUE_ID(ddebug), fmt, func, ##__VA_ARGS__)
+ _dynamic_func_call_cls(_DPRINTK_CLASS_DFLT, fmt, func, ##__VA_ARGS__)
+
/*
* A variant that does the same, except that the descriptor is not
* passed as the first argument to the function; it is only called
* with precisely the macro's varargs.
*/
-#define _dynamic_func_call_no_desc(fmt, func, ...) \
- __dynamic_func_call_no_desc(__UNIQUE_ID(ddebug), fmt, func, ##__VA_ARGS__)
+#define _dynamic_func_call_cls_no_desc(cls, fmt, func, ...) \
+ __dynamic_func_call_cls_no_desc(__UNIQUE_ID(ddebug), cls, fmt, \
+ func, ##__VA_ARGS__)
+#define _dynamic_func_call_no_desc(fmt, func, ...) \
+ _dynamic_func_call_cls_no_desc(_DPRINTK_CLASS_DFLT, fmt, \
+ func, ##__VA_ARGS__)
+
+#define dynamic_pr_debug_cls(cls, fmt, ...) \
+ _dynamic_func_call_cls(cls, fmt, __dynamic_pr_debug, \
+ pr_fmt(fmt), ##__VA_ARGS__)
#define dynamic_pr_debug(fmt, ...) \
- _dynamic_func_call(fmt, __dynamic_pr_debug, \
+ _dynamic_func_call(fmt, __dynamic_pr_debug, \
pr_fmt(fmt), ##__VA_ARGS__)
#define dynamic_dev_dbg(dev, fmt, ...) \
- _dynamic_func_call(fmt,__dynamic_dev_dbg, \
+ _dynamic_func_call(fmt, __dynamic_dev_dbg, \
dev, fmt, ##__VA_ARGS__)
#define dynamic_netdev_dbg(dev, fmt, ...) \
--
2.36.1
next prev parent reply other threads:[~2022-07-18 6:38 UTC|newest]
Thread overview: 58+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-07-18 6:35 [PATCH v3 00/41] DYNDBG: opt-in class'd debug for modules, use in drm Jim Cromie
2022-07-18 6:35 ` [PATCH v3 01/41] dyndbg: fix static_branch manipulation Jim Cromie
2022-07-18 6:35 ` [PATCH v3 02/41] dyndbg: fix module.dyndbg handling Jim Cromie
2022-07-18 6:35 ` [PATCH v3 03/41] dyndbg: show both old and new in change-info Jim Cromie
2022-07-18 6:35 ` [PATCH v3 04/41] dyndbg: reverse module walk in cat control Jim Cromie
2022-07-18 6:35 ` [PATCH v3 05/41] dyndbg: reverse module.callsite " Jim Cromie
2022-07-18 6:35 ` [PATCH v3 06/41] dyndbg: use ESCAPE_SPACE for " Jim Cromie
2022-07-18 6:35 ` [PATCH v3 07/41] dyndbg: let query-modname override actual module name Jim Cromie
2022-07-18 6:35 ` [PATCH v3 08/41] dyndbg: add test_dynamic_debug module Jim Cromie
2022-07-18 6:35 ` [PATCH v3 09/41] dyndbg: drop EXPORTed dynamic_debug_exec_queries Jim Cromie
2022-07-18 6:35 ` Jim Cromie [this message]
2022-07-18 6:35 ` [PATCH v3 11/41] dyndbg: add __pr_debug_cls for testing Jim Cromie
2022-07-18 6:35 ` [PATCH v3 12/41] dyndbg: add DECLARE_DYNDBG_CLASSMAP Jim Cromie
2022-07-18 6:35 ` [PATCH v3 13/41] kernel/module: add __dyndbg_classes section Jim Cromie
2022-07-18 6:35 ` [PATCH v3 14/41] dyndbg: add ddebug_attach_module_classes Jim Cromie
2022-07-18 6:35 ` [PATCH v3 15/41] dyndbg: validate class FOO by checking with module Jim Cromie
2022-07-18 6:36 ` [PATCH v3 16/41] dyndbg: add drm.debug style bitmap support Jim Cromie
2022-07-18 6:36 ` [PATCH v3 17/41] dyndbg: test DECLARE_DYNDBG_CLASSMAP, sysfs nodes Jim Cromie
2022-07-18 6:36 ` [PATCH v3 18/41] doc-dyndbg: describe "class CLASS_NAME" query support Jim Cromie
2022-07-18 6:36 ` [PATCH v3 19/41] doc-dyndbg: edit dynamic-debug-howto for brevity, audience Jim Cromie
2022-07-18 6:36 ` [PATCH v3 20/41] drm_print: condense enum drm_debug_category Jim Cromie
2022-07-18 6:36 ` [PATCH v3 21/41] drm: POC drm on dyndbg - use in core, 2 helpers, 3 drivers Jim Cromie
2022-07-18 6:36 ` [PATCH v3 22/41] drm_print: interpose drm_*dbg with forwarding macros Jim Cromie
2022-07-18 6:36 ` [PATCH v3 23/41] drm_print: wrap drm_*_dbg in dyndbg descriptor factory macro Jim Cromie
2022-07-18 6:36 ` [PATCH v3 24/41] drm-print: add drm_dbg_driver to improve namespace symmetry Jim Cromie
2022-07-18 6:36 ` [PATCH v3 24/39] drm-print: include dyndbg header indirectly Jim Cromie
2022-07-18 6:36 ` [PATCH v3 25/41] " Jim Cromie
2022-07-18 6:36 ` [PATCH v3 25/39] drm_print: refine drm_debug_enabled for jump-label Jim Cromie
2022-07-18 6:36 ` [PATCH v3 26/39] drm_print: prefer bare printk KERN_DEBUG on generic fn Jim Cromie
2022-07-18 6:36 ` [PATCH v3 26/41] drm_print: refine drm_debug_enabled for jump-label Jim Cromie
2022-07-18 6:36 ` [PATCH v3 27/39] drm_print: add _ddebug descriptor to drm_*dbg prototypes Jim Cromie
2022-07-18 6:36 ` [PATCH v3 27/41] drm_print: prefer bare printk KERN_DEBUG on generic fn Jim Cromie
2022-07-18 6:36 ` [PATCH v3 28/41] drm_print: add _ddebug descriptor to drm_*dbg prototypes Jim Cromie
2022-07-18 6:36 ` [PATCH v3 28/39] nouveau: change nvkm_debug/trace to use dev_dbg POC Jim Cromie
2022-07-18 6:36 ` [PATCH v3 29/39] dyndbg: add _DPRINTK_FLAGS_ENABLED Jim Cromie
2022-07-18 6:36 ` [PATCH v3 29/41] nouveau: change nvkm_debug/trace to use dev_dbg POC Jim Cromie
2022-07-18 6:36 ` [PATCH v3 30/39] dyndbg: add _DPRINTK_FLAGS_TRACE Jim Cromie
2022-07-18 6:36 ` [PATCH v3 30/41] tracing/events: Add __vstring() and __assign_vstr() helper macros Jim Cromie
2022-07-18 6:36 ` [PATCH v3 31/41] dyndbg: add _DPRINTK_FLAGS_ENABLED Jim Cromie
2022-07-18 6:36 ` [PATCH v3 31/39] dyndbg: add write-events-to-tracefs code Jim Cromie
2022-07-18 6:36 ` [PATCH v3 32/39] dyndbg: 4 new trace-events: pr_debug, dev_dbg, drm_{, dev}debug Jim Cromie
2022-07-18 6:36 ` [PATCH v3 32/41] dyndbg: add _DPRINTK_FLAGS_TRACE Jim Cromie
2022-07-18 6:36 ` [PATCH v3 33/41] dyndbg: add write-events-to-tracefs code Jim Cromie
2022-07-18 6:36 ` [PATCH v3 33/39] dyndbg/drm: POC add tracebits sysfs-knob Jim Cromie
2022-07-18 6:36 ` [PATCH v3 34/39] drm-print: add drm_dbg_driver, improve namespace symmetry Jim Cromie
2022-07-18 6:36 ` [PATCH v3 34/41] dyndbg: add 2 trace-events: drm_{,dev}debug Jim Cromie
2022-07-18 6:36 ` [PATCH v3 35/41] dyndbg: add 2 more trace-events: pr_debug, dev_dbg Jim Cromie
2022-07-18 6:36 ` [PATCH v3 35/39] nouveau: adapt NV_DEBUG, NV_ATOMIC to use DRM.debug Jim Cromie
2022-07-18 6:36 ` [PATCH v3 36/41] dyndbg/drm: POC add tracebits sysfs-knob Jim Cromie
2022-07-18 6:36 ` [PATCH v3 36/39] nv-subdev-debug Jim Cromie
2022-07-18 6:36 ` [PATCH v3 37/41] nouveau: adapt NV_DEBUG, NV_ATOMIC to use DRM.debug Jim Cromie
2022-07-18 6:36 ` [PATCH v3 37/39] nouveau-dbg: add 2 verbose-classmaps for CLI, SUBDEV Jim Cromie
2022-07-18 6:36 ` [PATCH v3 38/39] nouveau-dbg: fixup lost prdbgs Jim Cromie
2022-07-18 6:36 ` [PATCH v3 38/41] nouveau-dyndbg: alter DEBUG, TRACE, SPAM levels to use dyndbg Jim Cromie
2022-07-18 6:36 ` [PATCH v3 39/41] nouveau-dbg: add 2 verbose-classmaps for CLI, SUBDEV Jim Cromie
2022-07-18 6:36 ` [PATCH v3 39/39] wip subdev refine breaks on use Jim Cromie
2022-07-18 6:36 ` [PATCH v3 40/41] nouveau-dbg: fixup lost prdbgs Jim Cromie
2022-07-18 6:36 ` [PATCH v3 41/41] nouveau-dyndbg: wip subdev refine, breaks on use Jim Cromie
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20220718063641.9179-11-jim.cromie@gmail.com \
--to=jim.cromie@gmail.com \
--cc=amd-gfx@lists.freedesktop.org \
--cc=dri-devel@lists.freedesktop.org \
--cc=intel-gfx@lists.freedesktop.org \
--cc=jbaron@akamai.com \
--cc=nouveau@lists.freedesktop.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox