[PATCH 00/12] use dynamic-debug under drm.debug api

From: Jim Cromie
Date: Tue Mar 01 2022 - 11:46:53 EST


hi Jason, Greg, Daniel, DRM-everyone

drm.debug api provides ~23 macros to issue 10 categories of debug
messages, each enabled by a bit in /sys/module/drm/parameters/debug.
drm_debug_enabled(category) tests these bits at runtime; while cheap
individually, the costs accumulate.

Daniel,
I think this revision addresses most of your early review, a lot has
changed since. Heres the link:
https://patchwork.freedesktop.org/patch/443989/

For CONFIG_DRM_USE_DYNAMIC_DEBUG=y, this patchset obsoletes those
runtime tests (inside drm_*dbg) by wrapping the 2 fns in one of the
dynamic_func_call* Factory macros. The config dependence is due to
the .data footprint cost of the tables; AMDGPU has ~4k callsites, at
56 bytes each.

This patchset creates entries in /proc/dynamic_debug/control for each
callsite, and each has .class_id = macros' category. Those entries,
and a new query keyword, allow (1st):

# 1=DRM_UT_KMS (iirc)
#> echo "module drm class 1 +p > /proc/dynamic_debug/control

Then equivalently:
# except it also clears other flags
#> echo 0x01 > /sys/module/drm/parameters/debug

series overview:

dyndbg:
- fix a bug in dyndbg static_key toggling, @stable cc'd
- adds support for distinct classes to dyndbg (new,unused feature)
- add DECLARE_DYNAMIC_DEBUG_CLASSBITS macro and callbacks
to implement bitmap -> classid sysfs knob
dyndbg:
- drops exported fn: dynamic_debug_exec_queries()
any potential users would just use macro, or a tweak on it.
- improve info-msg to print both "old -> new" flags
drm:
- adapts drm debug category to dyndbg.class_id
- wraps drm_*dbg() in a dyndbg Factory macro to get NOOP optimized debugs
this disconnects drm.debug sysfs knob
- uses DECLARE_DYNAMIC_DEBUG_CLASSBITS macro
this reconnects sysfs knob

This could be -v12, but the focus and subject has wandered a bit, and
patchwork CI had multiple different notions of the version.

Noteworthy changes:

- no tracefs stuff here, refocus

In contrast, the previous drm.debug approach:

- replaced drm_dbg & drm_devdbg with calls to pr_debug & dev_dbg
this preserved the optional decorations: module:function:line:

- used DRM_UT_CORE => "drm:core:" prefix-string, cpp cat'd to formats
this made sites selectable by matching to that format prefix

This version:

- .class_id is easier to explain, and no config/format-string diffs

- wraps drm_dbg & drm_devdbg callsites for jumplabel enablement
efficiency was original goal.

- loses the optional decorations.
drm has its own logmsg standards, doesn't need decorations slapped on
later: could recast flags for drm specific decorations

This is based on 5.17-rc4, for no particular reason.

Its also here: in (dd-drm branch)
ghlinux-ro https://github.com/jimc/linux.git (fetch)


Jim Cromie (13):
dyndbg: fix static_branch manipulation @stable
dyndbg: add class_id field and query support
dyndbg: add DEFINE_DYNAMIC_DEBUG_CLASSBITS macro and callbacks
dyndbg: drop EXPORTed dynamic_debug_exec_queries
dyndbg: improve change-info to have old and new
dyndbg: abstract dyndbg_site_is_printing
drm_print: condense enum drm_debug_category
drm_print: interpose drm_*dbg with forwarding macros
drm_print: wrap drm_*_dbg in dyndbg jumplabel
drm_print: refine drm_debug_enabled for dyndbg+jump-label
drm_print: prefer bare printk KERN_DEBUG on generic fn
drm_print: add _ddebug desc to drm_*dbg prototypes
drm_print: use DEFINE_DYNAMIC_DEBUG_CLASSBITS for drm.debug

.../admin-guide/dynamic-debug-howto.rst | 7 +
drivers/gpu/drm/Kconfig | 12 ++
drivers/gpu/drm/Makefile | 2 +
drivers/gpu/drm/drm_print.c | 56 ++++---
include/drm/drm_print.h | 80 +++++++---
include/linux/dynamic_debug.h | 113 +++++++++++---
lib/dynamic_debug.c | 140 ++++++++++++++----
7 files changed, 323 insertions(+), 87 deletions(-)

--
2.35.1