[PATCH v6 00/57] DYNDBG: opt-in class'd debug for modules, use in drm.

Jim Cromie jim.cromie at gmail.com
Sun Sep 4 21:40:37 UTC 2022


hi Greg, Jason, DRM-folk, Steven,

If Im not too late for linux-next in this cycle, heres V6.  Diffs are minor:

 - rebased onto e47eb90a0a9a (tag: next-20220901, linux-next/master)
   gets past Kconfig conflict, same for drm-tip.
 - uint debug_level, not ulong.  to fit nouveau.
 - -1 on param-read-back, to match prev write val.
 - added back tracefs parts, missing from -V5
   updated for tracing/events: Add __vstring() and __assign_vstr() helper macros
   no decorations-lite in TP_printk, do it right later.
 - commit-msg tweaks

Theres also new RFC stuff with the potential to reduce the size of the
__dyndbgs section by 20%.  Not ready for prime time, or linux-next,
but I hope compelling.

FEATURE DESCRIPTION

dyndbg provides DECLARE_DYNAMIC_DEBUG_CLASSMAP() which allows module
authors to declare "good" class-names, of 4 types.

  DYNAMIC_DEBUG_CLASSMAP(drm_debug_classes,
  			DD_CLASS_TYPE_DISJOINT_BITS, offset,
                        "DRM_UT_CORE",
                        "DRM_UT_DRIVER",
                        "DRM_UT_KMS",
                        "DRM_UT_PRIME",
                        "DRM_UT_ATOMIC",
                        "DRM_UT_VBL",
                        "DRM_UT_STATE",
                        "DRM_UT_LEASE",
                        "DRM_UT_DP",
                        "DRM_UT_DRMRES");

That usage authorizes dyndbg to set class'd pr_debugs accordingly:

  echo class DRM_UT_CORE +p > /proc/dynamic_debug/control
  echo class DRM_UT_KMS  +p > /proc/dynamic_debug/control

Because the DRM modules declare the same classes, they each authorize
dyndbg with the same classnames, which allows dyndbg to effect changes
to its selected class'd prdbgs.

Opting in by using the macro effectively privatizes the limited
63-classes available per module; only modules which share classnames
must coordinate their use of the common range, and they can
independently use the remaining id-space.

Other dyndbg filtering pertains too, so single sites can be selected.


4 DD_CLASS_TYPE_*_*s determine 2 behaviors:

  DISJOINT	bits are independent, like drm.debug categories
  LEVELs	3>2, turns on level-2, like nouveau debug-levels
  NUM/BITS	numeric input, bitmap if disjoint, else 0-32.
  NAMES		accept proper names, like DRM_UT_CORE

Dyndbg provides param-callbacks which enforce those behaviors:

  # DISJOINT_BITS
  echo 0x03 > /sys/module/drm/parameters/debug

  # LEVEL_NUM
  echo 3 > /sys/module/drm/nouveau/debug-mumble*

  # DISJOINT_NAMES
  echo +DRM_UT_CORE,+DRM_UT_KMS,-DRM_UT_DRIVER > /sys/module/drm/parameters/debug_categories

  # LEVEL_NAMES
  echo NV_TRACE > /sys/module/nouveau/parameters/debug-mumble*

That design choice is allowed cuz verbosity is always attached to a
(user visible) interface, and theres no reason not to put the
implementation there (in the callback).  It also considerably
simplifies things; ddebug_change can treat class_id's as disjoint,
period.


Jim Cromie (57):
prep:
  dyndbg: fix static_branch manipulation
  dyndbg: fix module.dyndbg handling
  dyndbg: show both old and new in change-info
  dyndbg: reverse module walk in cat control
  dyndbg: reverse module.callsite walk in cat control
  dyndbg: use ESCAPE_SPACE for cat control
  dyndbg: let query-modname override actual module name
  dyndbg: add test_dynamic_debug module
  dyndbg: drop EXPORTed dynamic_debug_exec_queries
  dyndbg: cleanup auto vars in dynamic_debug_init
  dyndbg: gather __dyndbg[] state into struct _ddebug_info

class feature:
  dyndbg: add class_id to pr_debug callsites
  dyndbg: add __pr_debug_cls for testing
  dyndbg: add DECLARE_DYNDBG_CLASSMAP macro
  kernel/module: add __dyndbg_classes section
  dyndbg: add ddebug_attach_module_classes
  dyndbg: validate class FOO by checking with module
  doc-dyndbg: describe "class CLASS_NAME" query support
  doc-dyndbg: edit dynamic-debug-howto for brevity, audience
  dyndbg: add drm.debug style (drm/parameters/debug) bitmap support
  dyndbg: test DECLARE_DYNDBG_CLASSMAP, sysfs nodes

drm-use-case:
  drm_print: condense enum drm_debug_category
  drm: POC drm on dyndbg - use in core, 2 helpers, 3 drivers.
  drm_print: interpose drm_*dbg with forwarding macros
  drm_print: wrap drm_*_dbg in dyndbg descriptor factory macro
  drm-print.h: include dyndbg header
  drm-print: add drm_dbg_driver to improve namespace symmetry
  drm_print: refine drm_debug_enabled for jump-label
  drm_print: prefer bare printk KERN_DEBUG on generic fn
  drm_print: add _ddebug descriptor to drm_*dbg prototypes
  nouveau: change nvkm_debug/trace to use dev_dbg POC
  nouveau: adapt NV_DEBUG, NV_ATOMIC to use DRM.debug
  nouveau: WIP add 2 LEVEL_NUM classmaps for CLI, SUBDEV

dyndbg-tracefs:
  dyndbg: add _DPRINTK_FLAGS_ENABLED
  dyndbg: add _DPRINTK_FLAGS_TRACE
  dyndbg: add write-events-to-tracefs code
  dyndbg: add 2 trace-events: drm_debug, drm_devdbg
  dyndbg: add 2 more trace-events: pr_debug, dev_dbg
  dyndbg/drm: POC add tracebits sysfs-knob

RFC-20%-data-reclaim:
  dyndbg: abstraction macros for modname,function,filename fields
  dyndbg: split repeating columns to new struct _ddebug_site
  dyndbg: shrink lineno field by 2 bits
  dyndbg: add _index,_map to struct _ddebug
  dyndbg: extend __ddebug_add_module proto to allow packing sites
  dyndbg: de-duplicate sites
  dyndbg: drop site-> in add-module, more needed
  dyndbg: demote iter->site in _init
  dyndbg: add .gnu.linkonce slot in vmlinux.lds.h KEEPs
  dyndbg: add structs _ddebug_hdr, _ddebug_site_hdr
  dyndbg: count unique callsites
  dyndbg: prevent build bugs via -DNO_DYNAMIC_DEBUG_TABLE
  dyndbg: add DEFINE_DYNAMIC_DEBUG_TABLE, use it tacitly RFC
  dyndbg: add/use is_dyndbg_header then set _uplink
  dyndbg: add .gnu.linkonce. & __dyndbg* sections in module.lds.h
  dyndbg: dynamic_debug_sites_reclaim() using free_reserved_page() WAG
  dyndbg: work ddebug_map_site
  dyndbg: fiddle with readback value on LEVEL_NAMES types

 .../admin-guide/dynamic-debug-howto.rst       | 249 +++---
 MAINTAINERS                                   |   2 +
 arch/arm/boot/compressed/Makefile             |   2 +
 arch/sparc/vdso/Makefile                      |   2 +
 arch/x86/boot/compressed/Makefile             |   1 +
 arch/x86/entry/vdso/Makefile                  |   3 +
 arch/x86/purgatory/Makefile                   |   1 +
 drivers/firmware/efi/libstub/Makefile         |   3 +-
 drivers/gpu/drm/Kconfig                       |  12 +
 drivers/gpu/drm/Makefile                      |   2 +
 drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c       |  14 +
 drivers/gpu/drm/display/drm_dp_helper.c       |  13 +
 drivers/gpu/drm/drm_crtc_helper.c             |  13 +
 drivers/gpu/drm/drm_print.c                   |  83 +-
 drivers/gpu/drm/i915/i915_params.c            |  12 +
 .../gpu/drm/nouveau/include/nvkm/core/debug.h |  16 +
 .../drm/nouveau/include/nvkm/core/subdev.h    |  17 +-
 drivers/gpu/drm/nouveau/nouveau_drm.c         |  20 +
 drivers/gpu/drm/nouveau/nouveau_drv.h         |  16 +-
 drivers/gpu/drm/nouveau/nvkm/core/subdev.c    |  23 +
 include/asm-generic/module.lds.h              |  12 +-
 include/asm-generic/vmlinux.lds.h             |  10 +
 include/drm/drm_print.h                       |  85 +-
 include/linux/dynamic_debug.h                 | 286 ++++++-
 include/trace/events/drm.h                    |  54 ++
 include/trace/events/dyndbg.h                 |  73 ++
 kernel/module/internal.h                      |   4 +-
 kernel/module/main.c                          |  22 +-
 lib/Kconfig.debug                             |  10 +
 lib/Makefile                                  |   1 +
 lib/dynamic_debug.c                           | 792 +++++++++++++++---
 lib/test_dynamic_debug.c                      | 165 ++++
 32 files changed, 1680 insertions(+), 338 deletions(-)
 create mode 100644 include/trace/events/drm.h
 create mode 100644 include/trace/events/dyndbg.h
 create mode 100644 lib/test_dynamic_debug.c

-- 
2.37.2



More information about the amd-gfx mailing list