public inbox for linux-arch@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH v14 00/92] dyndbg: enable 0-off-cost for all of __drm_debug
@ 2026-04-23 20:53 Jim Cromie
  2026-04-23 20:53 ` [PATCH v14 01/92] dyndbg: fix NULL ptr on i386 due to section mis-alignment Jim Cromie
                   ` (18 more replies)
  0 siblings, 19 replies; 20+ messages in thread
From: Jim Cromie @ 2026-04-23 20:53 UTC (permalink / raw)
  To: Arnd Bergmann, Jason Baron, Luis Chamberlain, Petr Pavlu,
	Daniel Gomez, Sami Tolvanen, Aaron Tomlin, Andrew Morton,
	Jonathan Corbet, Shuah Khan, Shuah Khan, Greg Kroah-Hartman,
	Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
	Simona Vetter, Jani Nikula, Joonas Lahtinen, Rodrigo Vivi,
	Tvrtko Ursulin, Alex Deucher, Christian König, David Airlie,
	Gerd Hoffmann, Dmitry Osipenko, Gurchetan Singh, Chia-I Wu,
	Matthew Brost, Thomas Hellström, Lyude Paul,
	Danilo Krummrich, Patrik Jakobsson, Zack Rusin,
	Broadcom internal kernel review list, Louis Chauvet,
	Haneen Mohammed, Melissa Wen, Sean Paul, Jocelyn Falempe,
	Ruben Wauters, Dave Stevenson, Maíra Canal,
	Raspberry Pi Kernel Maintenance, Rob Clark, Dmitry Baryshkov,
	Abhinav Kumar, Jessica Zhang, Marijn Suijten, Xinliang Liu,
	Tian Tao, Xinwei Kong, Sumit Semwal, Yongqin Liu, John Stultz,
	Philipp Zabel, Frank Li, Sascha Hauer, Pengutronix Kernel Team,
	Fabio Estevam, Chun-Kuang Hu, Matthias Brugger,
	AngeloGioacchino Del Regno, Sandy Huang, Heiko Stübner,
	Andy Yan, Alain Volmat, Raphael Gallais-Pou, Yannick Fertre,
	Raphael Gallais-Pou, Philippe Cornu, Maxime Coquelin,
	Alexandre Torgue, Oded Gabbay, Maciej Falkowski, Karol Wachowski,
	Rob Herring (Arm), Tomeu Vizoso, Liviu Dudau, Andrzej Hajda,
	Neil Armstrong, Robert Foss, Laurent Pinchart, Jonas Karlman,
	Jernej Skrabec, Liu Ying, Laurentiu Palcu, Lucas Stach,
	Paul Kocialkowski, Jianmin Lv, Qianhai Wu, Huacai Chen,
	Mingcong Bai, Xi Ruoyao, Icenowy Zheng, Laurent Pinchart,
	Tomi Valkeinen, Kieran Bingham, Geert Uytterhoeven, Magnus Damm,
	Javier Martinez Canillas, Huang Rui, Matthew Auld, Jani Nikula,
	Luca Coelho, Russell King, Christian Gmeiner
  Cc: linux-arch, linux-kernel, linux-modules, linux-doc,
	linux-kselftest, dri-devel, intel-gfx, amd-gfx, virtualization,
	intel-xe, nouveau, spice-devel, linux-arm-msm, freedreno, imx,
	linux-arm-kernel, linux-mediatek, linux-rockchip, linux-stm32,
	linux-renesas-soc, etnaviv, Jim Cromie, kernel test robot,
	Łukasz Bartosik, Philipp Hahn

Since Feb 2023, DRM_USE_DYNAMIC_DEBUG has been marked BROKEN [1].
Although classmaps worked in normal operation (via sysfs), the "v1"
POC implementation failed to propagate drm.debug boot-args to built-in
drivers and helpers.

The API Fix:

The root cause was a "Define vs Refer" design error. By using
DECLARE_DYNDBG_CLASSMAP in both core and drivers, the implementation
lacked the formal linkage required for dyndbg to associate driver
callsites with the core's controlling parameter during early boot
init.

This series introduces a proper module-scoped API:
- DYNDBG_CLASSMAP_DEFINE: Invoked once in drm_print.c (exported by drm.ko).
- DYNDBG_CLASSMAP_USE: Invoked by 20+ DRM/Accel modules to reference the core.

This linkage allows dyndbg to trace a driver's USE back to the core's
DEFINE. At boot-time, dyndbg can now correctly apply drm.debug
settings to all referencing modules as they are initialized, restoring
full functionality for built-in drivers.

The Benefit and Evidence (+c flag):

While the instructions saved by replacing bit-tests with NOOPs are
individually small, the scale of DRM's debug activity makes the
aggregate impact substantial.  In particular, dyndbg elides the fetch
of __drm_debug for every drm_debug_enabled() bit test, eliminating the
fetch from main memory and cache-line thrashing.

To measure the call-counts, the final patch in this series adds +c
flag to dyndbg, whereby enabled pr_debug* callsites increment a
per-cpu counter.

The benchmark (in last patch) sets +c flag on all drm_dbg_*s,
and runs 12 vkcubes for 30 sec:

  root@frodo:/home/jimc/projects/lx# count_hits 30 hammer_vk --
  Banging on: hammer_vk (&)
  [1] 100847
  [1]+  Done                       hammer_vk
  #: total hits: 2295401

This ran 1 vkcube for 10sec each, counting 1 DRM_UT_* class at a time:

root@frodo:/home/jimc/projects/lx# isolate_drm_hits 2> /dev/null
Starting isolation study: 10s per class using vkcube
----------------------------------------------------------
DRM CLASS            | TOTAL HITS
----------------------------------------------------------
DRM_UT_CORE          | 85305
DRM_UT_DRIVER        | 0
DRM_UT_KMS           | 1435
DRM_UT_PRIME         | 0
DRM_UT_ATOMIC        | 13645
DRM_UT_VBL           | 4071
DRM_UT_STATE         | 1780
DRM_UT_LEASE         | 0
DRM_UT_DP            | 0
DRM_UT_DRMRES        | 0
FOO                  | 0

Replacing this frequent memory fetch & bit-test with static-key NOOPs
could save approximately 200 peta-instructions per year across the
Steam Deck install base alone.

Series Organization:

1. vmlinux.lds.h fix and cleanup (patches 1-4)
   fix section alignment of 32 bit arches

2. dyndbg internal refactorings (5-24)
   internal callchaing grooming,
   struct refactoring, __section renames
   drop linked-list, use existing vector/array

3. core API fix (25-30)
   replace flawed DECLARE_DYNDBG_CLASSMAP with the DEFINE/USE model.
   fix boot-time propagation of drm.debug to built-in drivers/helpers.
   add compile-time validation of classmaps

4. interface improvements, documentation (31-38)
   query improvments: commas as token separators, % as query separators
   control-file epilogue

5. apply API to DRM
   call DYNAMIC_DEBUG_CLASSMAP_DEFINE(drm_debug_classes ...) in drm_drv.c
   call DYNAMIC_DEBUG_CLASSMAP_USE(drm_debug_classes) in drivers, helpers

6. New additions in v14
   add +c flag for benchmarking
   add DYNAMIC_DEBUG_CLASSMAP_USEs to more drivers, helpers
   drm/nouveau: Fix NULL pointer dereferences in GETPARAM ioctl (RFC)

In v13, to focus the review, I sent only the dyndbg core, and skipped
the DRM uses.  But the value of the optimization is best seen in
context; it presented GregKH a "maze with no cheese".

For v14, I've recombined them to show the full scale of the benefit.
While the performance gains accrue to DRM, the infrastructure resides
in dyndbg.

So Id like to add some "cheese" (later); ie patchsets to:

1. reduce __dyndbg_* .data by 40%.

This uses 3 maple trees to store module, filename, function, which
collapses 1st 2 columns by 90%.  Looped `cat control` tests indicate
a minor cost increase.

2. cache dynamic-prefixes, to avoid repeated work.

This assembles the prefix from maple trees, and stores the prefix into
another maple tree.  The cache is minimal; for +m callsites, it keeps
just 1 prefix per enabled module, for +mf prefixes just 1 per function.

Preliminary benchmarking suggests positive ROI on these.

Fixes: bb2ff6c27bc9 ("drm: Disable dynamic debug as broken")

Assisted-by: google gemini
Signed-off-by: Jim Cromie <jim.cromie@gmail.com>
---
Jim Cromie (91):
      dyndbg: fix NULL ptr on i386 due to section mis-alignment
      vmlinux.lds.h: move BOUNDED_SECTION_* macros to reuse later
      dyndbg.lds.S: fix lost dyndbg sections in modules
      vmlinux.lds.h: drop unused HEADERED_SECTION* macros
      dyndbg: factor ddebug_match_desc out from ddebug_change
      dyndbg: add stub macro for DECLARE_DYNDBG_CLASSMAP
      docs/dyndbg: update examples \012 to \n
      docs/dyndbg: explain flags parse 1st
      test-dyndbg: fixup CLASSMAP usage error
      dyndbg: reword "class unknown," to "class:_UNKNOWN_"
      dyndbg: make ddebug_class_param union members same size
      dyndbg: drop NUM_TYPE_ARRAY
      dyndbg: tweak pr_fmt to avoid expansion conflicts
      dyndbg: reduce verbose/debug clutter
      dyndbg: refactor param_set_dyndbg_classes and below
      dyndbg: tighten fn-sig of ddebug_apply_class_bitmap
      dyndbg: replace classmap list with a vector
      dyndbg: macrofy a 2-index for-loop pattern
      dyndbg,module: make proper substructs in _ddebug_info
      dyndbg: move mod_name down from struct ddebug_table to _ddebug_info
      dyndbg: hoist classmap-filter-by-modname up to ddebug_add_module
      dyndbg-API: remove DD_CLASS_TYPE_(DISJOINT|LEVEL)_NAMES and code
      selftests-dyndbg: add a dynamic_debug run_tests target
      dyndbg: change __dynamic_func_call_cls* macros into expressions
      dyndbg-API: replace DECLARE_DYNDBG_CLASSMAP
      dyndbg: detect class_id reservation conflicts
      dyndbg: check DYNAMIC_DEBUG_CLASSMAP_{DEFINE,USE_} args at compile-time
      dyndbg-test: change do_prints testpoint to accept a loopct
      dyndbg-API: promote DYNAMIC_DEBUG_CLASSMAP_PARAM to API
      dyndbg: treat comma as a token separator
      dyndbg: split multi-query strings with %
      selftests-dyndbg: add test_mod_submod
      dyndbg: resolve "protection" of class'd pr_debug
      dyndbg: harden classmap and descriptor validation
      docs/dyndbg: add classmap info to howto
      dyndbg: add epilogue to dynamic_debug/control file
      drm: use correct ccflags-y spelling
      drm-dyndbg: adapt drm core to use dyndbg classmaps-v2
      drm-dyndbg: adapt DRM to invoke DYNAMIC_DEBUG_CLASSMAP_PARAM
      drm/i915: Register DRM_CLASSMAP_USE(drm_debug_classes)
      drm-dyndbg: DRM_CLASSMAP_USE in amdgpu driver
      drm-dyndbg: add DRM_CLASSMAP_USE to virtio_gpu
      drm-dyndbg: add DRM_CLASSMAP_USE to Xe
      drm/drm_crtc_helper: Register DRM_CLASSMAP_USE(drm_debug_classes)
      drm/drm_dp_helper: Register DRM_CLASSMAP_USE(drm_debug_classes)
      drm/nouveau: Register DRM_CLASSMAP_USE(drm_debug_classes)
      drm/gma500: Register DRM classmap
      drm/radeon: Register DRM classmap
      drm/vmwgfx: Register DRM classmap
      drm/vkms: Register DRM classmap
      drm/udl: Register DRM classmap
      drm/mgag200: Register DRM classmap
      drm/gud: Register DRM classmap
      drm/qxl: Register DRM classmap
      drm/shmem-helper: Register DRM classmap
      drm/ttm-helper: DRM_CLASSMAP_USE(drm_debug_classes);
      drm/nouveau: Fix NULL pointer dereferences in GETPARAM ioctl
      drm/vc4: Register DRM classmap
      drm/msm: Register DRM classmap
      drm/hibmc: Register DRM classmap
      drm/imx: Register DRM classmap
      drm/mediatek: Register DRM classmap
      drm/rockchip: Register DRM classmap
      drm/sti: Register DRM classmap
      drm/stm: Register DRM classmap
      accel: add -DDYNAMIC_DEBUG_MODULE to subdir-ccflags
      accel/ivpu: implement IVPU_DBG_* as a dyndbg classmap
      accel/ethosu: enable drm.debug control
      accel/rocket: enable drm.debug control
      drm/komeda: Register DRM classmap
      drm/bridge/analogix: Register DRM classmap
      drm/bridge/dw-hdmi: Register DRM classmap
      drm/hisilicon/kirin: Register DRM classmap
      drm/imx/dc: Register DRM classmap
      drm/imx/dcss: Register DRM classmap
      drm/logicvc: Register DRM classmap
      drm/loongson: Register DRM classmap
      drm/renesas/rcar-du: Register DRM classmap
      drm/sysfb/simpledrm: Register DRM classmap
      drm/tests: Register DRM classmap in drm_mm_test
      drm/ttm: Register DRM classmap
      drm: restore CONFIG_DRM_USE_DYNAMIC_DEBUG un-BROKEN
      drm-print: fix config-dependent unused variable
      drm_print: fix drm_printer dynamic debug bypass
      drm: enable DRM_USE_DYNAMIC_DEBUG by default (for testing)
      drm-dyndbg: add DRM_CLASSMAP_USE to etnaviv
      drm/tiny: panel-mipi-dbi: Add DRM_CLASSMAP_USE
      drm/bridge: ite-it6505: Add DRM_CLASSMAP_USE
      drm/mipi-dbi: Add DRM_CLASSMAP_USE
      drm/clients: Add DRM_CLASSMAP_USE to drm_client_setup
      dyndbg: add +c flag to demonstrate advantage of classmaps for DRM

Philipp Hahn (1):
      dyndbg: Ignore additional arguments from pr_fmt

 Documentation/admin-guide/dynamic-debug-howto.rst  | 184 ++++-
 MAINTAINERS                                        |   4 +-
 drivers/accel/Makefile                             |   7 +-
 drivers/accel/ethosu/ethosu_drv.c                  |   3 +
 drivers/accel/ivpu/ivpu_drv.c                      |  27 +-
 drivers/accel/ivpu/ivpu_drv.h                      |  45 +-
 drivers/accel/rocket/rocket_gem.c                  |   2 +
 drivers/gpu/drm/Kconfig.debug                      |   3 +-
 drivers/gpu/drm/Makefile                           |   3 +-
 drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c            |  12 +-
 drivers/gpu/drm/arm/display/komeda/komeda_drv.c    |   4 +
 drivers/gpu/drm/bridge/analogix/analogix_dp_core.c |   2 +
 drivers/gpu/drm/bridge/ite-it6505.c                |   2 +
 drivers/gpu/drm/bridge/synopsys/dw-hdmi.c          |   2 +
 drivers/gpu/drm/clients/drm_client_setup.c         |   2 +
 drivers/gpu/drm/display/drm_dp_helper.c            |  12 +-
 drivers/gpu/drm/drm_crtc_helper.c                  |  12 +-
 drivers/gpu/drm/drm_gem_shmem_helper.c             |   1 +
 drivers/gpu/drm/drm_gem_ttm_helper.c               |   2 +
 drivers/gpu/drm/drm_mipi_dbi.c                     |   2 +
 drivers/gpu/drm/drm_print.c                        |  40 +-
 drivers/gpu/drm/etnaviv/etnaviv_drv.c              |   2 +
 drivers/gpu/drm/gma500/psb_drv.c                   |   2 +
 drivers/gpu/drm/gud/gud_drv.c                      |   2 +
 drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c    |   2 +
 drivers/gpu/drm/hisilicon/kirin/kirin_drm_drv.c    |   2 +
 drivers/gpu/drm/i915/i915_params.c                 |  12 +-
 drivers/gpu/drm/imx/dc/dc-drv.c                    |   3 +
 drivers/gpu/drm/imx/dcss/dcss-drv.c                |   3 +
 drivers/gpu/drm/imx/ipuv3/imx-drm-core.c           |   2 +
 drivers/gpu/drm/logicvc/logicvc_drm.c              |   2 +
 drivers/gpu/drm/loongson/lsdc_drv.c                |   2 +
 drivers/gpu/drm/mediatek/mtk_drm_drv.c             |   3 +
 drivers/gpu/drm/mgag200/mgag200_drv.c              |   2 +
 drivers/gpu/drm/msm/msm_drv.c                      |   3 +
 drivers/gpu/drm/nouveau/nouveau_abi16.c            |  25 +-
 drivers/gpu/drm/nouveau/nouveau_drm.c              |  12 +-
 drivers/gpu/drm/qxl/qxl_drv.c                      |   2 +
 drivers/gpu/drm/radeon/radeon_drv.c                |   2 +
 drivers/gpu/drm/renesas/rcar-du/rcar_du_drv.c      |   2 +
 drivers/gpu/drm/rockchip/rockchip_drm_drv.c        |   2 +
 drivers/gpu/drm/sti/sti_drv.c                      |   2 +
 drivers/gpu/drm/stm/drv.c                          |   2 +
 drivers/gpu/drm/sysfb/simpledrm.c                  |   2 +
 drivers/gpu/drm/tests/drm_mm_test.c                |   2 +
 drivers/gpu/drm/tiny/panel-mipi-dbi.c              |   2 +
 drivers/gpu/drm/ttm/ttm_device.c                   |   3 +
 drivers/gpu/drm/udl/udl_main.c                     |   2 +
 drivers/gpu/drm/vc4/vc4_drv.c                      |   2 +
 drivers/gpu/drm/virtio/virtgpu_drv.c               |   2 +
 drivers/gpu/drm/vkms/vkms_drv.c                    |   2 +
 drivers/gpu/drm/vmwgfx/vmwgfx_drv.c                |   2 +
 drivers/gpu/drm/xe/xe_module.c                     |   3 +
 include/asm-generic/bounded_sections.lds.h         |  23 +
 include/asm-generic/dyndbg.lds.h                   |  26 +
 include/asm-generic/vmlinux.lds.h                  |  48 +-
 include/drm/drm_print.h                            |  17 +-
 include/linux/dynamic_debug.h                      | 334 ++++++--
 kernel/module/main.c                               |  15 +-
 lib/Kconfig.debug                                  |  24 +-
 lib/Makefile                                       |   5 +
 lib/dynamic_debug.c                                | 889 ++++++++++++++-------
 lib/test_dynamic_debug.c                           | 211 +++--
 lib/test_dynamic_debug_submod.c                    |  21 +
 scripts/module.lds.S                               |   2 +
 tools/testing/selftests/Makefile                   |   1 +
 tools/testing/selftests/dynamic_debug/Makefile     |   9 +
 tools/testing/selftests/dynamic_debug/config       |   7 +
 .../selftests/dynamic_debug/dyndbg_selftest.sh     | 373 +++++++++
 69 files changed, 1891 insertions(+), 598 deletions(-)
---
base-commit: d662a710c668a86a39ebaad334d9960a0cc776c2
change-id: 20260419-submit-dyndbg-classmap-foundation-a3c77652c054

Best regards,
-- 
Jim Cromie <jim.cromie@gmail.com>


^ permalink raw reply	[flat|nested] 20+ messages in thread

* [PATCH v14 01/92] dyndbg: fix NULL ptr on i386 due to section mis-alignment
  2026-04-23 20:53 [PATCH v14 00/92] dyndbg: enable 0-off-cost for all of __drm_debug Jim Cromie
@ 2026-04-23 20:53 ` Jim Cromie
  2026-04-23 20:53 ` [PATCH v14 02/92] vmlinux.lds.h: move BOUNDED_SECTION_* macros to reuse later Jim Cromie
                   ` (17 subsequent siblings)
  18 siblings, 0 replies; 20+ messages in thread
From: Jim Cromie @ 2026-04-23 20:53 UTC (permalink / raw)
  To: Arnd Bergmann, Jason Baron, Luis Chamberlain, Petr Pavlu,
	Daniel Gomez, Sami Tolvanen, Aaron Tomlin, Andrew Morton,
	Jonathan Corbet, Shuah Khan, Shuah Khan, Greg Kroah-Hartman,
	Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
	Simona Vetter, Jani Nikula, Joonas Lahtinen, Rodrigo Vivi,
	Tvrtko Ursulin, Alex Deucher, Christian König, David Airlie,
	Gerd Hoffmann, Dmitry Osipenko, Gurchetan Singh, Chia-I Wu,
	Matthew Brost, Thomas Hellström, Lyude Paul,
	Danilo Krummrich, Patrik Jakobsson, Zack Rusin,
	Broadcom internal kernel review list, Louis Chauvet,
	Haneen Mohammed, Melissa Wen, Sean Paul, Jocelyn Falempe,
	Ruben Wauters, Dave Stevenson, Maíra Canal,
	Raspberry Pi Kernel Maintenance, Rob Clark, Dmitry Baryshkov,
	Abhinav Kumar, Jessica Zhang, Marijn Suijten, Xinliang Liu,
	Tian Tao, Xinwei Kong, Sumit Semwal, Yongqin Liu, John Stultz,
	Philipp Zabel, Frank Li, Sascha Hauer, Pengutronix Kernel Team,
	Fabio Estevam, Chun-Kuang Hu, Matthias Brugger,
	AngeloGioacchino Del Regno, Sandy Huang, Heiko Stübner,
	Andy Yan, Alain Volmat, Raphael Gallais-Pou, Yannick Fertre,
	Raphael Gallais-Pou, Philippe Cornu, Maxime Coquelin,
	Alexandre Torgue, Oded Gabbay, Maciej Falkowski, Karol Wachowski,
	Rob Herring (Arm), Tomeu Vizoso, Liviu Dudau, Andrzej Hajda,
	Neil Armstrong, Robert Foss, Laurent Pinchart, Jonas Karlman,
	Jernej Skrabec, Liu Ying, Laurentiu Palcu, Lucas Stach,
	Paul Kocialkowski, Jianmin Lv, Qianhai Wu, Huacai Chen,
	Mingcong Bai, Xi Ruoyao, Icenowy Zheng, Laurent Pinchart,
	Tomi Valkeinen, Kieran Bingham, Geert Uytterhoeven, Magnus Damm,
	Javier Martinez Canillas, Huang Rui, Matthew Auld, Jani Nikula,
	Luca Coelho, Russell King, Christian Gmeiner
  Cc: linux-arch, linux-kernel, linux-modules, linux-doc,
	linux-kselftest, dri-devel, intel-gfx, amd-gfx, virtualization,
	intel-xe, nouveau, spice-devel, linux-arm-msm, freedreno, imx,
	linux-arm-kernel, linux-mediatek, linux-rockchip, linux-stm32,
	linux-renesas-soc, etnaviv, Jim Cromie, kernel test robot

When dyndbg classmaps get used (later in this series), the
__dyndbg_classes section (which has 28 byte structs on i386), causes
mis-alignment of the following __dyndbg section, resulting in a NULL
pointer deref in dynamic_debug_init().

Fix this by:

Adding ALIGN(8) to the BOUNDED_SECTION* macros.  This aligns all
sections using those macros, including the problem section above.
Almost all the other macro uses are already ALIGN(8), either
directly or by being below one.

Removing BOUNDED_SECTION* uses in ORC_UNWINDER sections.  These
explicitly have smaller alignments, and using the modified macros here
would override that alignment, which scripts/sorttable.c does not
tolerate.

Move __dyndbg section back above __dyndbg_classes, restoring its
original position.  This is cosmetic, given the alignment added to the
macros.

Reported-by: kernel test robot <oliver.sang@intel.com>
Closes: https://lore.kernel.org/oe-lkp/202601211325.7e1f336-lkp@intel.com
Signed-off-by: Jim Cromie <jim.cromie@gmail.com>
---
 include/asm-generic/vmlinux.lds.h | 14 +++++++++++---
 1 file changed, 11 insertions(+), 3 deletions(-)

diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h
index 60c8c22fd3e4..db38f52035f3 100644
--- a/include/asm-generic/vmlinux.lds.h
+++ b/include/asm-generic/vmlinux.lds.h
@@ -212,11 +212,13 @@
 #endif
 
 #define BOUNDED_SECTION_PRE_LABEL(_sec_, _label_, _BEGIN_, _END_)	\
+	. = ALIGN(8);							\
 	_BEGIN_##_label_ = .;						\
 	KEEP(*(_sec_))							\
 	_END_##_label_ = .;
 
 #define BOUNDED_SECTION_POST_LABEL(_sec_, _label_, _BEGIN_, _END_)	\
+	. = ALIGN(8);							\
 	_label_##_BEGIN_ = .;						\
 	KEEP(*(_sec_))							\
 	_label_##_END_ = .;
@@ -862,15 +864,21 @@
 #ifdef CONFIG_UNWINDER_ORC
 #define ORC_UNWIND_TABLE						\
 	.orc_header : AT(ADDR(.orc_header) - LOAD_OFFSET) {		\
-		BOUNDED_SECTION_BY(.orc_header, _orc_header)		\
+		__start_orc_header = .;					\
+		KEEP(*(.orc_header))					\
+		__stop_orc_header = .;					\
 	}								\
 	. = ALIGN(4);							\
 	.orc_unwind_ip : AT(ADDR(.orc_unwind_ip) - LOAD_OFFSET) {	\
-		BOUNDED_SECTION_BY(.orc_unwind_ip, _orc_unwind_ip)	\
+		__start_orc_unwind_ip = .;				\
+		KEEP(*(.orc_unwind_ip))					\
+		__stop_orc_unwind_ip = .;				\
 	}								\
 	. = ALIGN(2);							\
 	.orc_unwind : AT(ADDR(.orc_unwind) - LOAD_OFFSET) {		\
-		BOUNDED_SECTION_BY(.orc_unwind, _orc_unwind)		\
+		__start_orc_unwind = .;					\
+		KEEP(*(.orc_unwind))					\
+		__stop_orc_unwind = .;					\
 	}								\
 	text_size = _etext - _stext;					\
 	. = ALIGN(4);							\

-- 
2.53.0


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH v14 02/92] vmlinux.lds.h: move BOUNDED_SECTION_* macros to reuse later
  2026-04-23 20:53 [PATCH v14 00/92] dyndbg: enable 0-off-cost for all of __drm_debug Jim Cromie
  2026-04-23 20:53 ` [PATCH v14 01/92] dyndbg: fix NULL ptr on i386 due to section mis-alignment Jim Cromie
@ 2026-04-23 20:53 ` Jim Cromie
  2026-04-23 20:53 ` [PATCH v14 03/92] dyndbg.lds.S: fix lost dyndbg sections in modules Jim Cromie
                   ` (16 subsequent siblings)
  18 siblings, 0 replies; 20+ messages in thread
From: Jim Cromie @ 2026-04-23 20:53 UTC (permalink / raw)
  To: Arnd Bergmann, Jason Baron, Luis Chamberlain, Petr Pavlu,
	Daniel Gomez, Sami Tolvanen, Aaron Tomlin, Andrew Morton,
	Jonathan Corbet, Shuah Khan, Shuah Khan, Greg Kroah-Hartman,
	Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
	Simona Vetter, Jani Nikula, Joonas Lahtinen, Rodrigo Vivi,
	Tvrtko Ursulin, Alex Deucher, Christian König, David Airlie,
	Gerd Hoffmann, Dmitry Osipenko, Gurchetan Singh, Chia-I Wu,
	Matthew Brost, Thomas Hellström, Lyude Paul,
	Danilo Krummrich, Patrik Jakobsson, Zack Rusin,
	Broadcom internal kernel review list, Louis Chauvet,
	Haneen Mohammed, Melissa Wen, Sean Paul, Jocelyn Falempe,
	Ruben Wauters, Dave Stevenson, Maíra Canal,
	Raspberry Pi Kernel Maintenance, Rob Clark, Dmitry Baryshkov,
	Abhinav Kumar, Jessica Zhang, Marijn Suijten, Xinliang Liu,
	Tian Tao, Xinwei Kong, Sumit Semwal, Yongqin Liu, John Stultz,
	Philipp Zabel, Frank Li, Sascha Hauer, Pengutronix Kernel Team,
	Fabio Estevam, Chun-Kuang Hu, Matthias Brugger,
	AngeloGioacchino Del Regno, Sandy Huang, Heiko Stübner,
	Andy Yan, Alain Volmat, Raphael Gallais-Pou, Yannick Fertre,
	Raphael Gallais-Pou, Philippe Cornu, Maxime Coquelin,
	Alexandre Torgue, Oded Gabbay, Maciej Falkowski, Karol Wachowski,
	Rob Herring (Arm), Tomeu Vizoso, Liviu Dudau, Andrzej Hajda,
	Neil Armstrong, Robert Foss, Laurent Pinchart, Jonas Karlman,
	Jernej Skrabec, Liu Ying, Laurentiu Palcu, Lucas Stach,
	Paul Kocialkowski, Jianmin Lv, Qianhai Wu, Huacai Chen,
	Mingcong Bai, Xi Ruoyao, Icenowy Zheng, Laurent Pinchart,
	Tomi Valkeinen, Kieran Bingham, Geert Uytterhoeven, Magnus Damm,
	Javier Martinez Canillas, Huang Rui, Matthew Auld, Jani Nikula,
	Luca Coelho, Russell King, Christian Gmeiner
  Cc: linux-arch, linux-kernel, linux-modules, linux-doc,
	linux-kselftest, dri-devel, intel-gfx, amd-gfx, virtualization,
	intel-xe, nouveau, spice-devel, linux-arm-msm, freedreno, imx,
	linux-arm-kernel, linux-mediatek, linux-rockchip, linux-stm32,
	linux-renesas-soc, etnaviv, Jim Cromie

Move BOUNDED_SECTION_* macros to a new helper file:
include/asm-generic/bounded_sections.lds.h
and include it back into vmlinux.lds.h

This allows its reuse later to fix a future problem with modules
failing to keep dyndbg sections in some circumstances.

NB: this ignores a checkpatch warning, because new file is covered by
GENERIC INCLUDE/ASM HEADER FILES

CC: Arnd Bergmann <arnd@arndb.de>
CC: linux-arch@vger.kernel.org
Signed-off-by: Jim Cromie <jim.cromie@gmail.com>
---
 include/asm-generic/bounded_sections.lds.h | 38 ++++++++++++++++++++++++++++++
 include/asm-generic/vmlinux.lds.h          | 32 +------------------------
 2 files changed, 39 insertions(+), 31 deletions(-)

diff --git a/include/asm-generic/bounded_sections.lds.h b/include/asm-generic/bounded_sections.lds.h
new file mode 100644
index 000000000000..43e79603d4af
--- /dev/null
+++ b/include/asm-generic/bounded_sections.lds.h
@@ -0,0 +1,38 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+
+#ifndef _ASM_GENERIC_BOUNDED_SECTIONS_H
+#define _ASM_GENERIC_BOUNDED_SECTIONS_H
+
+#define BOUNDED_SECTION_PRE_LABEL(_sec_, _label_, _BEGIN_, _END_)	\
+	. = ALIGN(8);							\
+	_BEGIN_##_label_ = .;						\
+	KEEP(*(_sec_))							\
+	_END_##_label_ = .;
+
+#define BOUNDED_SECTION_POST_LABEL(_sec_, _label_, _BEGIN_, _END_)	\
+	. = ALIGN(8);							\
+	_label_##_BEGIN_ = .;						\
+	KEEP(*(_sec_))							\
+	_label_##_END_ = .;
+
+#define BOUNDED_SECTION_BY(_sec_, _label_)				\
+	BOUNDED_SECTION_PRE_LABEL(_sec_, _label_, __start, __stop)
+
+#define BOUNDED_SECTION(_sec)	 BOUNDED_SECTION_BY(_sec, _sec)
+
+#define HEADERED_SECTION_PRE_LABEL(_sec_, _label_, _BEGIN_, _END_, _HDR_) \
+	_HDR_##_label_	= .;						\
+	KEEP(*(.gnu.linkonce.##_sec_))					\
+	BOUNDED_SECTION_PRE_LABEL(_sec_, _label_, _BEGIN_, _END_)
+
+#define HEADERED_SECTION_POST_LABEL(_sec_, _label_, _BEGIN_, _END_, _HDR_) \
+	_label_##_HDR_ = .;						\
+	KEEP(*(.gnu.linkonce.##_sec_))					\
+	BOUNDED_SECTION_POST_LABEL(_sec_, _label_, _BEGIN_, _END_)
+
+#define HEADERED_SECTION_BY(_sec_, _label_)				\
+	HEADERED_SECTION_PRE_LABEL(_sec_, _label_, __start, __stop)
+
+#define HEADERED_SECTION(_sec)	 HEADERED_SECTION_BY(_sec, _sec)
+
+#endif /* _ASM_GENERIC_BOUNDED_SECTIONS_H */
diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h
index db38f52035f3..acb4aadd74da 100644
--- a/include/asm-generic/vmlinux.lds.h
+++ b/include/asm-generic/vmlinux.lds.h
@@ -211,37 +211,7 @@
 # endif
 #endif
 
-#define BOUNDED_SECTION_PRE_LABEL(_sec_, _label_, _BEGIN_, _END_)	\
-	. = ALIGN(8);							\
-	_BEGIN_##_label_ = .;						\
-	KEEP(*(_sec_))							\
-	_END_##_label_ = .;
-
-#define BOUNDED_SECTION_POST_LABEL(_sec_, _label_, _BEGIN_, _END_)	\
-	. = ALIGN(8);							\
-	_label_##_BEGIN_ = .;						\
-	KEEP(*(_sec_))							\
-	_label_##_END_ = .;
-
-#define BOUNDED_SECTION_BY(_sec_, _label_)				\
-	BOUNDED_SECTION_PRE_LABEL(_sec_, _label_, __start, __stop)
-
-#define BOUNDED_SECTION(_sec)	 BOUNDED_SECTION_BY(_sec, _sec)
-
-#define HEADERED_SECTION_PRE_LABEL(_sec_, _label_, _BEGIN_, _END_, _HDR_) \
-	_HDR_##_label_	= .;						\
-	KEEP(*(.gnu.linkonce.##_sec_))					\
-	BOUNDED_SECTION_PRE_LABEL(_sec_, _label_, _BEGIN_, _END_)
-
-#define HEADERED_SECTION_POST_LABEL(_sec_, _label_, _BEGIN_, _END_, _HDR_) \
-	_label_##_HDR_ = .;						\
-	KEEP(*(.gnu.linkonce.##_sec_))					\
-	BOUNDED_SECTION_POST_LABEL(_sec_, _label_, _BEGIN_, _END_)
-
-#define HEADERED_SECTION_BY(_sec_, _label_)				\
-	HEADERED_SECTION_PRE_LABEL(_sec_, _label_, __start, __stop)
-
-#define HEADERED_SECTION(_sec)	 HEADERED_SECTION_BY(_sec, _sec)
+#include <asm-generic/bounded_sections.lds.h>
 
 #ifdef CONFIG_TRACE_BRANCH_PROFILING
 #define LIKELY_PROFILE()						\

-- 
2.53.0


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH v14 03/92] dyndbg.lds.S: fix lost dyndbg sections in modules
  2026-04-23 20:53 [PATCH v14 00/92] dyndbg: enable 0-off-cost for all of __drm_debug Jim Cromie
  2026-04-23 20:53 ` [PATCH v14 01/92] dyndbg: fix NULL ptr on i386 due to section mis-alignment Jim Cromie
  2026-04-23 20:53 ` [PATCH v14 02/92] vmlinux.lds.h: move BOUNDED_SECTION_* macros to reuse later Jim Cromie
@ 2026-04-23 20:53 ` Jim Cromie
  2026-04-23 20:53 ` [PATCH v14 04/92] vmlinux.lds.h: drop unused HEADERED_SECTION* macros Jim Cromie
                   ` (15 subsequent siblings)
  18 siblings, 0 replies; 20+ messages in thread
From: Jim Cromie @ 2026-04-23 20:53 UTC (permalink / raw)
  To: Arnd Bergmann, Jason Baron, Luis Chamberlain, Petr Pavlu,
	Daniel Gomez, Sami Tolvanen, Aaron Tomlin, Andrew Morton,
	Jonathan Corbet, Shuah Khan, Shuah Khan, Greg Kroah-Hartman,
	Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
	Simona Vetter, Jani Nikula, Joonas Lahtinen, Rodrigo Vivi,
	Tvrtko Ursulin, Alex Deucher, Christian König, David Airlie,
	Gerd Hoffmann, Dmitry Osipenko, Gurchetan Singh, Chia-I Wu,
	Matthew Brost, Thomas Hellström, Lyude Paul,
	Danilo Krummrich, Patrik Jakobsson, Zack Rusin,
	Broadcom internal kernel review list, Louis Chauvet,
	Haneen Mohammed, Melissa Wen, Sean Paul, Jocelyn Falempe,
	Ruben Wauters, Dave Stevenson, Maíra Canal,
	Raspberry Pi Kernel Maintenance, Rob Clark, Dmitry Baryshkov,
	Abhinav Kumar, Jessica Zhang, Marijn Suijten, Xinliang Liu,
	Tian Tao, Xinwei Kong, Sumit Semwal, Yongqin Liu, John Stultz,
	Philipp Zabel, Frank Li, Sascha Hauer, Pengutronix Kernel Team,
	Fabio Estevam, Chun-Kuang Hu, Matthias Brugger,
	AngeloGioacchino Del Regno, Sandy Huang, Heiko Stübner,
	Andy Yan, Alain Volmat, Raphael Gallais-Pou, Yannick Fertre,
	Raphael Gallais-Pou, Philippe Cornu, Maxime Coquelin,
	Alexandre Torgue, Oded Gabbay, Maciej Falkowski, Karol Wachowski,
	Rob Herring (Arm), Tomeu Vizoso, Liviu Dudau, Andrzej Hajda,
	Neil Armstrong, Robert Foss, Laurent Pinchart, Jonas Karlman,
	Jernej Skrabec, Liu Ying, Laurentiu Palcu, Lucas Stach,
	Paul Kocialkowski, Jianmin Lv, Qianhai Wu, Huacai Chen,
	Mingcong Bai, Xi Ruoyao, Icenowy Zheng, Laurent Pinchart,
	Tomi Valkeinen, Kieran Bingham, Geert Uytterhoeven, Magnus Damm,
	Javier Martinez Canillas, Huang Rui, Matthew Auld, Jani Nikula,
	Luca Coelho, Russell King, Christian Gmeiner
  Cc: linux-arch, linux-kernel, linux-modules, linux-doc,
	linux-kselftest, dri-devel, intel-gfx, amd-gfx, virtualization,
	intel-xe, nouveau, spice-devel, linux-arm-msm, freedreno, imx,
	linux-arm-kernel, linux-mediatek, linux-rockchip, linux-stm32,
	linux-renesas-soc, etnaviv, Jim Cromie

In an (unused) experimental variation of this series, I had trouble
with __dyndbg* sections getting lost in drm drivers.  While it didn't
happen in this series, it exposed a non-obvious weakness.  So fix it,
by following the model demonstrated in codetag.lds.h.

Introduce include/asm-generic/dyndbg.lds.h, with 2 macros:

DYNDBG_SECTIONS() gets the 2 BOUNDED_SECTION_BY(__yndbg*) calls from
vmlinux.lds.h DATA_DATA, which now includes the new file and calls the
new macro.

MOD_DYNDBG_SECTIONS also has the 2 BOUNDED_SECTION_BY calls, but wraps
them with output section syntax to keep them as known and separate ELF
sections in the module.ko.

dyndbg.lds.h includes (reuses) bounded-section.lds.h

scripts/module.lds.S: now calls MOD_DYNDBG_SECTIONS right before the
CODETAG macro (consistent with their placements in vmlinux.lds.h), and
also includes dyndbg.lds.h

This isolates vmlinux.lds.h from further __dyndbg section additions.

CC: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Jim Cromie <jim.cromie@gmail.com>
---
 MAINTAINERS                       |  1 +
 include/asm-generic/dyndbg.lds.h  | 19 +++++++++++++++++++
 include/asm-generic/vmlinux.lds.h |  6 ++----
 scripts/module.lds.S              |  2 ++
 4 files changed, 24 insertions(+), 4 deletions(-)

diff --git a/MAINTAINERS b/MAINTAINERS
index 5fcb7b991776..5c75109d2ee3 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -9069,6 +9069,7 @@ DYNAMIC DEBUG
 M:	Jason Baron <jbaron@akamai.com>
 M:	Jim Cromie <jim.cromie@gmail.com>
 S:	Maintained
+F:	include/asm-generic/dyndbg.lds.h
 F:	include/linux/dynamic_debug.h
 F:	lib/dynamic_debug.c
 F:	lib/test_dynamic_debug.c
diff --git a/include/asm-generic/dyndbg.lds.h b/include/asm-generic/dyndbg.lds.h
new file mode 100644
index 000000000000..f95683aa16b6
--- /dev/null
+++ b/include/asm-generic/dyndbg.lds.h
@@ -0,0 +1,19 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+#ifndef __ASM_GENERIC_DYNDBG_LDS_H
+#define __ASM_GENERIC_DYNDBG_LDS_H
+
+#include <asm-generic/bounded_sections.lds.h>
+#define DYNDBG_SECTIONS()					\
+	. = ALIGN(8);						\
+	BOUNDED_SECTION_BY(__dyndbg, ___dyndbg)			\
+	BOUNDED_SECTION_BY(__dyndbg_classes, ___dyndbg_classes)
+
+#define MOD_DYNDBG_SECTIONS()                                           \
+	__dyndbg : {							\
+		BOUNDED_SECTION_BY(__dyndbg, ___dyndbg)			\
+	}								\
+	__dyndbg_classes : {						\
+		BOUNDED_SECTION_BY(__dyndbg_classes, ___dyndbg_classes)	\
+	}
+
+#endif /* __ASM_GENERIC_DYNDBG_LDS_H */
diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h
index acb4aadd74da..9324066aab51 100644
--- a/include/asm-generic/vmlinux.lds.h
+++ b/include/asm-generic/vmlinux.lds.h
@@ -340,6 +340,7 @@
 /*
  * .data section
  */
+#include <asm-generic/dyndbg.lds.h>
 #define DATA_DATA							\
 	*(.xiptext)							\
 	*(DATA_MAIN)							\
@@ -353,10 +354,7 @@
 	*(.data..do_once)						\
 	STRUCT_ALIGN();							\
 	*(__tracepoints)						\
-	/* implement dynamic printk debug */				\
-	. = ALIGN(8);							\
-	BOUNDED_SECTION_BY(__dyndbg_classes, ___dyndbg_classes)		\
-	BOUNDED_SECTION_BY(__dyndbg, ___dyndbg)				\
+	DYNDBG_SECTIONS()						\
 	CODETAG_SECTIONS()						\
 	LIKELY_PROFILE()		       				\
 	BRANCH_PROFILE()						\
diff --git a/scripts/module.lds.S b/scripts/module.lds.S
index 2dc4c8c3e667..027c5c286ea0 100644
--- a/scripts/module.lds.S
+++ b/scripts/module.lds.S
@@ -10,6 +10,7 @@
 #endif
 
 #include <asm-generic/codetag.lds.h>
+#include <asm-generic/dyndbg.lds.h>
 
 SECTIONS {
 	/DISCARD/ : {
@@ -59,6 +60,7 @@ SECTIONS {
 		*(.rodata..L*)
 	}
 
+	MOD_DYNDBG_SECTIONS()
 	MOD_SEPARATE_CODETAG_SECTIONS()
 }
 

-- 
2.53.0


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH v14 04/92] vmlinux.lds.h: drop unused HEADERED_SECTION* macros
  2026-04-23 20:53 [PATCH v14 00/92] dyndbg: enable 0-off-cost for all of __drm_debug Jim Cromie
                   ` (2 preceding siblings ...)
  2026-04-23 20:53 ` [PATCH v14 03/92] dyndbg.lds.S: fix lost dyndbg sections in modules Jim Cromie
@ 2026-04-23 20:53 ` Jim Cromie
  2026-04-23 20:53 ` [PATCH v14 05/92] dyndbg: factor ddebug_match_desc out from ddebug_change Jim Cromie
                   ` (14 subsequent siblings)
  18 siblings, 0 replies; 20+ messages in thread
From: Jim Cromie @ 2026-04-23 20:53 UTC (permalink / raw)
  To: Arnd Bergmann, Jason Baron, Luis Chamberlain, Petr Pavlu,
	Daniel Gomez, Sami Tolvanen, Aaron Tomlin, Andrew Morton,
	Jonathan Corbet, Shuah Khan, Shuah Khan, Greg Kroah-Hartman,
	Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
	Simona Vetter, Jani Nikula, Joonas Lahtinen, Rodrigo Vivi,
	Tvrtko Ursulin, Alex Deucher, Christian König, David Airlie,
	Gerd Hoffmann, Dmitry Osipenko, Gurchetan Singh, Chia-I Wu,
	Matthew Brost, Thomas Hellström, Lyude Paul,
	Danilo Krummrich, Patrik Jakobsson, Zack Rusin,
	Broadcom internal kernel review list, Louis Chauvet,
	Haneen Mohammed, Melissa Wen, Sean Paul, Jocelyn Falempe,
	Ruben Wauters, Dave Stevenson, Maíra Canal,
	Raspberry Pi Kernel Maintenance, Rob Clark, Dmitry Baryshkov,
	Abhinav Kumar, Jessica Zhang, Marijn Suijten, Xinliang Liu,
	Tian Tao, Xinwei Kong, Sumit Semwal, Yongqin Liu, John Stultz,
	Philipp Zabel, Frank Li, Sascha Hauer, Pengutronix Kernel Team,
	Fabio Estevam, Chun-Kuang Hu, Matthias Brugger,
	AngeloGioacchino Del Regno, Sandy Huang, Heiko Stübner,
	Andy Yan, Alain Volmat, Raphael Gallais-Pou, Yannick Fertre,
	Raphael Gallais-Pou, Philippe Cornu, Maxime Coquelin,
	Alexandre Torgue, Oded Gabbay, Maciej Falkowski, Karol Wachowski,
	Rob Herring (Arm), Tomeu Vizoso, Liviu Dudau, Andrzej Hajda,
	Neil Armstrong, Robert Foss, Laurent Pinchart, Jonas Karlman,
	Jernej Skrabec, Liu Ying, Laurentiu Palcu, Lucas Stach,
	Paul Kocialkowski, Jianmin Lv, Qianhai Wu, Huacai Chen,
	Mingcong Bai, Xi Ruoyao, Icenowy Zheng, Laurent Pinchart,
	Tomi Valkeinen, Kieran Bingham, Geert Uytterhoeven, Magnus Damm,
	Javier Martinez Canillas, Huang Rui, Matthew Auld, Jani Nikula,
	Luca Coelho, Russell King, Christian Gmeiner
  Cc: linux-arch, linux-kernel, linux-modules, linux-doc,
	linux-kselftest, dri-devel, intel-gfx, amd-gfx, virtualization,
	intel-xe, nouveau, spice-devel, linux-arm-msm, freedreno, imx,
	linux-arm-kernel, linux-mediatek, linux-rockchip, linux-stm32,
	linux-renesas-soc, etnaviv, Jim Cromie

These macros are unused, no point in carrying them any more.

NB: these macros were just moved to bounded_sections.lds.h, from
vmlinux.lds.h, which is the known entity, and therefore more
meaningful in the 1-line summary, so thats what I used as the topic.

Signed-off-by: Jim Cromie <jim.cromie@gmail.com>
---
 include/asm-generic/bounded_sections.lds.h | 15 ---------------
 1 file changed, 15 deletions(-)

diff --git a/include/asm-generic/bounded_sections.lds.h b/include/asm-generic/bounded_sections.lds.h
index 43e79603d4af..f5876e68cbe7 100644
--- a/include/asm-generic/bounded_sections.lds.h
+++ b/include/asm-generic/bounded_sections.lds.h
@@ -20,19 +20,4 @@
 
 #define BOUNDED_SECTION(_sec)	 BOUNDED_SECTION_BY(_sec, _sec)
 
-#define HEADERED_SECTION_PRE_LABEL(_sec_, _label_, _BEGIN_, _END_, _HDR_) \
-	_HDR_##_label_	= .;						\
-	KEEP(*(.gnu.linkonce.##_sec_))					\
-	BOUNDED_SECTION_PRE_LABEL(_sec_, _label_, _BEGIN_, _END_)
-
-#define HEADERED_SECTION_POST_LABEL(_sec_, _label_, _BEGIN_, _END_, _HDR_) \
-	_label_##_HDR_ = .;						\
-	KEEP(*(.gnu.linkonce.##_sec_))					\
-	BOUNDED_SECTION_POST_LABEL(_sec_, _label_, _BEGIN_, _END_)
-
-#define HEADERED_SECTION_BY(_sec_, _label_)				\
-	HEADERED_SECTION_PRE_LABEL(_sec_, _label_, __start, __stop)
-
-#define HEADERED_SECTION(_sec)	 HEADERED_SECTION_BY(_sec, _sec)
-
 #endif /* _ASM_GENERIC_BOUNDED_SECTIONS_H */

-- 
2.53.0


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH v14 05/92] dyndbg: factor ddebug_match_desc out from ddebug_change
  2026-04-23 20:53 [PATCH v14 00/92] dyndbg: enable 0-off-cost for all of __drm_debug Jim Cromie
                   ` (3 preceding siblings ...)
  2026-04-23 20:53 ` [PATCH v14 04/92] vmlinux.lds.h: drop unused HEADERED_SECTION* macros Jim Cromie
@ 2026-04-23 20:53 ` Jim Cromie
  2026-04-23 20:53 ` [PATCH v14 06/92] dyndbg: add stub macro for DECLARE_DYNDBG_CLASSMAP Jim Cromie
                   ` (13 subsequent siblings)
  18 siblings, 0 replies; 20+ messages in thread
From: Jim Cromie @ 2026-04-23 20:53 UTC (permalink / raw)
  To: Arnd Bergmann, Jason Baron, Luis Chamberlain, Petr Pavlu,
	Daniel Gomez, Sami Tolvanen, Aaron Tomlin, Andrew Morton,
	Jonathan Corbet, Shuah Khan, Shuah Khan, Greg Kroah-Hartman,
	Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
	Simona Vetter, Jani Nikula, Joonas Lahtinen, Rodrigo Vivi,
	Tvrtko Ursulin, Alex Deucher, Christian König, David Airlie,
	Gerd Hoffmann, Dmitry Osipenko, Gurchetan Singh, Chia-I Wu,
	Matthew Brost, Thomas Hellström, Lyude Paul,
	Danilo Krummrich, Patrik Jakobsson, Zack Rusin,
	Broadcom internal kernel review list, Louis Chauvet,
	Haneen Mohammed, Melissa Wen, Sean Paul, Jocelyn Falempe,
	Ruben Wauters, Dave Stevenson, Maíra Canal,
	Raspberry Pi Kernel Maintenance, Rob Clark, Dmitry Baryshkov,
	Abhinav Kumar, Jessica Zhang, Marijn Suijten, Xinliang Liu,
	Tian Tao, Xinwei Kong, Sumit Semwal, Yongqin Liu, John Stultz,
	Philipp Zabel, Frank Li, Sascha Hauer, Pengutronix Kernel Team,
	Fabio Estevam, Chun-Kuang Hu, Matthias Brugger,
	AngeloGioacchino Del Regno, Sandy Huang, Heiko Stübner,
	Andy Yan, Alain Volmat, Raphael Gallais-Pou, Yannick Fertre,
	Raphael Gallais-Pou, Philippe Cornu, Maxime Coquelin,
	Alexandre Torgue, Oded Gabbay, Maciej Falkowski, Karol Wachowski,
	Rob Herring (Arm), Tomeu Vizoso, Liviu Dudau, Andrzej Hajda,
	Neil Armstrong, Robert Foss, Laurent Pinchart, Jonas Karlman,
	Jernej Skrabec, Liu Ying, Laurentiu Palcu, Lucas Stach,
	Paul Kocialkowski, Jianmin Lv, Qianhai Wu, Huacai Chen,
	Mingcong Bai, Xi Ruoyao, Icenowy Zheng, Laurent Pinchart,
	Tomi Valkeinen, Kieran Bingham, Geert Uytterhoeven, Magnus Damm,
	Javier Martinez Canillas, Huang Rui, Matthew Auld, Jani Nikula,
	Luca Coelho, Russell King, Christian Gmeiner
  Cc: linux-arch, linux-kernel, linux-modules, linux-doc,
	linux-kselftest, dri-devel, intel-gfx, amd-gfx, virtualization,
	intel-xe, nouveau, spice-devel, linux-arm-msm, freedreno, imx,
	linux-arm-kernel, linux-mediatek, linux-rockchip, linux-stm32,
	linux-renesas-soc, etnaviv, Jim Cromie

ddebug_change() is a big (~100 lines) function with a nested for loop.

The outer loop walks the per-module ddebug_tables list, and does
module stuff: it filters on a query's "module FOO*" and "class BAR",
failures here skip the entire inner loop.

The inner loop (60 lines) scans a module's descriptors.  It starts
with a long block of filters on function, line, format, and the
validated "BAR" class (or the legacy/_DPRINTK_CLASS_DFLT).

These filters "continue" past pr_debugs that don't match the query
criteria, before it falls through the code below that counts matches,
then adjusts the flags and static-keys.  This is unnecessarily hard to
think about.

So move the per-descriptor filter-block into a boolean function:
ddebug_match_desc(desc), and change each "continue" to "return false".
This puts a clear interface in place, so any future changes are either
inside, outside, or across this interface.

also fix checkpatch complaints about spaces and braces.

Reviewed-by: Louis Chauvet <louis.chauvet@bootlin.com>
Signed-off-by: Jim Cromie <jim.cromie@gmail.com>
---
 lib/dynamic_debug.c | 83 ++++++++++++++++++++++++++++++-----------------------
 1 file changed, 47 insertions(+), 36 deletions(-)

diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c
index 18a71a9108d3..6b1e983cfedc 100644
--- a/lib/dynamic_debug.c
+++ b/lib/dynamic_debug.c
@@ -172,6 +172,52 @@ static struct ddebug_class_map *ddebug_find_valid_class(struct ddebug_table cons
  * callsites, normally the same as number of changes.  If verbose,
  * logs the changes.  Takes ddebug_lock.
  */
+static bool ddebug_match_desc(const struct ddebug_query *query,
+			      struct _ddebug *dp,
+			      int valid_class)
+{
+	/* match site against query-class */
+	if (dp->class_id != valid_class)
+		return false;
+
+	/* match against the source filename */
+	if (query->filename &&
+	    !match_wildcard(query->filename, dp->filename) &&
+	    !match_wildcard(query->filename,
+			    kbasename(dp->filename)) &&
+	    !match_wildcard(query->filename,
+			    trim_prefix(dp->filename)))
+		return false;
+
+	/* match against the function */
+	if (query->function &&
+	    !match_wildcard(query->function, dp->function))
+		return false;
+
+	/* match against the format */
+	if (query->format) {
+		if (*query->format == '^') {
+			char *p;
+			/* anchored search. match must be at beginning */
+			p = strstr(dp->format, query->format + 1);
+			if (p != dp->format)
+				return false;
+		} else if (!strstr(dp->format, query->format)) {
+			return false;
+		}
+	}
+
+	/* match against the line number range */
+	if (query->first_lineno &&
+	    dp->lineno < query->first_lineno)
+		return false;
+	if (query->last_lineno &&
+	    dp->lineno > query->last_lineno)
+		return false;
+
+	return true;
+}
+
 static int ddebug_change(const struct ddebug_query *query,
 			 struct flag_settings *modifiers)
 {
@@ -204,42 +250,7 @@ static int ddebug_change(const struct ddebug_query *query,
 		for (i = 0; i < dt->num_ddebugs; i++) {
 			struct _ddebug *dp = &dt->ddebugs[i];
 
-			/* match site against query-class */
-			if (dp->class_id != valid_class)
-				continue;
-
-			/* match against the source filename */
-			if (query->filename &&
-			    !match_wildcard(query->filename, dp->filename) &&
-			    !match_wildcard(query->filename,
-					   kbasename(dp->filename)) &&
-			    !match_wildcard(query->filename,
-					   trim_prefix(dp->filename)))
-				continue;
-
-			/* match against the function */
-			if (query->function &&
-			    !match_wildcard(query->function, dp->function))
-				continue;
-
-			/* match against the format */
-			if (query->format) {
-				if (*query->format == '^') {
-					char *p;
-					/* anchored search. match must be at beginning */
-					p = strstr(dp->format, query->format+1);
-					if (p != dp->format)
-						continue;
-				} else if (!strstr(dp->format, query->format))
-					continue;
-			}
-
-			/* match against the line number range */
-			if (query->first_lineno &&
-			    dp->lineno < query->first_lineno)
-				continue;
-			if (query->last_lineno &&
-			    dp->lineno > query->last_lineno)
+			if (!ddebug_match_desc(query, dp, valid_class))
 				continue;
 
 			nfound++;

-- 
2.53.0


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH v14 06/92] dyndbg: add stub macro for DECLARE_DYNDBG_CLASSMAP
  2026-04-23 20:53 [PATCH v14 00/92] dyndbg: enable 0-off-cost for all of __drm_debug Jim Cromie
                   ` (4 preceding siblings ...)
  2026-04-23 20:53 ` [PATCH v14 05/92] dyndbg: factor ddebug_match_desc out from ddebug_change Jim Cromie
@ 2026-04-23 20:53 ` Jim Cromie
  2026-04-23 20:53 ` [PATCH v14 07/92] docs/dyndbg: update examples \012 to \n Jim Cromie
                   ` (12 subsequent siblings)
  18 siblings, 0 replies; 20+ messages in thread
From: Jim Cromie @ 2026-04-23 20:53 UTC (permalink / raw)
  To: Arnd Bergmann, Jason Baron, Luis Chamberlain, Petr Pavlu,
	Daniel Gomez, Sami Tolvanen, Aaron Tomlin, Andrew Morton,
	Jonathan Corbet, Shuah Khan, Shuah Khan, Greg Kroah-Hartman,
	Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
	Simona Vetter, Jani Nikula, Joonas Lahtinen, Rodrigo Vivi,
	Tvrtko Ursulin, Alex Deucher, Christian König, David Airlie,
	Gerd Hoffmann, Dmitry Osipenko, Gurchetan Singh, Chia-I Wu,
	Matthew Brost, Thomas Hellström, Lyude Paul,
	Danilo Krummrich, Patrik Jakobsson, Zack Rusin,
	Broadcom internal kernel review list, Louis Chauvet,
	Haneen Mohammed, Melissa Wen, Sean Paul, Jocelyn Falempe,
	Ruben Wauters, Dave Stevenson, Maíra Canal,
	Raspberry Pi Kernel Maintenance, Rob Clark, Dmitry Baryshkov,
	Abhinav Kumar, Jessica Zhang, Marijn Suijten, Xinliang Liu,
	Tian Tao, Xinwei Kong, Sumit Semwal, Yongqin Liu, John Stultz,
	Philipp Zabel, Frank Li, Sascha Hauer, Pengutronix Kernel Team,
	Fabio Estevam, Chun-Kuang Hu, Matthias Brugger,
	AngeloGioacchino Del Regno, Sandy Huang, Heiko Stübner,
	Andy Yan, Alain Volmat, Raphael Gallais-Pou, Yannick Fertre,
	Raphael Gallais-Pou, Philippe Cornu, Maxime Coquelin,
	Alexandre Torgue, Oded Gabbay, Maciej Falkowski, Karol Wachowski,
	Rob Herring (Arm), Tomeu Vizoso, Liviu Dudau, Andrzej Hajda,
	Neil Armstrong, Robert Foss, Laurent Pinchart, Jonas Karlman,
	Jernej Skrabec, Liu Ying, Laurentiu Palcu, Lucas Stach,
	Paul Kocialkowski, Jianmin Lv, Qianhai Wu, Huacai Chen,
	Mingcong Bai, Xi Ruoyao, Icenowy Zheng, Laurent Pinchart,
	Tomi Valkeinen, Kieran Bingham, Geert Uytterhoeven, Magnus Damm,
	Javier Martinez Canillas, Huang Rui, Matthew Auld, Jani Nikula,
	Luca Coelho, Russell King, Christian Gmeiner
  Cc: linux-arch, linux-kernel, linux-modules, linux-doc,
	linux-kselftest, dri-devel, intel-gfx, amd-gfx, virtualization,
	intel-xe, nouveau, spice-devel, linux-arm-msm, freedreno, imx,
	linux-arm-kernel, linux-mediatek, linux-rockchip, linux-stm32,
	linux-renesas-soc, etnaviv, Jim Cromie

Add the stub macro for !DYNAMIC_DEBUG builds, after moving the
original macro-defn down under the big ifdef.  Do it now so future
changes have a cleaner starting point.

Signed-off-by: Jim Cromie <jim.cromie@gmail.com>
---
 include/linux/dynamic_debug.h | 43 ++++++++++++++++++++++---------------------
 1 file changed, 22 insertions(+), 21 deletions(-)

diff --git a/include/linux/dynamic_debug.h b/include/linux/dynamic_debug.h
index 05743900a116..a10adac8e8f0 100644
--- a/include/linux/dynamic_debug.h
+++ b/include/linux/dynamic_debug.h
@@ -93,27 +93,6 @@ struct ddebug_class_map {
 	enum class_map_type map_type;
 };
 
-/**
- * DECLARE_DYNDBG_CLASSMAP - declare classnames known by a module
- * @_var:   a struct ddebug_class_map, passed to module_param_cb
- * @_type:  enum class_map_type, chooses bits/verbose, numeric/symbolic
- * @_base:  offset of 1st class-name. splits .class_id space
- * @classes: class-names used to control class'd prdbgs
- */
-#define DECLARE_DYNDBG_CLASSMAP(_var, _maptype, _base, ...)		\
-	static const char *_var##_classnames[] = { __VA_ARGS__ };	\
-	static struct ddebug_class_map __aligned(8) __used		\
-		__section("__dyndbg_classes") _var = {			\
-		.mod = THIS_MODULE,					\
-		.mod_name = KBUILD_MODNAME,				\
-		.base = _base,						\
-		.map_type = _maptype,					\
-		.length = NUM_TYPE_ARGS(char*, __VA_ARGS__),		\
-		.class_names = _var##_classnames,			\
-	}
-#define NUM_TYPE_ARGS(eltype, ...)				\
-        (sizeof((eltype[]){__VA_ARGS__}) / sizeof(eltype))
-
 /* encapsulate linker provided built-in (or module) dyndbg data */
 struct _ddebug_info {
 	struct _ddebug *descs;
@@ -138,6 +117,27 @@ struct ddebug_class_param {
 #if defined(CONFIG_DYNAMIC_DEBUG) || \
 	(defined(CONFIG_DYNAMIC_DEBUG_CORE) && defined(DYNAMIC_DEBUG_MODULE))
 
+/**
+ * DECLARE_DYNDBG_CLASSMAP - declare classnames known by a module
+ * @_var:   a struct ddebug_class_map, passed to module_param_cb
+ * @_type:  enum class_map_type, chooses bits/verbose, numeric/symbolic
+ * @_base:  offset of 1st class-name. splits .class_id space
+ * @classes: class-names used to control class'd prdbgs
+ */
+#define DECLARE_DYNDBG_CLASSMAP(_var, _maptype, _base, ...)		\
+	static const char *_var##_classnames[] = { __VA_ARGS__ };	\
+	static struct ddebug_class_map __aligned(8) __used		\
+		__section("__dyndbg_classes") _var = {			\
+		.mod = THIS_MODULE,					\
+		.mod_name = KBUILD_MODNAME,				\
+		.base = _base,						\
+		.map_type = _maptype,					\
+		.length = NUM_TYPE_ARGS(char*, __VA_ARGS__),		\
+		.class_names = _var##_classnames,			\
+	}
+#define NUM_TYPE_ARGS(eltype, ...)				\
+	(sizeof((eltype[]) {__VA_ARGS__}) / sizeof(eltype))
+
 extern __printf(2, 3)
 void __dynamic_pr_debug(struct _ddebug *descriptor, const char *fmt, ...);
 
@@ -314,6 +314,7 @@ void __dynamic_ibdev_dbg(struct _ddebug *descriptor,
 
 #define DEFINE_DYNAMIC_DEBUG_METADATA(name, fmt)
 #define DYNAMIC_DEBUG_BRANCH(descriptor) false
+#define DECLARE_DYNDBG_CLASSMAP(...)
 
 #define dynamic_pr_debug(fmt, ...)					\
 	no_printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__)

-- 
2.53.0


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH v14 07/92] docs/dyndbg: update examples \012 to \n
  2026-04-23 20:53 [PATCH v14 00/92] dyndbg: enable 0-off-cost for all of __drm_debug Jim Cromie
                   ` (5 preceding siblings ...)
  2026-04-23 20:53 ` [PATCH v14 06/92] dyndbg: add stub macro for DECLARE_DYNDBG_CLASSMAP Jim Cromie
@ 2026-04-23 20:53 ` Jim Cromie
  2026-04-23 20:53 ` [PATCH v14 08/92] docs/dyndbg: explain flags parse 1st Jim Cromie
                   ` (11 subsequent siblings)
  18 siblings, 0 replies; 20+ messages in thread
From: Jim Cromie @ 2026-04-23 20:53 UTC (permalink / raw)
  To: Arnd Bergmann, Jason Baron, Luis Chamberlain, Petr Pavlu,
	Daniel Gomez, Sami Tolvanen, Aaron Tomlin, Andrew Morton,
	Jonathan Corbet, Shuah Khan, Shuah Khan, Greg Kroah-Hartman,
	Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
	Simona Vetter, Jani Nikula, Joonas Lahtinen, Rodrigo Vivi,
	Tvrtko Ursulin, Alex Deucher, Christian König, David Airlie,
	Gerd Hoffmann, Dmitry Osipenko, Gurchetan Singh, Chia-I Wu,
	Matthew Brost, Thomas Hellström, Lyude Paul,
	Danilo Krummrich, Patrik Jakobsson, Zack Rusin,
	Broadcom internal kernel review list, Louis Chauvet,
	Haneen Mohammed, Melissa Wen, Sean Paul, Jocelyn Falempe,
	Ruben Wauters, Dave Stevenson, Maíra Canal,
	Raspberry Pi Kernel Maintenance, Rob Clark, Dmitry Baryshkov,
	Abhinav Kumar, Jessica Zhang, Marijn Suijten, Xinliang Liu,
	Tian Tao, Xinwei Kong, Sumit Semwal, Yongqin Liu, John Stultz,
	Philipp Zabel, Frank Li, Sascha Hauer, Pengutronix Kernel Team,
	Fabio Estevam, Chun-Kuang Hu, Matthias Brugger,
	AngeloGioacchino Del Regno, Sandy Huang, Heiko Stübner,
	Andy Yan, Alain Volmat, Raphael Gallais-Pou, Yannick Fertre,
	Raphael Gallais-Pou, Philippe Cornu, Maxime Coquelin,
	Alexandre Torgue, Oded Gabbay, Maciej Falkowski, Karol Wachowski,
	Rob Herring (Arm), Tomeu Vizoso, Liviu Dudau, Andrzej Hajda,
	Neil Armstrong, Robert Foss, Laurent Pinchart, Jonas Karlman,
	Jernej Skrabec, Liu Ying, Laurentiu Palcu, Lucas Stach,
	Paul Kocialkowski, Jianmin Lv, Qianhai Wu, Huacai Chen,
	Mingcong Bai, Xi Ruoyao, Icenowy Zheng, Laurent Pinchart,
	Tomi Valkeinen, Kieran Bingham, Geert Uytterhoeven, Magnus Damm,
	Javier Martinez Canillas, Huang Rui, Matthew Auld, Jani Nikula,
	Luca Coelho, Russell King, Christian Gmeiner
  Cc: linux-arch, linux-kernel, linux-modules, linux-doc,
	linux-kselftest, dri-devel, intel-gfx, amd-gfx, virtualization,
	intel-xe, nouveau, spice-devel, linux-arm-msm, freedreno, imx,
	linux-arm-kernel, linux-mediatek, linux-rockchip, linux-stm32,
	linux-renesas-soc, etnaviv, Jim Cromie

commit 47ea6f99d06e ("dyndbg: use ESCAPE_SPACE for cat control")
changed the control-file to display format strings with "\n" rather
than "\012".  Update the docs to match the new reality.

Reviewed-by: Louis Chauvet <louis.chauvet@bootlin.com>
Tested-by: Louis Chauvet <louis.chauvet@bootlin.com>
Signed-off-by: Jim Cromie <jim.cromie@gmail.com>
---
 Documentation/admin-guide/dynamic-debug-howto.rst | 20 ++++++++++----------
 1 file changed, 10 insertions(+), 10 deletions(-)

diff --git a/Documentation/admin-guide/dynamic-debug-howto.rst b/Documentation/admin-guide/dynamic-debug-howto.rst
index 095a63892257..4b14d9fd0300 100644
--- a/Documentation/admin-guide/dynamic-debug-howto.rst
+++ b/Documentation/admin-guide/dynamic-debug-howto.rst
@@ -38,12 +38,12 @@ You can view the currently configured behaviour in the *prdbg* catalog::
 
   :#> head -n7 /proc/dynamic_debug/control
   # filename:lineno [module]function flags format
-  init/main.c:1179 [main]initcall_blacklist =_ "blacklisting initcall %s\012
-  init/main.c:1218 [main]initcall_blacklisted =_ "initcall %s blacklisted\012"
-  init/main.c:1424 [main]run_init_process =_ "  with arguments:\012"
-  init/main.c:1426 [main]run_init_process =_ "    %s\012"
-  init/main.c:1427 [main]run_init_process =_ "  with environment:\012"
-  init/main.c:1429 [main]run_init_process =_ "    %s\012"
+  init/main.c:1179 [main]initcall_blacklist =_ "blacklisting initcall %s\n"
+  init/main.c:1218 [main]initcall_blacklisted =_ "initcall %s blacklisted\n"
+  init/main.c:1424 [main]run_init_process =_ "  with arguments:\n"
+  init/main.c:1426 [main]run_init_process =_ "    %s\n"
+  init/main.c:1427 [main]run_init_process =_ "  with environment:\n"
+  init/main.c:1429 [main]run_init_process =_ "    %s\n"
 
 The 3rd space-delimited column shows the current flags, preceded by
 a ``=`` for easy use with grep/cut. ``=p`` shows enabled callsites.
@@ -59,10 +59,10 @@ query/commands to the control file.  Example::
 
   :#> ddcmd '-p; module main func run* +p'
   :#> grep =p /proc/dynamic_debug/control
-  init/main.c:1424 [main]run_init_process =p "  with arguments:\012"
-  init/main.c:1426 [main]run_init_process =p "    %s\012"
-  init/main.c:1427 [main]run_init_process =p "  with environment:\012"
-  init/main.c:1429 [main]run_init_process =p "    %s\012"
+  init/main.c:1424 [main]run_init_process =p "  with arguments:\n"
+  init/main.c:1426 [main]run_init_process =p "    %s\n"
+  init/main.c:1427 [main]run_init_process =p "  with environment:\n"
+  init/main.c:1429 [main]run_init_process =p "    %s\n"
 
 Error messages go to console/syslog::
 

-- 
2.53.0


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH v14 08/92] docs/dyndbg: explain flags parse 1st
  2026-04-23 20:53 [PATCH v14 00/92] dyndbg: enable 0-off-cost for all of __drm_debug Jim Cromie
                   ` (6 preceding siblings ...)
  2026-04-23 20:53 ` [PATCH v14 07/92] docs/dyndbg: update examples \012 to \n Jim Cromie
@ 2026-04-23 20:53 ` Jim Cromie
  2026-04-23 20:53 ` [PATCH v14 09/92] test-dyndbg: fixup CLASSMAP usage error Jim Cromie
                   ` (10 subsequent siblings)
  18 siblings, 0 replies; 20+ messages in thread
From: Jim Cromie @ 2026-04-23 20:53 UTC (permalink / raw)
  To: Arnd Bergmann, Jason Baron, Luis Chamberlain, Petr Pavlu,
	Daniel Gomez, Sami Tolvanen, Aaron Tomlin, Andrew Morton,
	Jonathan Corbet, Shuah Khan, Shuah Khan, Greg Kroah-Hartman,
	Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
	Simona Vetter, Jani Nikula, Joonas Lahtinen, Rodrigo Vivi,
	Tvrtko Ursulin, Alex Deucher, Christian König, David Airlie,
	Gerd Hoffmann, Dmitry Osipenko, Gurchetan Singh, Chia-I Wu,
	Matthew Brost, Thomas Hellström, Lyude Paul,
	Danilo Krummrich, Patrik Jakobsson, Zack Rusin,
	Broadcom internal kernel review list, Louis Chauvet,
	Haneen Mohammed, Melissa Wen, Sean Paul, Jocelyn Falempe,
	Ruben Wauters, Dave Stevenson, Maíra Canal,
	Raspberry Pi Kernel Maintenance, Rob Clark, Dmitry Baryshkov,
	Abhinav Kumar, Jessica Zhang, Marijn Suijten, Xinliang Liu,
	Tian Tao, Xinwei Kong, Sumit Semwal, Yongqin Liu, John Stultz,
	Philipp Zabel, Frank Li, Sascha Hauer, Pengutronix Kernel Team,
	Fabio Estevam, Chun-Kuang Hu, Matthias Brugger,
	AngeloGioacchino Del Regno, Sandy Huang, Heiko Stübner,
	Andy Yan, Alain Volmat, Raphael Gallais-Pou, Yannick Fertre,
	Raphael Gallais-Pou, Philippe Cornu, Maxime Coquelin,
	Alexandre Torgue, Oded Gabbay, Maciej Falkowski, Karol Wachowski,
	Rob Herring (Arm), Tomeu Vizoso, Liviu Dudau, Andrzej Hajda,
	Neil Armstrong, Robert Foss, Laurent Pinchart, Jonas Karlman,
	Jernej Skrabec, Liu Ying, Laurentiu Palcu, Lucas Stach,
	Paul Kocialkowski, Jianmin Lv, Qianhai Wu, Huacai Chen,
	Mingcong Bai, Xi Ruoyao, Icenowy Zheng, Laurent Pinchart,
	Tomi Valkeinen, Kieran Bingham, Geert Uytterhoeven, Magnus Damm,
	Javier Martinez Canillas, Huang Rui, Matthew Auld, Jani Nikula,
	Luca Coelho, Russell King, Christian Gmeiner
  Cc: linux-arch, linux-kernel, linux-modules, linux-doc,
	linux-kselftest, dri-devel, intel-gfx, amd-gfx, virtualization,
	intel-xe, nouveau, spice-devel, linux-arm-msm, freedreno, imx,
	linux-arm-kernel, linux-mediatek, linux-rockchip, linux-stm32,
	linux-renesas-soc, etnaviv, Jim Cromie

When writing queries to >control, flags are parsed 1st, since they are
the only required field, and they require specific compositions.  So
if the flags draw an error (on those specifics), then keyword errors
aren't reported.  This can be mildly confusing/annoying, so explain it
instead.

cc: linux-doc@vger.kernel.org
Reviewed-by: Louis Chauvet <louis.chauvet@bootlin.com>
Signed-off-by: Jim Cromie <jim.cromie@gmail.com>
---
 Documentation/admin-guide/dynamic-debug-howto.rst | 17 +++++++++++++----
 1 file changed, 13 insertions(+), 4 deletions(-)

diff --git a/Documentation/admin-guide/dynamic-debug-howto.rst b/Documentation/admin-guide/dynamic-debug-howto.rst
index 4b14d9fd0300..9c2f096ed1d8 100644
--- a/Documentation/admin-guide/dynamic-debug-howto.rst
+++ b/Documentation/admin-guide/dynamic-debug-howto.rst
@@ -109,10 +109,19 @@ The match-spec's select *prdbgs* from the catalog, upon which to apply
 the flags-spec, all constraints are ANDed together.  An absent keyword
 is the same as keyword "*".
 
-
-A match specification is a keyword, which selects the attribute of
-the callsite to be compared, and a value to compare against.  Possible
-keywords are:::
+Note that since the match-spec can be empty, the flags are checked 1st,
+then the pairs of keyword and value.  Flag errs will hide keyword errs::
+
+  bash-5.2# ddcmd mod bar +foo
+  dyndbg: read 13 bytes from userspace
+  dyndbg: query 0: "mod bar +foo" mod:*
+  dyndbg: unknown flag 'o'
+  dyndbg: flags parse failed
+  dyndbg: processed 1 queries, with 0 matches, 1 errs
+
+So a match-spec is a keyword, which selects the attribute of the
+callsite to be compared, and a value to compare against.  Possible
+keywords are::
 
   match-spec ::= 'func' string |
 		 'file' string |

-- 
2.53.0


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH v14 09/92] test-dyndbg: fixup CLASSMAP usage error
  2026-04-23 20:53 [PATCH v14 00/92] dyndbg: enable 0-off-cost for all of __drm_debug Jim Cromie
                   ` (7 preceding siblings ...)
  2026-04-23 20:53 ` [PATCH v14 08/92] docs/dyndbg: explain flags parse 1st Jim Cromie
@ 2026-04-23 20:53 ` Jim Cromie
  2026-04-23 20:53 ` [PATCH v14 10/92] dyndbg: reword "class unknown," to "class:_UNKNOWN_" Jim Cromie
                   ` (9 subsequent siblings)
  18 siblings, 0 replies; 20+ messages in thread
From: Jim Cromie @ 2026-04-23 20:53 UTC (permalink / raw)
  To: Arnd Bergmann, Jason Baron, Luis Chamberlain, Petr Pavlu,
	Daniel Gomez, Sami Tolvanen, Aaron Tomlin, Andrew Morton,
	Jonathan Corbet, Shuah Khan, Shuah Khan, Greg Kroah-Hartman,
	Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
	Simona Vetter, Jani Nikula, Joonas Lahtinen, Rodrigo Vivi,
	Tvrtko Ursulin, Alex Deucher, Christian König, David Airlie,
	Gerd Hoffmann, Dmitry Osipenko, Gurchetan Singh, Chia-I Wu,
	Matthew Brost, Thomas Hellström, Lyude Paul,
	Danilo Krummrich, Patrik Jakobsson, Zack Rusin,
	Broadcom internal kernel review list, Louis Chauvet,
	Haneen Mohammed, Melissa Wen, Sean Paul, Jocelyn Falempe,
	Ruben Wauters, Dave Stevenson, Maíra Canal,
	Raspberry Pi Kernel Maintenance, Rob Clark, Dmitry Baryshkov,
	Abhinav Kumar, Jessica Zhang, Marijn Suijten, Xinliang Liu,
	Tian Tao, Xinwei Kong, Sumit Semwal, Yongqin Liu, John Stultz,
	Philipp Zabel, Frank Li, Sascha Hauer, Pengutronix Kernel Team,
	Fabio Estevam, Chun-Kuang Hu, Matthias Brugger,
	AngeloGioacchino Del Regno, Sandy Huang, Heiko Stübner,
	Andy Yan, Alain Volmat, Raphael Gallais-Pou, Yannick Fertre,
	Raphael Gallais-Pou, Philippe Cornu, Maxime Coquelin,
	Alexandre Torgue, Oded Gabbay, Maciej Falkowski, Karol Wachowski,
	Rob Herring (Arm), Tomeu Vizoso, Liviu Dudau, Andrzej Hajda,
	Neil Armstrong, Robert Foss, Laurent Pinchart, Jonas Karlman,
	Jernej Skrabec, Liu Ying, Laurentiu Palcu, Lucas Stach,
	Paul Kocialkowski, Jianmin Lv, Qianhai Wu, Huacai Chen,
	Mingcong Bai, Xi Ruoyao, Icenowy Zheng, Laurent Pinchart,
	Tomi Valkeinen, Kieran Bingham, Geert Uytterhoeven, Magnus Damm,
	Javier Martinez Canillas, Huang Rui, Matthew Auld, Jani Nikula,
	Luca Coelho, Russell King, Christian Gmeiner
  Cc: linux-arch, linux-kernel, linux-modules, linux-doc,
	linux-kselftest, dri-devel, intel-gfx, amd-gfx, virtualization,
	intel-xe, nouveau, spice-devel, linux-arm-msm, freedreno, imx,
	linux-arm-kernel, linux-mediatek, linux-rockchip, linux-stm32,
	linux-renesas-soc, etnaviv, Jim Cromie

commit 6ea3bf466ac6 ("dyndbg: test DECLARE_DYNDBG_CLASSMAP, sysfs nodes")

A closer look at test_dynamic_debug.ko logging output reveals a macro
usage error:

lib/test_dynamic_debug.c:105 [test_dynamic_debug]do_cats =p "LOW msg\n" class:MID
lib/test_dynamic_debug.c:106 [test_dynamic_debug]do_cats =p "MID msg\n" class:HI
lib/test_dynamic_debug.c:107 [test_dynamic_debug]do_cats =_ "HI msg\n" class unknown, _id:13

107 says: HI is unknown, and 105,106 have a LOW/MID and MID/HI skew.

DECLARE_DYNDBG_CLASSMAP() _base arg must equal the enum's 1st value,
in this case it was _base + 1.  This leaves HI class un-selectable.

NB: the macro could better validate its arguments.

Reviewed-by: Louis Chauvet <louis.chauvet@bootlin.com>
Tested-by: Louis Chauvet <louis.chauvet@bootlin.com>
Signed-off-by: Jim Cromie <jim.cromie@gmail.com>
---
 lib/test_dynamic_debug.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lib/test_dynamic_debug.c b/lib/test_dynamic_debug.c
index 77c2a669b6af..396144cf351b 100644
--- a/lib/test_dynamic_debug.c
+++ b/lib/test_dynamic_debug.c
@@ -75,7 +75,7 @@ DD_SYS_WRAP(disjoint_bits, p);
 DD_SYS_WRAP(disjoint_bits, T);
 
 /* symbolic input, independent bits */
-enum cat_disjoint_names { LOW = 11, MID, HI };
+enum cat_disjoint_names { LOW = 10, MID, HI };
 DECLARE_DYNDBG_CLASSMAP(map_disjoint_names, DD_CLASS_TYPE_DISJOINT_NAMES, 10,
 			"LOW", "MID", "HI");
 DD_SYS_WRAP(disjoint_names, p);

-- 
2.53.0


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH v14 10/92] dyndbg: reword "class unknown," to "class:_UNKNOWN_"
  2026-04-23 20:53 [PATCH v14 00/92] dyndbg: enable 0-off-cost for all of __drm_debug Jim Cromie
                   ` (8 preceding siblings ...)
  2026-04-23 20:53 ` [PATCH v14 09/92] test-dyndbg: fixup CLASSMAP usage error Jim Cromie
@ 2026-04-23 20:53 ` Jim Cromie
  2026-04-23 20:53 ` [PATCH v14 11/92] dyndbg: make ddebug_class_param union members same size Jim Cromie
                   ` (8 subsequent siblings)
  18 siblings, 0 replies; 20+ messages in thread
From: Jim Cromie @ 2026-04-23 20:53 UTC (permalink / raw)
  To: Arnd Bergmann, Jason Baron, Luis Chamberlain, Petr Pavlu,
	Daniel Gomez, Sami Tolvanen, Aaron Tomlin, Andrew Morton,
	Jonathan Corbet, Shuah Khan, Shuah Khan, Greg Kroah-Hartman,
	Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
	Simona Vetter, Jani Nikula, Joonas Lahtinen, Rodrigo Vivi,
	Tvrtko Ursulin, Alex Deucher, Christian König, David Airlie,
	Gerd Hoffmann, Dmitry Osipenko, Gurchetan Singh, Chia-I Wu,
	Matthew Brost, Thomas Hellström, Lyude Paul,
	Danilo Krummrich, Patrik Jakobsson, Zack Rusin,
	Broadcom internal kernel review list, Louis Chauvet,
	Haneen Mohammed, Melissa Wen, Sean Paul, Jocelyn Falempe,
	Ruben Wauters, Dave Stevenson, Maíra Canal,
	Raspberry Pi Kernel Maintenance, Rob Clark, Dmitry Baryshkov,
	Abhinav Kumar, Jessica Zhang, Marijn Suijten, Xinliang Liu,
	Tian Tao, Xinwei Kong, Sumit Semwal, Yongqin Liu, John Stultz,
	Philipp Zabel, Frank Li, Sascha Hauer, Pengutronix Kernel Team,
	Fabio Estevam, Chun-Kuang Hu, Matthias Brugger,
	AngeloGioacchino Del Regno, Sandy Huang, Heiko Stübner,
	Andy Yan, Alain Volmat, Raphael Gallais-Pou, Yannick Fertre,
	Raphael Gallais-Pou, Philippe Cornu, Maxime Coquelin,
	Alexandre Torgue, Oded Gabbay, Maciej Falkowski, Karol Wachowski,
	Rob Herring (Arm), Tomeu Vizoso, Liviu Dudau, Andrzej Hajda,
	Neil Armstrong, Robert Foss, Laurent Pinchart, Jonas Karlman,
	Jernej Skrabec, Liu Ying, Laurentiu Palcu, Lucas Stach,
	Paul Kocialkowski, Jianmin Lv, Qianhai Wu, Huacai Chen,
	Mingcong Bai, Xi Ruoyao, Icenowy Zheng, Laurent Pinchart,
	Tomi Valkeinen, Kieran Bingham, Geert Uytterhoeven, Magnus Damm,
	Javier Martinez Canillas, Huang Rui, Matthew Auld, Jani Nikula,
	Luca Coelho, Russell King, Christian Gmeiner
  Cc: linux-arch, linux-kernel, linux-modules, linux-doc,
	linux-kselftest, dri-devel, intel-gfx, amd-gfx, virtualization,
	intel-xe, nouveau, spice-devel, linux-arm-msm, freedreno, imx,
	linux-arm-kernel, linux-mediatek, linux-rockchip, linux-stm32,
	linux-renesas-soc, etnaviv, Jim Cromie

When a dyndbg classname is unknown to a kernel module (as before
previous patch), the callsite is un-addressable via >control queries.

The control-file displays this condition as "class unknown,"
currently.  That spelling is sub-optimal/too-generic, so change it to
"class:_UNKNOWN_" to loudly announce the erroneous situation, and to
make it uniquely greppable.

Reviewed-by: Louis Chauvet <louis.chauvet@bootlin.com>
Signed-off-by: Jim Cromie <jim.cromie@gmail.com>
---
 lib/dynamic_debug.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c
index 6b1e983cfedc..a9caf84ddb22 100644
--- a/lib/dynamic_debug.c
+++ b/lib/dynamic_debug.c
@@ -1166,7 +1166,7 @@ static int ddebug_proc_show(struct seq_file *m, void *p)
 		if (class)
 			seq_printf(m, " class:%s", class);
 		else
-			seq_printf(m, " class unknown, _id:%d", dp->class_id);
+			seq_printf(m, " class:_UNKNOWN_ _id:%d", dp->class_id);
 	}
 	seq_putc(m, '\n');
 

-- 
2.53.0


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH v14 11/92] dyndbg: make ddebug_class_param union members same size
  2026-04-23 20:53 [PATCH v14 00/92] dyndbg: enable 0-off-cost for all of __drm_debug Jim Cromie
                   ` (9 preceding siblings ...)
  2026-04-23 20:53 ` [PATCH v14 10/92] dyndbg: reword "class unknown," to "class:_UNKNOWN_" Jim Cromie
@ 2026-04-23 20:53 ` Jim Cromie
  2026-04-23 20:53 ` [PATCH v14 12/92] dyndbg: drop NUM_TYPE_ARRAY Jim Cromie
                   ` (7 subsequent siblings)
  18 siblings, 0 replies; 20+ messages in thread
From: Jim Cromie @ 2026-04-23 20:53 UTC (permalink / raw)
  To: Arnd Bergmann, Jason Baron, Luis Chamberlain, Petr Pavlu,
	Daniel Gomez, Sami Tolvanen, Aaron Tomlin, Andrew Morton,
	Jonathan Corbet, Shuah Khan, Shuah Khan, Greg Kroah-Hartman,
	Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
	Simona Vetter, Jani Nikula, Joonas Lahtinen, Rodrigo Vivi,
	Tvrtko Ursulin, Alex Deucher, Christian König, David Airlie,
	Gerd Hoffmann, Dmitry Osipenko, Gurchetan Singh, Chia-I Wu,
	Matthew Brost, Thomas Hellström, Lyude Paul,
	Danilo Krummrich, Patrik Jakobsson, Zack Rusin,
	Broadcom internal kernel review list, Louis Chauvet,
	Haneen Mohammed, Melissa Wen, Sean Paul, Jocelyn Falempe,
	Ruben Wauters, Dave Stevenson, Maíra Canal,
	Raspberry Pi Kernel Maintenance, Rob Clark, Dmitry Baryshkov,
	Abhinav Kumar, Jessica Zhang, Marijn Suijten, Xinliang Liu,
	Tian Tao, Xinwei Kong, Sumit Semwal, Yongqin Liu, John Stultz,
	Philipp Zabel, Frank Li, Sascha Hauer, Pengutronix Kernel Team,
	Fabio Estevam, Chun-Kuang Hu, Matthias Brugger,
	AngeloGioacchino Del Regno, Sandy Huang, Heiko Stübner,
	Andy Yan, Alain Volmat, Raphael Gallais-Pou, Yannick Fertre,
	Raphael Gallais-Pou, Philippe Cornu, Maxime Coquelin,
	Alexandre Torgue, Oded Gabbay, Maciej Falkowski, Karol Wachowski,
	Rob Herring (Arm), Tomeu Vizoso, Liviu Dudau, Andrzej Hajda,
	Neil Armstrong, Robert Foss, Laurent Pinchart, Jonas Karlman,
	Jernej Skrabec, Liu Ying, Laurentiu Palcu, Lucas Stach,
	Paul Kocialkowski, Jianmin Lv, Qianhai Wu, Huacai Chen,
	Mingcong Bai, Xi Ruoyao, Icenowy Zheng, Laurent Pinchart,
	Tomi Valkeinen, Kieran Bingham, Geert Uytterhoeven, Magnus Damm,
	Javier Martinez Canillas, Huang Rui, Matthew Auld, Jani Nikula,
	Luca Coelho, Russell King, Christian Gmeiner
  Cc: linux-arch, linux-kernel, linux-modules, linux-doc,
	linux-kselftest, dri-devel, intel-gfx, amd-gfx, virtualization,
	intel-xe, nouveau, spice-devel, linux-arm-msm, freedreno, imx,
	linux-arm-kernel, linux-mediatek, linux-rockchip, linux-stm32,
	linux-renesas-soc, etnaviv, Jim Cromie

struct ddebug_class_param keeps a ref to the state-storage of the
param; make both class-types use the same unsigned long storage type.

ISTM this is simpler and safer; it avoids an irrelevant difference,
and if 2 users somehow get class-type mixed up (or refer to the wrong
union member), at least they will both see the same value.

Reviewed-by: Louis Chauvet <louis.chauvet@bootlin.com>
Signed-off-by: Jim Cromie <jim.cromie@gmail.com>
---
 include/linux/dynamic_debug.h | 2 +-
 lib/dynamic_debug.c           | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/include/linux/dynamic_debug.h b/include/linux/dynamic_debug.h
index a10adac8e8f0..441305277914 100644
--- a/include/linux/dynamic_debug.h
+++ b/include/linux/dynamic_debug.h
@@ -104,7 +104,7 @@ struct _ddebug_info {
 struct ddebug_class_param {
 	union {
 		unsigned long *bits;
-		unsigned int *lvl;
+		unsigned long *lvl;
 	};
 	char flags[8];
 	const struct ddebug_class_map *map;
diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c
index a9caf84ddb22..ffa1cf7c2c72 100644
--- a/lib/dynamic_debug.c
+++ b/lib/dynamic_debug.c
@@ -811,7 +811,7 @@ int param_get_dyndbg_classes(char *buffer, const struct kernel_param *kp)
 
 	case DD_CLASS_TYPE_LEVEL_NAMES:
 	case DD_CLASS_TYPE_LEVEL_NUM:
-		return scnprintf(buffer, PAGE_SIZE, "%d\n", *dcp->lvl);
+		return scnprintf(buffer, PAGE_SIZE, "%ld\n", *dcp->lvl);
 	default:
 		return -1;
 	}

-- 
2.53.0


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH v14 12/92] dyndbg: drop NUM_TYPE_ARRAY
  2026-04-23 20:53 [PATCH v14 00/92] dyndbg: enable 0-off-cost for all of __drm_debug Jim Cromie
                   ` (10 preceding siblings ...)
  2026-04-23 20:53 ` [PATCH v14 11/92] dyndbg: make ddebug_class_param union members same size Jim Cromie
@ 2026-04-23 20:53 ` Jim Cromie
  2026-04-23 20:53 ` [PATCH v14 13/92] dyndbg: tweak pr_fmt to avoid expansion conflicts Jim Cromie
                   ` (6 subsequent siblings)
  18 siblings, 0 replies; 20+ messages in thread
From: Jim Cromie @ 2026-04-23 20:53 UTC (permalink / raw)
  To: Arnd Bergmann, Jason Baron, Luis Chamberlain, Petr Pavlu,
	Daniel Gomez, Sami Tolvanen, Aaron Tomlin, Andrew Morton,
	Jonathan Corbet, Shuah Khan, Shuah Khan, Greg Kroah-Hartman,
	Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
	Simona Vetter, Jani Nikula, Joonas Lahtinen, Rodrigo Vivi,
	Tvrtko Ursulin, Alex Deucher, Christian König, David Airlie,
	Gerd Hoffmann, Dmitry Osipenko, Gurchetan Singh, Chia-I Wu,
	Matthew Brost, Thomas Hellström, Lyude Paul,
	Danilo Krummrich, Patrik Jakobsson, Zack Rusin,
	Broadcom internal kernel review list, Louis Chauvet,
	Haneen Mohammed, Melissa Wen, Sean Paul, Jocelyn Falempe,
	Ruben Wauters, Dave Stevenson, Maíra Canal,
	Raspberry Pi Kernel Maintenance, Rob Clark, Dmitry Baryshkov,
	Abhinav Kumar, Jessica Zhang, Marijn Suijten, Xinliang Liu,
	Tian Tao, Xinwei Kong, Sumit Semwal, Yongqin Liu, John Stultz,
	Philipp Zabel, Frank Li, Sascha Hauer, Pengutronix Kernel Team,
	Fabio Estevam, Chun-Kuang Hu, Matthias Brugger,
	AngeloGioacchino Del Regno, Sandy Huang, Heiko Stübner,
	Andy Yan, Alain Volmat, Raphael Gallais-Pou, Yannick Fertre,
	Raphael Gallais-Pou, Philippe Cornu, Maxime Coquelin,
	Alexandre Torgue, Oded Gabbay, Maciej Falkowski, Karol Wachowski,
	Rob Herring (Arm), Tomeu Vizoso, Liviu Dudau, Andrzej Hajda,
	Neil Armstrong, Robert Foss, Laurent Pinchart, Jonas Karlman,
	Jernej Skrabec, Liu Ying, Laurentiu Palcu, Lucas Stach,
	Paul Kocialkowski, Jianmin Lv, Qianhai Wu, Huacai Chen,
	Mingcong Bai, Xi Ruoyao, Icenowy Zheng, Laurent Pinchart,
	Tomi Valkeinen, Kieran Bingham, Geert Uytterhoeven, Magnus Damm,
	Javier Martinez Canillas, Huang Rui, Matthew Auld, Jani Nikula,
	Luca Coelho, Russell King, Christian Gmeiner
  Cc: linux-arch, linux-kernel, linux-modules, linux-doc,
	linux-kselftest, dri-devel, intel-gfx, amd-gfx, virtualization,
	intel-xe, nouveau, spice-devel, linux-arm-msm, freedreno, imx,
	linux-arm-kernel, linux-mediatek, linux-rockchip, linux-stm32,
	linux-renesas-soc, etnaviv, Jim Cromie

ARRAY_SIZE works here, since array decl is complete.

no functional change

Reviewed-by: Louis Chauvet <louis.chauvet@bootlin.com>
Signed-off-by: Jim Cromie <jim.cromie@gmail.com>
---
 include/linux/dynamic_debug.h | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/include/linux/dynamic_debug.h b/include/linux/dynamic_debug.h
index 441305277914..92627a03b4d1 100644
--- a/include/linux/dynamic_debug.h
+++ b/include/linux/dynamic_debug.h
@@ -132,11 +132,9 @@ struct ddebug_class_param {
 		.mod_name = KBUILD_MODNAME,				\
 		.base = _base,						\
 		.map_type = _maptype,					\
-		.length = NUM_TYPE_ARGS(char*, __VA_ARGS__),		\
+		.length = ARRAY_SIZE(_var##_classnames),		\
 		.class_names = _var##_classnames,			\
 	}
-#define NUM_TYPE_ARGS(eltype, ...)				\
-	(sizeof((eltype[]) {__VA_ARGS__}) / sizeof(eltype))
 
 extern __printf(2, 3)
 void __dynamic_pr_debug(struct _ddebug *descriptor, const char *fmt, ...);

-- 
2.53.0


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH v14 13/92] dyndbg: tweak pr_fmt to avoid expansion conflicts
  2026-04-23 20:53 [PATCH v14 00/92] dyndbg: enable 0-off-cost for all of __drm_debug Jim Cromie
                   ` (11 preceding siblings ...)
  2026-04-23 20:53 ` [PATCH v14 12/92] dyndbg: drop NUM_TYPE_ARRAY Jim Cromie
@ 2026-04-23 20:53 ` Jim Cromie
  2026-04-23 20:53 ` [PATCH v14 14/92] dyndbg: reduce verbose/debug clutter Jim Cromie
                   ` (5 subsequent siblings)
  18 siblings, 0 replies; 20+ messages in thread
From: Jim Cromie @ 2026-04-23 20:53 UTC (permalink / raw)
  To: Arnd Bergmann, Jason Baron, Luis Chamberlain, Petr Pavlu,
	Daniel Gomez, Sami Tolvanen, Aaron Tomlin, Andrew Morton,
	Jonathan Corbet, Shuah Khan, Shuah Khan, Greg Kroah-Hartman,
	Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
	Simona Vetter, Jani Nikula, Joonas Lahtinen, Rodrigo Vivi,
	Tvrtko Ursulin, Alex Deucher, Christian König, David Airlie,
	Gerd Hoffmann, Dmitry Osipenko, Gurchetan Singh, Chia-I Wu,
	Matthew Brost, Thomas Hellström, Lyude Paul,
	Danilo Krummrich, Patrik Jakobsson, Zack Rusin,
	Broadcom internal kernel review list, Louis Chauvet,
	Haneen Mohammed, Melissa Wen, Sean Paul, Jocelyn Falempe,
	Ruben Wauters, Dave Stevenson, Maíra Canal,
	Raspberry Pi Kernel Maintenance, Rob Clark, Dmitry Baryshkov,
	Abhinav Kumar, Jessica Zhang, Marijn Suijten, Xinliang Liu,
	Tian Tao, Xinwei Kong, Sumit Semwal, Yongqin Liu, John Stultz,
	Philipp Zabel, Frank Li, Sascha Hauer, Pengutronix Kernel Team,
	Fabio Estevam, Chun-Kuang Hu, Matthias Brugger,
	AngeloGioacchino Del Regno, Sandy Huang, Heiko Stübner,
	Andy Yan, Alain Volmat, Raphael Gallais-Pou, Yannick Fertre,
	Raphael Gallais-Pou, Philippe Cornu, Maxime Coquelin,
	Alexandre Torgue, Oded Gabbay, Maciej Falkowski, Karol Wachowski,
	Rob Herring (Arm), Tomeu Vizoso, Liviu Dudau, Andrzej Hajda,
	Neil Armstrong, Robert Foss, Laurent Pinchart, Jonas Karlman,
	Jernej Skrabec, Liu Ying, Laurentiu Palcu, Lucas Stach,
	Paul Kocialkowski, Jianmin Lv, Qianhai Wu, Huacai Chen,
	Mingcong Bai, Xi Ruoyao, Icenowy Zheng, Laurent Pinchart,
	Tomi Valkeinen, Kieran Bingham, Geert Uytterhoeven, Magnus Damm,
	Javier Martinez Canillas, Huang Rui, Matthew Auld, Jani Nikula,
	Luca Coelho, Russell King, Christian Gmeiner
  Cc: linux-arch, linux-kernel, linux-modules, linux-doc,
	linux-kselftest, dri-devel, intel-gfx, amd-gfx, virtualization,
	intel-xe, nouveau, spice-devel, linux-arm-msm, freedreno, imx,
	linux-arm-kernel, linux-mediatek, linux-rockchip, linux-stm32,
	linux-renesas-soc, etnaviv, Jim Cromie

Disambiguate pr_fmt(fmt) arg, by changing it to _FMT_, to avoid naming
confusion with many later macros also using that argname.

no functional change

Reviewed-by: Louis Chauvet <louis.chauvet@bootlin.com>
Signed-off-by: Jim Cromie <jim.cromie@gmail.com>
---
 lib/dynamic_debug.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c
index ffa1cf7c2c72..9575b92a8deb 100644
--- a/lib/dynamic_debug.c
+++ b/lib/dynamic_debug.c
@@ -11,7 +11,7 @@
  * Copyright (C) 2013 Du, Changbin <changbin.du@gmail.com>
  */
 
-#define pr_fmt(fmt) "dyndbg: " fmt
+#define pr_fmt(_FMT_) "dyndbg: " _FMT_
 
 #include <linux/kernel.h>
 #include <linux/module.h>

-- 
2.53.0


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH v14 14/92] dyndbg: reduce verbose/debug clutter
  2026-04-23 20:53 [PATCH v14 00/92] dyndbg: enable 0-off-cost for all of __drm_debug Jim Cromie
                   ` (12 preceding siblings ...)
  2026-04-23 20:53 ` [PATCH v14 13/92] dyndbg: tweak pr_fmt to avoid expansion conflicts Jim Cromie
@ 2026-04-23 20:53 ` Jim Cromie
  2026-04-23 20:53 ` [PATCH v14 15/92] dyndbg: refactor param_set_dyndbg_classes and below Jim Cromie
                   ` (4 subsequent siblings)
  18 siblings, 0 replies; 20+ messages in thread
From: Jim Cromie @ 2026-04-23 20:53 UTC (permalink / raw)
  To: Arnd Bergmann, Jason Baron, Luis Chamberlain, Petr Pavlu,
	Daniel Gomez, Sami Tolvanen, Aaron Tomlin, Andrew Morton,
	Jonathan Corbet, Shuah Khan, Shuah Khan, Greg Kroah-Hartman,
	Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
	Simona Vetter, Jani Nikula, Joonas Lahtinen, Rodrigo Vivi,
	Tvrtko Ursulin, Alex Deucher, Christian König, David Airlie,
	Gerd Hoffmann, Dmitry Osipenko, Gurchetan Singh, Chia-I Wu,
	Matthew Brost, Thomas Hellström, Lyude Paul,
	Danilo Krummrich, Patrik Jakobsson, Zack Rusin,
	Broadcom internal kernel review list, Louis Chauvet,
	Haneen Mohammed, Melissa Wen, Sean Paul, Jocelyn Falempe,
	Ruben Wauters, Dave Stevenson, Maíra Canal,
	Raspberry Pi Kernel Maintenance, Rob Clark, Dmitry Baryshkov,
	Abhinav Kumar, Jessica Zhang, Marijn Suijten, Xinliang Liu,
	Tian Tao, Xinwei Kong, Sumit Semwal, Yongqin Liu, John Stultz,
	Philipp Zabel, Frank Li, Sascha Hauer, Pengutronix Kernel Team,
	Fabio Estevam, Chun-Kuang Hu, Matthias Brugger,
	AngeloGioacchino Del Regno, Sandy Huang, Heiko Stübner,
	Andy Yan, Alain Volmat, Raphael Gallais-Pou, Yannick Fertre,
	Raphael Gallais-Pou, Philippe Cornu, Maxime Coquelin,
	Alexandre Torgue, Oded Gabbay, Maciej Falkowski, Karol Wachowski,
	Rob Herring (Arm), Tomeu Vizoso, Liviu Dudau, Andrzej Hajda,
	Neil Armstrong, Robert Foss, Laurent Pinchart, Jonas Karlman,
	Jernej Skrabec, Liu Ying, Laurentiu Palcu, Lucas Stach,
	Paul Kocialkowski, Jianmin Lv, Qianhai Wu, Huacai Chen,
	Mingcong Bai, Xi Ruoyao, Icenowy Zheng, Laurent Pinchart,
	Tomi Valkeinen, Kieran Bingham, Geert Uytterhoeven, Magnus Damm,
	Javier Martinez Canillas, Huang Rui, Matthew Auld, Jani Nikula,
	Luca Coelho, Russell King, Christian Gmeiner
  Cc: linux-arch, linux-kernel, linux-modules, linux-doc,
	linux-kselftest, dri-devel, intel-gfx, amd-gfx, virtualization,
	intel-xe, nouveau, spice-devel, linux-arm-msm, freedreno, imx,
	linux-arm-kernel, linux-mediatek, linux-rockchip, linux-stm32,
	linux-renesas-soc, etnaviv, Jim Cromie

currently, for verbose=3, these are logged (blank lines for clarity):

 dyndbg: query 0: "class DRM_UT_CORE +p" mod:*
 dyndbg: split into words: "class" "DRM_UT_CORE" "+p"

 dyndbg: op='+'
 dyndbg: flags=0x1
 dyndbg: *flagsp=0x1 *maskp=0xffffffff

 dyndbg: parsed: func="" file="" module="" format="" lineno=0-0 class=...
 dyndbg: no matches for query
 dyndbg: no-match: func="" file="" module="" format="" lineno=0-0 class=...
 dyndbg: processed 1 queries, with 0 matches, 0 errs

That is excessive, so this patch:
 - shrinks 3 lines of 2nd stanza to single line
 - drops 1st 2 lines of 3rd stanza
   3rd line is like 1st, with result, not procedure.
   2nd line is just status, retold in 4th, with more info.

New output:

 dyndbg: query 0: "class DRM_UT_CORE +p" mod:*
 dyndbg: split into words: "class" "DRM_UT_CORE" "+p"
 dyndbg: op='+' flags=0x1 *flagsp=0x1 *maskp=0xffffffff
 dyndbg: no-match: func="" file="" module="" format="" lineno=0-0 class=...
 dyndbg: processed 1 queries, with 0 matches, 0 errs

Also reduce verbose=3 messages in ddebug_add_module

When modprobing a module, dyndbg currently logs/says "add-module", and
then "skipping" if the module has no prdbgs.  Instead just check 1st
and return quietly.

no functional change

Reviewed-by: Louis Chauvet <louis.chauvet@bootlin.com>
Signed-off-by: Jim Cromie <jim.cromie@gmail.com>
---
 lib/dynamic_debug.c | 21 ++++++---------------
 1 file changed, 6 insertions(+), 15 deletions(-)

diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c
index 9575b92a8deb..3ae9ecabdad1 100644
--- a/lib/dynamic_debug.c
+++ b/lib/dynamic_debug.c
@@ -276,9 +276,6 @@ static int ddebug_change(const struct ddebug_query *query,
 	}
 	mutex_unlock(&ddebug_lock);
 
-	if (!nfound && verbose)
-		pr_info("no matches for query\n");
-
 	return nfound;
 }
 
@@ -511,7 +508,6 @@ static int ddebug_parse_flags(const char *str, struct flag_settings *modifiers)
 		pr_err("bad flag-op %c, at start of %s\n", *str, str);
 		return -EINVAL;
 	}
-	v3pr_info("op='%c'\n", op);
 
 	for (; *str ; ++str) {
 		for (i = ARRAY_SIZE(opt_array) - 1; i >= 0; i--) {
@@ -525,7 +521,6 @@ static int ddebug_parse_flags(const char *str, struct flag_settings *modifiers)
 			return -EINVAL;
 		}
 	}
-	v3pr_info("flags=0x%x\n", modifiers->flags);
 
 	/* calculate final flags, mask based upon op */
 	switch (op) {
@@ -541,7 +536,7 @@ static int ddebug_parse_flags(const char *str, struct flag_settings *modifiers)
 		modifiers->flags = 0;
 		break;
 	}
-	v3pr_info("*flagsp=0x%x *maskp=0x%x\n", modifiers->flags, modifiers->mask);
+	v3pr_info("op='%c' flags=0x%x maskp=0x%x\n", op, modifiers->flags, modifiers->mask);
 
 	return 0;
 }
@@ -551,7 +546,7 @@ static int ddebug_exec_query(char *query_string, const char *modname)
 	struct flag_settings modifiers = {};
 	struct ddebug_query query = {};
 #define MAXWORDS 9
-	int nwords, nfound;
+	int nwords;
 	char *words[MAXWORDS];
 
 	nwords = ddebug_tokenize(query_string, words, MAXWORDS);
@@ -569,10 +564,7 @@ static int ddebug_exec_query(char *query_string, const char *modname)
 		return -EINVAL;
 	}
 	/* actually go and implement the change */
-	nfound = ddebug_change(&query, &modifiers);
-	vpr_info_dq(&query, nfound ? "applied" : "no-match");
-
-	return nfound;
+	return ddebug_change(&query, &modifiers);
 }
 
 /* handle multiple queries in query string, continue on error, return
@@ -1246,11 +1238,10 @@ static int ddebug_add_module(struct _ddebug_info *di, const char *modname)
 {
 	struct ddebug_table *dt;
 
-	v3pr_info("add-module: %s.%d sites\n", modname, di->num_descs);
-	if (!di->num_descs) {
-		v3pr_info(" skip %s\n", modname);
+	if (!di->num_descs)
 		return 0;
-	}
+
+	v3pr_info("add-module: %s %d sites\n", modname, di->num_descs);
 
 	dt = kzalloc_obj(*dt);
 	if (dt == NULL) {

-- 
2.53.0


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH v14 15/92] dyndbg: refactor param_set_dyndbg_classes and below
  2026-04-23 20:53 [PATCH v14 00/92] dyndbg: enable 0-off-cost for all of __drm_debug Jim Cromie
                   ` (13 preceding siblings ...)
  2026-04-23 20:53 ` [PATCH v14 14/92] dyndbg: reduce verbose/debug clutter Jim Cromie
@ 2026-04-23 20:53 ` Jim Cromie
  2026-04-23 20:53 ` [PATCH v14 16/92] dyndbg: tighten fn-sig of ddebug_apply_class_bitmap Jim Cromie
                   ` (3 subsequent siblings)
  18 siblings, 0 replies; 20+ messages in thread
From: Jim Cromie @ 2026-04-23 20:53 UTC (permalink / raw)
  To: Arnd Bergmann, Jason Baron, Luis Chamberlain, Petr Pavlu,
	Daniel Gomez, Sami Tolvanen, Aaron Tomlin, Andrew Morton,
	Jonathan Corbet, Shuah Khan, Shuah Khan, Greg Kroah-Hartman,
	Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
	Simona Vetter, Jani Nikula, Joonas Lahtinen, Rodrigo Vivi,
	Tvrtko Ursulin, Alex Deucher, Christian König, David Airlie,
	Gerd Hoffmann, Dmitry Osipenko, Gurchetan Singh, Chia-I Wu,
	Matthew Brost, Thomas Hellström, Lyude Paul,
	Danilo Krummrich, Patrik Jakobsson, Zack Rusin,
	Broadcom internal kernel review list, Louis Chauvet,
	Haneen Mohammed, Melissa Wen, Sean Paul, Jocelyn Falempe,
	Ruben Wauters, Dave Stevenson, Maíra Canal,
	Raspberry Pi Kernel Maintenance, Rob Clark, Dmitry Baryshkov,
	Abhinav Kumar, Jessica Zhang, Marijn Suijten, Xinliang Liu,
	Tian Tao, Xinwei Kong, Sumit Semwal, Yongqin Liu, John Stultz,
	Philipp Zabel, Frank Li, Sascha Hauer, Pengutronix Kernel Team,
	Fabio Estevam, Chun-Kuang Hu, Matthias Brugger,
	AngeloGioacchino Del Regno, Sandy Huang, Heiko Stübner,
	Andy Yan, Alain Volmat, Raphael Gallais-Pou, Yannick Fertre,
	Raphael Gallais-Pou, Philippe Cornu, Maxime Coquelin,
	Alexandre Torgue, Oded Gabbay, Maciej Falkowski, Karol Wachowski,
	Rob Herring (Arm), Tomeu Vizoso, Liviu Dudau, Andrzej Hajda,
	Neil Armstrong, Robert Foss, Laurent Pinchart, Jonas Karlman,
	Jernej Skrabec, Liu Ying, Laurentiu Palcu, Lucas Stach,
	Paul Kocialkowski, Jianmin Lv, Qianhai Wu, Huacai Chen,
	Mingcong Bai, Xi Ruoyao, Icenowy Zheng, Laurent Pinchart,
	Tomi Valkeinen, Kieran Bingham, Geert Uytterhoeven, Magnus Damm,
	Javier Martinez Canillas, Huang Rui, Matthew Auld, Jani Nikula,
	Luca Coelho, Russell King, Christian Gmeiner
  Cc: linux-arch, linux-kernel, linux-modules, linux-doc,
	linux-kselftest, dri-devel, intel-gfx, amd-gfx, virtualization,
	intel-xe, nouveau, spice-devel, linux-arm-msm, freedreno, imx,
	linux-arm-kernel, linux-mediatek, linux-rockchip, linux-stm32,
	linux-renesas-soc, etnaviv, Jim Cromie

Refactor callchain below param_set_dyndbg_classes(1) to allow mod-name
specific settings.  Split (1) into upper/lower fns, adding modname
param to lower, and passing NULL in from upper.  Below that, add the
same param to ddebug_apply_class_bitmap(), and pass it thru to
_ddebug_queries(), replacing NULL with the param.

This allows the callchain to update the classmap in just one module,
vs just all as currently done.  While the sysfs param is unlikely to
ever update just one module, the callchain will be used for modprobe
handling, which should update only that just-probed module.

In ddebug_apply_class_bitmap(), also check for actual changes to the
bits before announcing them, to declutter logs.

No functional change.

Reviewed-by: Louis Chauvet <louis.chauvet@bootlin.com>
Signed-off-by: Jim Cromie <jim.cromie@gmail.com>
---
 lib/dynamic_debug.c | 65 ++++++++++++++++++++++++++++++++---------------------
 1 file changed, 40 insertions(+), 25 deletions(-)

diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c
index 3ae9ecabdad1..4313c8803007 100644
--- a/lib/dynamic_debug.c
+++ b/lib/dynamic_debug.c
@@ -605,9 +605,10 @@ static int ddebug_exec_queries(char *query, const char *modname)
 	return nfound;
 }
 
-/* apply a new bitmap to the sys-knob's current bit-state */
+/* apply a new class-param setting */
 static int ddebug_apply_class_bitmap(const struct ddebug_class_param *dcp,
-				     unsigned long *new_bits, unsigned long *old_bits)
+				     unsigned long *new_bits, unsigned long *old_bits,
+				     const char *query_modname)
 {
 #define QUERY_SIZE 128
 	char query[QUERY_SIZE];
@@ -615,7 +616,9 @@ static int ddebug_apply_class_bitmap(const struct ddebug_class_param *dcp,
 	int matches = 0;
 	int bi, ct;
 
-	v2pr_info("apply: 0x%lx to: 0x%lx\n", *new_bits, *old_bits);
+	if (*new_bits != *old_bits)
+		v2pr_info("apply bitmap: 0x%lx to: 0x%lx for %s\n", *new_bits,
+			  *old_bits, query_modname ?: "'*'");
 
 	for (bi = 0; bi < map->length; bi++) {
 		if (test_bit(bi, new_bits) == test_bit(bi, old_bits))
@@ -624,12 +627,16 @@ static int ddebug_apply_class_bitmap(const struct ddebug_class_param *dcp,
 		snprintf(query, QUERY_SIZE, "class %s %c%s", map->class_names[bi],
 			 test_bit(bi, new_bits) ? '+' : '-', dcp->flags);
 
-		ct = ddebug_exec_queries(query, NULL);
+		ct = ddebug_exec_queries(query, query_modname);
 		matches += ct;
 
 		v2pr_info("bit_%d: %d matches on class: %s -> 0x%lx\n", bi,
 			  ct, map->class_names[bi], *new_bits);
 	}
+	if (*new_bits != *old_bits)
+		v2pr_info("applied bitmap: 0x%lx to: 0x%lx for %s\n", *new_bits,
+			  *old_bits, query_modname ?: "'*'");
+
 	return matches;
 }
 
@@ -684,7 +691,7 @@ static int param_set_dyndbg_classnames(const char *instr, const struct kernel_pa
 				continue;
 			}
 			curr_bits ^= BIT(cls_id);
-			totct += ddebug_apply_class_bitmap(dcp, &curr_bits, dcp->bits);
+			totct += ddebug_apply_class_bitmap(dcp, &curr_bits, dcp->bits, NULL);
 			*dcp->bits = curr_bits;
 			v2pr_info("%s: changed bit %d:%s\n", KP_NAME(kp), cls_id,
 				  map->class_names[cls_id]);
@@ -694,7 +701,7 @@ static int param_set_dyndbg_classnames(const char *instr, const struct kernel_pa
 			old_bits = CLASSMAP_BITMASK(*dcp->lvl);
 			curr_bits = CLASSMAP_BITMASK(cls_id + (wanted ? 1 : 0 ));
 
-			totct += ddebug_apply_class_bitmap(dcp, &curr_bits, &old_bits);
+			totct += ddebug_apply_class_bitmap(dcp, &curr_bits, &old_bits, NULL);
 			*dcp->lvl = (cls_id + (wanted ? 1 : 0));
 			v2pr_info("%s: changed bit-%d: \"%s\" %lx->%lx\n", KP_NAME(kp), cls_id,
 				  map->class_names[cls_id], old_bits, curr_bits);
@@ -708,18 +715,9 @@ static int param_set_dyndbg_classnames(const char *instr, const struct kernel_pa
 	return 0;
 }
 
-/**
- * param_set_dyndbg_classes - class FOO >control
- * @instr: string echo>d to sysfs, input depends on map_type
- * @kp:    kp->arg has state: bits/lvl, map, map_type
- *
- * Enable/disable prdbgs by their class, as given in the arguments to
- * DECLARE_DYNDBG_CLASSMAP.  For LEVEL map-types, enforce relative
- * levels by bitpos.
- *
- * Returns: 0 or <0 if error.
- */
-int param_set_dyndbg_classes(const char *instr, const struct kernel_param *kp)
+static int param_set_dyndbg_module_classes(const char *instr,
+					   const struct kernel_param *kp,
+					   const char *mod_name)
 {
 	const struct ddebug_class_param *dcp = kp->arg;
 	const struct ddebug_class_map *map = dcp->map;
@@ -756,8 +754,8 @@ int param_set_dyndbg_classes(const char *instr, const struct kernel_param *kp)
 				KP_NAME(kp), inrep, CLASSMAP_BITMASK(map->length));
 			inrep &= CLASSMAP_BITMASK(map->length);
 		}
-		v2pr_info("bits:%lx > %s\n", inrep, KP_NAME(kp));
-		totct += ddebug_apply_class_bitmap(dcp, &inrep, dcp->bits);
+		v2pr_info("bits:0x%lx > %s.%s\n", inrep, mod_name ?: "*", KP_NAME(kp));
+		totct += ddebug_apply_class_bitmap(dcp, &inrep, dcp->bits, mod_name);
 		*dcp->bits = inrep;
 		break;
 	case DD_CLASS_TYPE_LEVEL_NUM:
@@ -770,7 +768,7 @@ int param_set_dyndbg_classes(const char *instr, const struct kernel_param *kp)
 		old_bits = CLASSMAP_BITMASK(*dcp->lvl);
 		new_bits = CLASSMAP_BITMASK(inrep);
 		v2pr_info("lvl:%ld bits:0x%lx > %s\n", inrep, new_bits, KP_NAME(kp));
-		totct += ddebug_apply_class_bitmap(dcp, &new_bits, &old_bits);
+		totct += ddebug_apply_class_bitmap(dcp, &new_bits, &old_bits, mod_name);
 		*dcp->lvl = inrep;
 		break;
 	default:
@@ -779,16 +777,33 @@ int param_set_dyndbg_classes(const char *instr, const struct kernel_param *kp)
 	vpr_info("%s: total matches: %d\n", KP_NAME(kp), totct);
 	return 0;
 }
+
+/**
+ * param_set_dyndbg_classes - classmap kparam setter
+ * @instr: string echo>d to sysfs, input depends on map_type
+ * @kp:    kp->arg has state: bits/lvl, map, map_type
+ *
+ * enable/disable all class'd pr_debugs in the classmap. For LEVEL
+ * map-types, enforce * relative levels by bitpos.
+ *
+ * Returns: 0 or <0 if error.
+ */
+int param_set_dyndbg_classes(const char *instr, const struct kernel_param *kp)
+{
+	return param_set_dyndbg_module_classes(instr, kp, NULL);
+}
 EXPORT_SYMBOL(param_set_dyndbg_classes);
 
 /**
- * param_get_dyndbg_classes - classes reader
+ * param_get_dyndbg_classes - classmap kparam getter
  * @buffer: string description of controlled bits -> classes
  * @kp:     kp->arg has state: bits, map
  *
- * Reads last written state, underlying prdbg state may have been
- * altered by direct >control.  Displays 0x for DISJOINT, 0-N for
- * LEVEL Returns: #chars written or <0 on error
+ * Reads last written state, underlying pr_debug states may have been
+ * altered by direct >control.  Displays 0x for DISJOINT classmap
+ * types, 0-N for LEVEL types.
+ *
+ * Returns: ct of chars written or <0 on error
  */
 int param_get_dyndbg_classes(char *buffer, const struct kernel_param *kp)
 {

-- 
2.53.0


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH v14 16/92] dyndbg: tighten fn-sig of ddebug_apply_class_bitmap
  2026-04-23 20:53 [PATCH v14 00/92] dyndbg: enable 0-off-cost for all of __drm_debug Jim Cromie
                   ` (14 preceding siblings ...)
  2026-04-23 20:53 ` [PATCH v14 15/92] dyndbg: refactor param_set_dyndbg_classes and below Jim Cromie
@ 2026-04-23 20:53 ` Jim Cromie
  2026-04-23 20:53 ` [PATCH v14 17/92] dyndbg: replace classmap list with a vector Jim Cromie
                   ` (2 subsequent siblings)
  18 siblings, 0 replies; 20+ messages in thread
From: Jim Cromie @ 2026-04-23 20:53 UTC (permalink / raw)
  To: Arnd Bergmann, Jason Baron, Luis Chamberlain, Petr Pavlu,
	Daniel Gomez, Sami Tolvanen, Aaron Tomlin, Andrew Morton,
	Jonathan Corbet, Shuah Khan, Shuah Khan, Greg Kroah-Hartman,
	Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
	Simona Vetter, Jani Nikula, Joonas Lahtinen, Rodrigo Vivi,
	Tvrtko Ursulin, Alex Deucher, Christian König, David Airlie,
	Gerd Hoffmann, Dmitry Osipenko, Gurchetan Singh, Chia-I Wu,
	Matthew Brost, Thomas Hellström, Lyude Paul,
	Danilo Krummrich, Patrik Jakobsson, Zack Rusin,
	Broadcom internal kernel review list, Louis Chauvet,
	Haneen Mohammed, Melissa Wen, Sean Paul, Jocelyn Falempe,
	Ruben Wauters, Dave Stevenson, Maíra Canal,
	Raspberry Pi Kernel Maintenance, Rob Clark, Dmitry Baryshkov,
	Abhinav Kumar, Jessica Zhang, Marijn Suijten, Xinliang Liu,
	Tian Tao, Xinwei Kong, Sumit Semwal, Yongqin Liu, John Stultz,
	Philipp Zabel, Frank Li, Sascha Hauer, Pengutronix Kernel Team,
	Fabio Estevam, Chun-Kuang Hu, Matthias Brugger,
	AngeloGioacchino Del Regno, Sandy Huang, Heiko Stübner,
	Andy Yan, Alain Volmat, Raphael Gallais-Pou, Yannick Fertre,
	Raphael Gallais-Pou, Philippe Cornu, Maxime Coquelin,
	Alexandre Torgue, Oded Gabbay, Maciej Falkowski, Karol Wachowski,
	Rob Herring (Arm), Tomeu Vizoso, Liviu Dudau, Andrzej Hajda,
	Neil Armstrong, Robert Foss, Laurent Pinchart, Jonas Karlman,
	Jernej Skrabec, Liu Ying, Laurentiu Palcu, Lucas Stach,
	Paul Kocialkowski, Jianmin Lv, Qianhai Wu, Huacai Chen,
	Mingcong Bai, Xi Ruoyao, Icenowy Zheng, Laurent Pinchart,
	Tomi Valkeinen, Kieran Bingham, Geert Uytterhoeven, Magnus Damm,
	Javier Martinez Canillas, Huang Rui, Matthew Auld, Jani Nikula,
	Luca Coelho, Russell King, Christian Gmeiner
  Cc: linux-arch, linux-kernel, linux-modules, linux-doc,
	linux-kselftest, dri-devel, intel-gfx, amd-gfx, virtualization,
	intel-xe, nouveau, spice-devel, linux-arm-msm, freedreno, imx,
	linux-arm-kernel, linux-mediatek, linux-rockchip, linux-stm32,
	linux-renesas-soc, etnaviv, Jim Cromie

old_bits arg is currently a pointer to the input bits, but this could
allow inadvertent changes to the input by the fn.  Disallow this.
And constify new_bits while here.

Reviewed-by: Louis Chauvet <louis.chauvet@bootlin.com>
Signed-off-by: Jim Cromie <jim.cromie@gmail.com>
---
 lib/dynamic_debug.c | 21 +++++++++++----------
 1 file changed, 11 insertions(+), 10 deletions(-)

diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c
index 4313c8803007..a18f4bc63473 100644
--- a/lib/dynamic_debug.c
+++ b/lib/dynamic_debug.c
@@ -607,7 +607,8 @@ static int ddebug_exec_queries(char *query, const char *modname)
 
 /* apply a new class-param setting */
 static int ddebug_apply_class_bitmap(const struct ddebug_class_param *dcp,
-				     unsigned long *new_bits, unsigned long *old_bits,
+				     const unsigned long *new_bits,
+				     const unsigned long old_bits,
 				     const char *query_modname)
 {
 #define QUERY_SIZE 128
@@ -616,12 +617,12 @@ static int ddebug_apply_class_bitmap(const struct ddebug_class_param *dcp,
 	int matches = 0;
 	int bi, ct;
 
-	if (*new_bits != *old_bits)
+	if (*new_bits != old_bits)
 		v2pr_info("apply bitmap: 0x%lx to: 0x%lx for %s\n", *new_bits,
-			  *old_bits, query_modname ?: "'*'");
+			  old_bits, query_modname ?: "'*'");
 
 	for (bi = 0; bi < map->length; bi++) {
-		if (test_bit(bi, new_bits) == test_bit(bi, old_bits))
+		if (test_bit(bi, new_bits) == test_bit(bi, &old_bits))
 			continue;
 
 		snprintf(query, QUERY_SIZE, "class %s %c%s", map->class_names[bi],
@@ -633,9 +634,9 @@ static int ddebug_apply_class_bitmap(const struct ddebug_class_param *dcp,
 		v2pr_info("bit_%d: %d matches on class: %s -> 0x%lx\n", bi,
 			  ct, map->class_names[bi], *new_bits);
 	}
-	if (*new_bits != *old_bits)
+	if (*new_bits != old_bits)
 		v2pr_info("applied bitmap: 0x%lx to: 0x%lx for %s\n", *new_bits,
-			  *old_bits, query_modname ?: "'*'");
+			  old_bits, query_modname ?: "'*'");
 
 	return matches;
 }
@@ -691,7 +692,7 @@ static int param_set_dyndbg_classnames(const char *instr, const struct kernel_pa
 				continue;
 			}
 			curr_bits ^= BIT(cls_id);
-			totct += ddebug_apply_class_bitmap(dcp, &curr_bits, dcp->bits, NULL);
+			totct += ddebug_apply_class_bitmap(dcp, &curr_bits, *dcp->bits, NULL);
 			*dcp->bits = curr_bits;
 			v2pr_info("%s: changed bit %d:%s\n", KP_NAME(kp), cls_id,
 				  map->class_names[cls_id]);
@@ -701,7 +702,7 @@ static int param_set_dyndbg_classnames(const char *instr, const struct kernel_pa
 			old_bits = CLASSMAP_BITMASK(*dcp->lvl);
 			curr_bits = CLASSMAP_BITMASK(cls_id + (wanted ? 1 : 0 ));
 
-			totct += ddebug_apply_class_bitmap(dcp, &curr_bits, &old_bits, NULL);
+			totct += ddebug_apply_class_bitmap(dcp, &curr_bits, old_bits, NULL);
 			*dcp->lvl = (cls_id + (wanted ? 1 : 0));
 			v2pr_info("%s: changed bit-%d: \"%s\" %lx->%lx\n", KP_NAME(kp), cls_id,
 				  map->class_names[cls_id], old_bits, curr_bits);
@@ -755,7 +756,7 @@ static int param_set_dyndbg_module_classes(const char *instr,
 			inrep &= CLASSMAP_BITMASK(map->length);
 		}
 		v2pr_info("bits:0x%lx > %s.%s\n", inrep, mod_name ?: "*", KP_NAME(kp));
-		totct += ddebug_apply_class_bitmap(dcp, &inrep, dcp->bits, mod_name);
+		totct += ddebug_apply_class_bitmap(dcp, &inrep, *dcp->bits, mod_name);
 		*dcp->bits = inrep;
 		break;
 	case DD_CLASS_TYPE_LEVEL_NUM:
@@ -768,7 +769,7 @@ static int param_set_dyndbg_module_classes(const char *instr,
 		old_bits = CLASSMAP_BITMASK(*dcp->lvl);
 		new_bits = CLASSMAP_BITMASK(inrep);
 		v2pr_info("lvl:%ld bits:0x%lx > %s\n", inrep, new_bits, KP_NAME(kp));
-		totct += ddebug_apply_class_bitmap(dcp, &new_bits, &old_bits, mod_name);
+		totct += ddebug_apply_class_bitmap(dcp, &new_bits, old_bits, mod_name);
 		*dcp->lvl = inrep;
 		break;
 	default:

-- 
2.53.0


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH v14 17/92] dyndbg: replace classmap list with a vector
  2026-04-23 20:53 [PATCH v14 00/92] dyndbg: enable 0-off-cost for all of __drm_debug Jim Cromie
                   ` (15 preceding siblings ...)
  2026-04-23 20:53 ` [PATCH v14 16/92] dyndbg: tighten fn-sig of ddebug_apply_class_bitmap Jim Cromie
@ 2026-04-23 20:53 ` Jim Cromie
  2026-04-23 20:53 ` [PATCH v14 18/92] dyndbg: macrofy a 2-index for-loop pattern Jim Cromie
  2026-04-23 20:54 ` [PATCH v14 19/92] dyndbg,module: make proper substructs in _ddebug_info Jim Cromie
  18 siblings, 0 replies; 20+ messages in thread
From: Jim Cromie @ 2026-04-23 20:53 UTC (permalink / raw)
  To: Arnd Bergmann, Jason Baron, Luis Chamberlain, Petr Pavlu,
	Daniel Gomez, Sami Tolvanen, Aaron Tomlin, Andrew Morton,
	Jonathan Corbet, Shuah Khan, Shuah Khan, Greg Kroah-Hartman,
	Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
	Simona Vetter, Jani Nikula, Joonas Lahtinen, Rodrigo Vivi,
	Tvrtko Ursulin, Alex Deucher, Christian König, David Airlie,
	Gerd Hoffmann, Dmitry Osipenko, Gurchetan Singh, Chia-I Wu,
	Matthew Brost, Thomas Hellström, Lyude Paul,
	Danilo Krummrich, Patrik Jakobsson, Zack Rusin,
	Broadcom internal kernel review list, Louis Chauvet,
	Haneen Mohammed, Melissa Wen, Sean Paul, Jocelyn Falempe,
	Ruben Wauters, Dave Stevenson, Maíra Canal,
	Raspberry Pi Kernel Maintenance, Rob Clark, Dmitry Baryshkov,
	Abhinav Kumar, Jessica Zhang, Marijn Suijten, Xinliang Liu,
	Tian Tao, Xinwei Kong, Sumit Semwal, Yongqin Liu, John Stultz,
	Philipp Zabel, Frank Li, Sascha Hauer, Pengutronix Kernel Team,
	Fabio Estevam, Chun-Kuang Hu, Matthias Brugger,
	AngeloGioacchino Del Regno, Sandy Huang, Heiko Stübner,
	Andy Yan, Alain Volmat, Raphael Gallais-Pou, Yannick Fertre,
	Raphael Gallais-Pou, Philippe Cornu, Maxime Coquelin,
	Alexandre Torgue, Oded Gabbay, Maciej Falkowski, Karol Wachowski,
	Rob Herring (Arm), Tomeu Vizoso, Liviu Dudau, Andrzej Hajda,
	Neil Armstrong, Robert Foss, Laurent Pinchart, Jonas Karlman,
	Jernej Skrabec, Liu Ying, Laurentiu Palcu, Lucas Stach,
	Paul Kocialkowski, Jianmin Lv, Qianhai Wu, Huacai Chen,
	Mingcong Bai, Xi Ruoyao, Icenowy Zheng, Laurent Pinchart,
	Tomi Valkeinen, Kieran Bingham, Geert Uytterhoeven, Magnus Damm,
	Javier Martinez Canillas, Huang Rui, Matthew Auld, Jani Nikula,
	Luca Coelho, Russell King, Christian Gmeiner
  Cc: linux-arch, linux-kernel, linux-modules, linux-doc,
	linux-kselftest, dri-devel, intel-gfx, amd-gfx, virtualization,
	intel-xe, nouveau, spice-devel, linux-arm-msm, freedreno, imx,
	linux-arm-kernel, linux-mediatek, linux-rockchip, linux-stm32,
	linux-renesas-soc, etnaviv, Jim Cromie

Classmaps are stored in an elf section/array, but currently are
individually list-linked onto dyndbg's per-module ddebug_table for
operation. This is unnecessary.

Just like dyndbg's descriptors, classes are packed in compile order;
so even with many builtin modules employing multiple classmaps, each
modules' maps are packed contiguously, and can be treated as a
array-start-address & array-length.

So this drops the whole list building operation done in
ddebug_attach_module_classes(), and removes the list-head members.
The "select-by-modname" condition is reused to find the start,end of
the subrange.

NOTE: This "filter-by-modname" on classmaps should really be done in
ddebug_add_module(1); ie at least one step closer to ddebug_init(2),
which already splits up pr-debug descriptors into subranges by
modname, then calls (1) on each.  (2) knows nothing of classmaps
currently, and doesn't need to.  For now, just add comment.

Reviewed-by: Louis Chauvet <louis.chauvet@bootlin.com>
Signed-off-by: Jim Cromie <jim.cromie@gmail.com>
---
 include/linux/dynamic_debug.h |  1 -
 lib/dynamic_debug.c           | 62 ++++++++++++++++++++++---------------------
 2 files changed, 32 insertions(+), 31 deletions(-)

diff --git a/include/linux/dynamic_debug.h b/include/linux/dynamic_debug.h
index 92627a03b4d1..9fd36339db52 100644
--- a/include/linux/dynamic_debug.h
+++ b/include/linux/dynamic_debug.h
@@ -84,7 +84,6 @@ enum class_map_type {
 };
 
 struct ddebug_class_map {
-	struct list_head link;
 	struct module *mod;
 	const char *mod_name;	/* needed for builtins */
 	const char **class_names;
diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c
index a18f4bc63473..94a66c8537ab 100644
--- a/lib/dynamic_debug.c
+++ b/lib/dynamic_debug.c
@@ -45,10 +45,11 @@ extern struct ddebug_class_map __start___dyndbg_classes[];
 extern struct ddebug_class_map __stop___dyndbg_classes[];
 
 struct ddebug_table {
-	struct list_head link, maps;
+	struct list_head link;
 	const char *mod_name;
-	unsigned int num_ddebugs;
 	struct _ddebug *ddebugs;
+	struct ddebug_class_map *classes;
+	unsigned int num_ddebugs, num_classes;
 };
 
 struct ddebug_query {
@@ -149,12 +150,13 @@ static void vpr_info_dq(const struct ddebug_query *query, const char *msg)
 }
 
 static struct ddebug_class_map *ddebug_find_valid_class(struct ddebug_table const *dt,
-							  const char *class_string, int *class_id)
+							const char *class_string,
+							int *class_id)
 {
 	struct ddebug_class_map *map;
-	int idx;
+	int i, idx;
 
-	list_for_each_entry(map, &dt->maps, link) {
+	for (map = dt->classes, i = 0; i < dt->num_classes; i++, map++) {
 		idx = match_string(map->class_names, map->length, class_string);
 		if (idx >= 0) {
 			*class_id = idx + map->base;
@@ -165,7 +167,6 @@ static struct ddebug_class_map *ddebug_find_valid_class(struct ddebug_table cons
 	return NULL;
 }
 
-#define __outvar /* filled by callee */
 /*
  * Search the tables for _ddebug's which match the given `query' and
  * apply the `flags' and `mask' to them.  Returns number of matching
@@ -227,7 +228,7 @@ static int ddebug_change(const struct ddebug_query *query,
 	unsigned int nfound = 0;
 	struct flagsbuf fbuf, nbuf;
 	struct ddebug_class_map *map = NULL;
-	int __outvar valid_class;
+	int valid_class;
 
 	/* search for matching ddebugs */
 	mutex_lock(&ddebug_lock);
@@ -1134,9 +1135,10 @@ static void *ddebug_proc_next(struct seq_file *m, void *p, loff_t *pos)
 
 static const char *ddebug_class_name(struct ddebug_iter *iter, struct _ddebug *dp)
 {
-	struct ddebug_class_map *map;
+	struct ddebug_class_map *map = iter->table->classes;
+	int i, nc = iter->table->num_classes;
 
-	list_for_each_entry(map, &iter->table->maps, link)
+	for (i = 0; i < nc; i++, map++)
 		if (class_in_range(dp->class_id, map))
 			return map->class_names[dp->class_id - map->base];
 
@@ -1220,30 +1222,31 @@ static const struct proc_ops proc_fops = {
 	.proc_write = ddebug_proc_write
 };
 
-static void ddebug_attach_module_classes(struct ddebug_table *dt,
-					 struct ddebug_class_map *classes,
-					 int num_classes)
+static void ddebug_attach_module_classes(struct ddebug_table *dt, struct _ddebug_info *di)
 {
 	struct ddebug_class_map *cm;
-	int i, j, ct = 0;
+	int i, nc = 0;
 
-	for (cm = classes, i = 0; i < num_classes; i++, cm++) {
+	/*
+	 * Find this module's classmaps in a subrange/wholerange of
+	 * the builtin/modular classmap vector/section.  Save the start
+	 * and length of the subrange at its edges.
+	 */
+	for (cm = di->classes, i = 0; i < di->num_classes; i++, cm++) {
 
 		if (!strcmp(cm->mod_name, dt->mod_name)) {
-
-			v2pr_info("class[%d]: module:%s base:%d len:%d ty:%d\n", i,
-				  cm->mod_name, cm->base, cm->length, cm->map_type);
-
-			for (j = 0; j < cm->length; j++)
-				v3pr_info(" %d: %d %s\n", j + cm->base, j,
-					  cm->class_names[j]);
-
-			list_add(&cm->link, &dt->maps);
-			ct++;
+			if (!nc) {
+				v2pr_info("start subrange, class[%d]: module:%s base:%d len:%d ty:%d\n",
+					  i, cm->mod_name, cm->base, cm->length, cm->map_type);
+				dt->classes = cm;
+			}
+			nc++;
 		}
 	}
-	if (ct)
-		vpr_info("module:%s attached %d classes\n", dt->mod_name, ct);
+	if (nc) {
+		dt->num_classes = nc;
+		vpr_info("module:%s attached %d classes\n", dt->mod_name, nc);
+	}
 }
 
 /*
@@ -1275,10 +1278,9 @@ static int ddebug_add_module(struct _ddebug_info *di, const char *modname)
 	dt->num_ddebugs = di->num_descs;
 
 	INIT_LIST_HEAD(&dt->link);
-	INIT_LIST_HEAD(&dt->maps);
 
 	if (di->classes && di->num_classes)
-		ddebug_attach_module_classes(dt, di->classes, di->num_classes);
+		ddebug_attach_module_classes(dt, di);
 
 	mutex_lock(&ddebug_lock);
 	list_add_tail(&dt->link, &ddebug_tables);
@@ -1391,8 +1393,8 @@ static void ddebug_remove_all_tables(void)
 	mutex_lock(&ddebug_lock);
 	while (!list_empty(&ddebug_tables)) {
 		struct ddebug_table *dt = list_entry(ddebug_tables.next,
-						      struct ddebug_table,
-						      link);
+						     struct ddebug_table,
+						     link);
 		ddebug_table_free(dt);
 	}
 	mutex_unlock(&ddebug_lock);

-- 
2.53.0


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH v14 18/92] dyndbg: macrofy a 2-index for-loop pattern
  2026-04-23 20:53 [PATCH v14 00/92] dyndbg: enable 0-off-cost for all of __drm_debug Jim Cromie
                   ` (16 preceding siblings ...)
  2026-04-23 20:53 ` [PATCH v14 17/92] dyndbg: replace classmap list with a vector Jim Cromie
@ 2026-04-23 20:53 ` Jim Cromie
  2026-04-23 20:54 ` [PATCH v14 19/92] dyndbg,module: make proper substructs in _ddebug_info Jim Cromie
  18 siblings, 0 replies; 20+ messages in thread
From: Jim Cromie @ 2026-04-23 20:53 UTC (permalink / raw)
  To: Arnd Bergmann, Jason Baron, Luis Chamberlain, Petr Pavlu,
	Daniel Gomez, Sami Tolvanen, Aaron Tomlin, Andrew Morton,
	Jonathan Corbet, Shuah Khan, Shuah Khan, Greg Kroah-Hartman,
	Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
	Simona Vetter, Jani Nikula, Joonas Lahtinen, Rodrigo Vivi,
	Tvrtko Ursulin, Alex Deucher, Christian König, David Airlie,
	Gerd Hoffmann, Dmitry Osipenko, Gurchetan Singh, Chia-I Wu,
	Matthew Brost, Thomas Hellström, Lyude Paul,
	Danilo Krummrich, Patrik Jakobsson, Zack Rusin,
	Broadcom internal kernel review list, Louis Chauvet,
	Haneen Mohammed, Melissa Wen, Sean Paul, Jocelyn Falempe,
	Ruben Wauters, Dave Stevenson, Maíra Canal,
	Raspberry Pi Kernel Maintenance, Rob Clark, Dmitry Baryshkov,
	Abhinav Kumar, Jessica Zhang, Marijn Suijten, Xinliang Liu,
	Tian Tao, Xinwei Kong, Sumit Semwal, Yongqin Liu, John Stultz,
	Philipp Zabel, Frank Li, Sascha Hauer, Pengutronix Kernel Team,
	Fabio Estevam, Chun-Kuang Hu, Matthias Brugger,
	AngeloGioacchino Del Regno, Sandy Huang, Heiko Stübner,
	Andy Yan, Alain Volmat, Raphael Gallais-Pou, Yannick Fertre,
	Raphael Gallais-Pou, Philippe Cornu, Maxime Coquelin,
	Alexandre Torgue, Oded Gabbay, Maciej Falkowski, Karol Wachowski,
	Rob Herring (Arm), Tomeu Vizoso, Liviu Dudau, Andrzej Hajda,
	Neil Armstrong, Robert Foss, Laurent Pinchart, Jonas Karlman,
	Jernej Skrabec, Liu Ying, Laurentiu Palcu, Lucas Stach,
	Paul Kocialkowski, Jianmin Lv, Qianhai Wu, Huacai Chen,
	Mingcong Bai, Xi Ruoyao, Icenowy Zheng, Laurent Pinchart,
	Tomi Valkeinen, Kieran Bingham, Geert Uytterhoeven, Magnus Damm,
	Javier Martinez Canillas, Huang Rui, Matthew Auld, Jani Nikula,
	Luca Coelho, Russell King, Christian Gmeiner
  Cc: linux-arch, linux-kernel, linux-modules, linux-doc,
	linux-kselftest, dri-devel, intel-gfx, amd-gfx, virtualization,
	intel-xe, nouveau, spice-devel, linux-arm-msm, freedreno, imx,
	linux-arm-kernel, linux-mediatek, linux-rockchip, linux-stm32,
	linux-renesas-soc, etnaviv, Jim Cromie

dynamic-debug currently has 2 __sections (__dyndbg, __dyndb_classes),
struct _ddebug_info keeps track of them both, with 2 members each:
_vec and _vec#_len.

We need to loop over these sections, with index and record pointer,
making ref to both _vec and _vec_len.  This is already fiddly and
error-prone, and will get worse as we add a 3rd section.

Lets instead embed/abstract the fiddly-ness in the `for_subvec()`
macro, and avoid repeating it going forward.

This is a for-loop macro expander, so it syntactically expects to
precede either a single statement or a { block } of them, and the
usual typeof or do-while-0 tricks are unavailable to fix the
multiple-expansion warning.

The macro needs a lot from its caller: it needs 2 local vars, 1 of
which is a ref to a contained struct with named members.  To support
these requirements, add:

1. __ASSERT_IS_LVALUE(_X):
   ie: ((void)sizeof((void)0, &(x)))

2. __ASSERT_HAS_VEC_MEMBERS(_X, _Y):
   compile-time check that the _Y "vector" exists
   ie: _X->_Y and _X->num_##_Y are lvalues.

The for_subvec() macro then invokes these in the initialization of the
for-loop; they disappear at runtime.

Reviewed-by: Louis Chauvet <louis.chauvet@bootlin.com>
Signed-off-by: Jim Cromie <jim.cromie@gmail.com>
---
 lib/dynamic_debug.c | 27 ++++++++++++++++++++++++---
 1 file changed, 24 insertions(+), 3 deletions(-)

diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c
index 94a66c8537ab..8f614eba8ace 100644
--- a/lib/dynamic_debug.c
+++ b/lib/dynamic_debug.c
@@ -129,6 +129,28 @@ do {								\
 #define v3pr_info(fmt, ...)	vnpr_info(3, fmt, ##__VA_ARGS__)
 #define v4pr_info(fmt, ...)	vnpr_info(4, fmt, ##__VA_ARGS__)
 
+/*
+ * simplify a repeated for-loop pattern walking N steps in a T _vec
+ * member inside a struct _box.  It expects int i and T *_sp to be
+ * declared in the caller.
+ * @_i:  caller provided counter.
+ * @_sp: cursor into _vec, to examine each item.
+ * @_box: ptr to a struct containing @_vec member
+ * @_vec: name of a member in @_box
+ */
+#define __ASSERT_IS_LVALUE(x) ((void)sizeof((void)0, &(x)))
+#define __ASSERT_HAS_VEC_MEMBER(_box, _vec) \
+	(void)sizeof((_box)->_vec + (_box)->num_##_vec)
+
+#define for_subvec(_i, _sp, _box, _vec)			\
+	for (__ASSERT_IS_LVALUE(_i),			\
+		__ASSERT_IS_LVALUE(_sp),		\
+		__ASSERT_HAS_VEC_MEMBER(_box, _vec),	\
+		(_i) = 0,				\
+		(_sp) = (_box)->_vec;			\
+	     (_i) < (_box)->num_##_vec;			\
+	     (_i)++, (_sp)++)		/* { block } */
+
 static void vpr_info_dq(const struct ddebug_query *query, const char *msg)
 {
 	/* trim any trailing newlines */
@@ -156,7 +178,7 @@ static struct ddebug_class_map *ddebug_find_valid_class(struct ddebug_table cons
 	struct ddebug_class_map *map;
 	int i, idx;
 
-	for (map = dt->classes, i = 0; i < dt->num_classes; i++, map++) {
+	for_subvec(i, map, dt, classes) {
 		idx = match_string(map->class_names, map->length, class_string);
 		if (idx >= 0) {
 			*class_id = idx + map->base;
@@ -1232,8 +1254,7 @@ static void ddebug_attach_module_classes(struct ddebug_table *dt, struct _ddebug
 	 * the builtin/modular classmap vector/section.  Save the start
 	 * and length of the subrange at its edges.
 	 */
-	for (cm = di->classes, i = 0; i < di->num_classes; i++, cm++) {
-
+	for_subvec(i, cm, di, classes) {
 		if (!strcmp(cm->mod_name, dt->mod_name)) {
 			if (!nc) {
 				v2pr_info("start subrange, class[%d]: module:%s base:%d len:%d ty:%d\n",

-- 
2.53.0


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH v14 19/92] dyndbg,module: make proper substructs in _ddebug_info
  2026-04-23 20:53 [PATCH v14 00/92] dyndbg: enable 0-off-cost for all of __drm_debug Jim Cromie
                   ` (17 preceding siblings ...)
  2026-04-23 20:53 ` [PATCH v14 18/92] dyndbg: macrofy a 2-index for-loop pattern Jim Cromie
@ 2026-04-23 20:54 ` Jim Cromie
  18 siblings, 0 replies; 20+ messages in thread
From: Jim Cromie @ 2026-04-23 20:54 UTC (permalink / raw)
  To: Arnd Bergmann, Jason Baron, Luis Chamberlain, Petr Pavlu,
	Daniel Gomez, Sami Tolvanen, Aaron Tomlin, Andrew Morton,
	Jonathan Corbet, Shuah Khan, Shuah Khan, Greg Kroah-Hartman,
	Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
	Simona Vetter, Jani Nikula, Joonas Lahtinen, Rodrigo Vivi,
	Tvrtko Ursulin, Alex Deucher, Christian König, David Airlie,
	Gerd Hoffmann, Dmitry Osipenko, Gurchetan Singh, Chia-I Wu,
	Matthew Brost, Thomas Hellström, Lyude Paul,
	Danilo Krummrich, Patrik Jakobsson, Zack Rusin,
	Broadcom internal kernel review list, Louis Chauvet,
	Haneen Mohammed, Melissa Wen, Sean Paul, Jocelyn Falempe,
	Ruben Wauters, Dave Stevenson, Maíra Canal,
	Raspberry Pi Kernel Maintenance, Rob Clark, Dmitry Baryshkov,
	Abhinav Kumar, Jessica Zhang, Marijn Suijten, Xinliang Liu,
	Tian Tao, Xinwei Kong, Sumit Semwal, Yongqin Liu, John Stultz,
	Philipp Zabel, Frank Li, Sascha Hauer, Pengutronix Kernel Team,
	Fabio Estevam, Chun-Kuang Hu, Matthias Brugger,
	AngeloGioacchino Del Regno, Sandy Huang, Heiko Stübner,
	Andy Yan, Alain Volmat, Raphael Gallais-Pou, Yannick Fertre,
	Raphael Gallais-Pou, Philippe Cornu, Maxime Coquelin,
	Alexandre Torgue, Oded Gabbay, Maciej Falkowski, Karol Wachowski,
	Rob Herring (Arm), Tomeu Vizoso, Liviu Dudau, Andrzej Hajda,
	Neil Armstrong, Robert Foss, Laurent Pinchart, Jonas Karlman,
	Jernej Skrabec, Liu Ying, Laurentiu Palcu, Lucas Stach,
	Paul Kocialkowski, Jianmin Lv, Qianhai Wu, Huacai Chen,
	Mingcong Bai, Xi Ruoyao, Icenowy Zheng, Laurent Pinchart,
	Tomi Valkeinen, Kieran Bingham, Geert Uytterhoeven, Magnus Damm,
	Javier Martinez Canillas, Huang Rui, Matthew Auld, Jani Nikula,
	Luca Coelho, Russell King, Christian Gmeiner
  Cc: linux-arch, linux-kernel, linux-modules, linux-doc,
	linux-kselftest, dri-devel, intel-gfx, amd-gfx, virtualization,
	intel-xe, nouveau, spice-devel, linux-arm-msm, freedreno, imx,
	linux-arm-kernel, linux-mediatek, linux-rockchip, linux-stm32,
	linux-renesas-soc, etnaviv, Jim Cromie

recompose struct _ddebug_info, inserting proper sub-structs.

The struct _ddebug_info has 2 pairs of _vec, num_##_vec fields, for
descs and classes respectively.  for_subvec() makes walking these
vectors less cumbersome, now lets move those field pairs into their
own "vec" structs: _ddebug_descs & _ddebug_class_maps, and re-compose
struct _ddebug_info to contain them cleanly.  This also lets us get
rid of for_subvec()'s num_##_vec paste-up.

Also recompose struct ddebug_table to contain a _ddebug_info.  This
reinforces its use as a cursor into relevant data for a builtin
module, and access to the full _ddebug state for modules.

NOTES:

Fixup names:

Normalize all struct names to "struct _ddebug_*" eliminating the
minor/stupid variations created in classmaps-v1.

Modify __section names: __dyndbg to __dyndbg_descriptors, and
__dyndbg_classes to __dyndbg_class_maps.  This better matches the new
struct names, and makes room for forthcoming _ddebug_class_user(s)
structs and section.

Invariant: These vectors ref a contiguous subrange of __section memory
in builtin/DATA or in loadable modules via mod->dyndbg_info; with
guaranteed life-time for us.

struct module contains a _ddebug_info field and module/main.c sets it
up, so that gets adjusted rather obviously.

Reviewed-by: Louis Chauvet <louis.chauvet@bootlin.com>
Signed-off-by: Jim Cromie <jim.cromie@gmail.com>
---
 include/asm-generic/dyndbg.lds.h |  18 +++---
 include/linux/dynamic_debug.h    |  40 ++++++++-----
 kernel/module/main.c             |  12 ++--
 lib/dynamic_debug.c              | 120 +++++++++++++++++++--------------------
 lib/test_dynamic_debug.c         |   2 +-
 5 files changed, 103 insertions(+), 89 deletions(-)

diff --git a/include/asm-generic/dyndbg.lds.h b/include/asm-generic/dyndbg.lds.h
index f95683aa16b6..8345ac6c52b7 100644
--- a/include/asm-generic/dyndbg.lds.h
+++ b/include/asm-generic/dyndbg.lds.h
@@ -3,17 +3,19 @@
 #define __ASM_GENERIC_DYNDBG_LDS_H
 
 #include <asm-generic/bounded_sections.lds.h>
-#define DYNDBG_SECTIONS()					\
-	. = ALIGN(8);						\
-	BOUNDED_SECTION_BY(__dyndbg, ___dyndbg)			\
-	BOUNDED_SECTION_BY(__dyndbg_classes, ___dyndbg_classes)
+#define DYNDBG_SECTIONS()						\
+	. = ALIGN(8);							\
+	BOUNDED_SECTION_BY(__dyndbg_descriptors, ___dyndbg_descs)	\
+	BOUNDED_SECTION_BY(__dyndbg_class_maps, ___dyndbg_class_maps)
 
 #define MOD_DYNDBG_SECTIONS()                                           \
-	__dyndbg : {							\
-		BOUNDED_SECTION_BY(__dyndbg, ___dyndbg)			\
+	__dyndbg_descriptors : {					\
+		BOUNDED_SECTION_BY(__dyndbg_descriptors,		\
+				   ___dyndbg_descs)			\
 	}								\
-	__dyndbg_classes : {						\
-		BOUNDED_SECTION_BY(__dyndbg_classes, ___dyndbg_classes)	\
+	__dyndbg_class_maps : {						\
+		BOUNDED_SECTION_BY(__dyndbg_class_maps,			\
+				   ___dyndbg_class_maps)		\
 	}
 
 #endif /* __ASM_GENERIC_DYNDBG_LDS_H */
diff --git a/include/linux/dynamic_debug.h b/include/linux/dynamic_debug.h
index 9fd36339db52..5429315ada8e 100644
--- a/include/linux/dynamic_debug.h
+++ b/include/linux/dynamic_debug.h
@@ -83,8 +83,8 @@ enum class_map_type {
 	 */
 };
 
-struct ddebug_class_map {
-	struct module *mod;
+struct _ddebug_class_map {
+	struct module *mod;	/* NULL for builtins */
 	const char *mod_name;	/* needed for builtins */
 	const char **class_names;
 	const int length;
@@ -92,21 +92,33 @@ struct ddebug_class_map {
 	enum class_map_type map_type;
 };
 
-/* encapsulate linker provided built-in (or module) dyndbg data */
+/*
+ * @_ddebug_info: gathers module/builtin dyndbg_* __sections together.
+ * For builtins, it is used as a cursor, with the inner structs
+ * marking sub-vectors of the builtin __sections in DATA.
+ */
+struct _ddebug_descs {
+	struct _ddebug *start;
+	int len;
+};
+
+struct _ddebug_class_maps {
+	struct _ddebug_class_map *start;
+	int len;
+};
+
 struct _ddebug_info {
-	struct _ddebug *descs;
-	struct ddebug_class_map *classes;
-	unsigned int num_descs;
-	unsigned int num_classes;
+	struct _ddebug_descs descs;
+	struct _ddebug_class_maps maps;
 };
 
-struct ddebug_class_param {
+struct _ddebug_class_param {
 	union {
 		unsigned long *bits;
 		unsigned long *lvl;
 	};
 	char flags[8];
-	const struct ddebug_class_map *map;
+	const struct _ddebug_class_map *map;
 };
 
 /*
@@ -125,8 +137,8 @@ struct ddebug_class_param {
  */
 #define DECLARE_DYNDBG_CLASSMAP(_var, _maptype, _base, ...)		\
 	static const char *_var##_classnames[] = { __VA_ARGS__ };	\
-	static struct ddebug_class_map __aligned(8) __used		\
-		__section("__dyndbg_classes") _var = {			\
+	static struct _ddebug_class_map __aligned(8) __used		\
+		__section("__dyndbg_class_maps") _var = {		\
 		.mod = THIS_MODULE,					\
 		.mod_name = KBUILD_MODNAME,				\
 		.base = _base,						\
@@ -166,7 +178,7 @@ void __dynamic_ibdev_dbg(struct _ddebug *descriptor,
 
 #define DEFINE_DYNAMIC_DEBUG_METADATA_CLS(name, cls, fmt)	\
 	static struct _ddebug  __aligned(8)			\
-	__section("__dyndbg") name = {				\
+	__section("__dyndbg_descriptors") name = {		\
 		.modname = KBUILD_MODNAME,			\
 		.function = __func__,				\
 		.filename = __FILE__,				\
@@ -253,7 +265,7 @@ void __dynamic_ibdev_dbg(struct _ddebug *descriptor,
  * macro.
  */
 #define _dynamic_func_call_cls(cls, fmt, func, ...)			\
-	__dynamic_func_call_cls(__UNIQUE_ID(ddebug), cls, fmt, func, ##__VA_ARGS__)
+	__dynamic_func_call_cls(__UNIQUE_ID(_ddebug), cls, fmt, func, ##__VA_ARGS__)
 #define _dynamic_func_call(fmt, func, ...)				\
 	_dynamic_func_call_cls(_DPRINTK_CLASS_DFLT, fmt, func, ##__VA_ARGS__)
 
@@ -263,7 +275,7 @@ void __dynamic_ibdev_dbg(struct _ddebug *descriptor,
  * with precisely the macro's varargs.
  */
 #define _dynamic_func_call_cls_no_desc(cls, fmt, func, ...)		\
-	__dynamic_func_call_cls_no_desc(__UNIQUE_ID(ddebug), cls, fmt,	\
+	__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,	\
diff --git a/kernel/module/main.c b/kernel/module/main.c
index 46dd8d25a605..c2b6e70f2e77 100644
--- a/kernel/module/main.c
+++ b/kernel/module/main.c
@@ -2774,12 +2774,12 @@ static int find_module_sections(struct module *mod, struct load_info *info)
 		pr_warn("%s: Ignoring obsolete parameters\n", mod->name);
 
 #ifdef CONFIG_DYNAMIC_DEBUG_CORE
-	mod->dyndbg_info.descs = section_objs(info, "__dyndbg",
-					      sizeof(*mod->dyndbg_info.descs),
-					      &mod->dyndbg_info.num_descs);
-	mod->dyndbg_info.classes = section_objs(info, "__dyndbg_classes",
-						sizeof(*mod->dyndbg_info.classes),
-						&mod->dyndbg_info.num_classes);
+	mod->dyndbg_info.descs.start = section_objs(info, "__dyndbg_descriptors",
+						    sizeof(*mod->dyndbg_info.descs.start),
+						    &mod->dyndbg_info.descs.len);
+	mod->dyndbg_info.maps.start = section_objs(info, "__dyndbg_class_maps",
+						   sizeof(*mod->dyndbg_info.maps.start),
+						   &mod->dyndbg_info.maps.len);
 #endif
 
 	return 0;
diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c
index 8f614eba8ace..f47fdb769d7a 100644
--- a/lib/dynamic_debug.c
+++ b/lib/dynamic_debug.c
@@ -39,17 +39,15 @@
 
 #include <rdma/ib_verbs.h>
 
-extern struct _ddebug __start___dyndbg[];
-extern struct _ddebug __stop___dyndbg[];
-extern struct ddebug_class_map __start___dyndbg_classes[];
-extern struct ddebug_class_map __stop___dyndbg_classes[];
+extern struct _ddebug __start___dyndbg_descs[];
+extern struct _ddebug __stop___dyndbg_descs[];
+extern struct _ddebug_class_map __start___dyndbg_class_maps[];
+extern struct _ddebug_class_map __stop___dyndbg_class_maps[];
 
 struct ddebug_table {
 	struct list_head link;
 	const char *mod_name;
-	struct _ddebug *ddebugs;
-	struct ddebug_class_map *classes;
-	unsigned int num_ddebugs, num_classes;
+	struct _ddebug_info info;
 };
 
 struct ddebug_query {
@@ -136,19 +134,19 @@ do {								\
  * @_i:  caller provided counter.
  * @_sp: cursor into _vec, to examine each item.
  * @_box: ptr to a struct containing @_vec member
- * @_vec: name of a member in @_box
+ * @_vec: name of a vector member in @_box
  */
 #define __ASSERT_IS_LVALUE(x) ((void)sizeof((void)0, &(x)))
 #define __ASSERT_HAS_VEC_MEMBER(_box, _vec) \
-	(void)sizeof((_box)->_vec + (_box)->num_##_vec)
+	((void)sizeof((_box)->_vec.start + (_box)->_vec.len))
 
 #define for_subvec(_i, _sp, _box, _vec)			\
 	for (__ASSERT_IS_LVALUE(_i),			\
 		__ASSERT_IS_LVALUE(_sp),		\
 		__ASSERT_HAS_VEC_MEMBER(_box, _vec),	\
 		(_i) = 0,				\
-		(_sp) = (_box)->_vec;			\
-	     (_i) < (_box)->num_##_vec;			\
+		(_sp) = (_box)->_vec.start;		\
+	     (_i) < (_box)->_vec.len;			\
 	     (_i)++, (_sp)++)		/* { block } */
 
 static void vpr_info_dq(const struct ddebug_query *query, const char *msg)
@@ -171,14 +169,14 @@ static void vpr_info_dq(const struct ddebug_query *query, const char *msg)
 		  query->first_lineno, query->last_lineno, query->class_string);
 }
 
-static struct ddebug_class_map *ddebug_find_valid_class(struct ddebug_table const *dt,
+static struct _ddebug_class_map *ddebug_find_valid_class(struct ddebug_table const *dt,
 							const char *class_string,
 							int *class_id)
 {
-	struct ddebug_class_map *map;
+	struct _ddebug_class_map *map;
 	int i, idx;
 
-	for_subvec(i, map, dt, classes) {
+	for_subvec(i, map, &dt->info, maps) {
 		idx = match_string(map->class_names, map->length, class_string);
 		if (idx >= 0) {
 			*class_id = idx + map->base;
@@ -249,7 +247,7 @@ static int ddebug_change(const struct ddebug_query *query,
 	unsigned int newflags;
 	unsigned int nfound = 0;
 	struct flagsbuf fbuf, nbuf;
-	struct ddebug_class_map *map = NULL;
+	struct _ddebug_class_map *map = NULL;
 	int valid_class;
 
 	/* search for matching ddebugs */
@@ -270,8 +268,8 @@ static int ddebug_change(const struct ddebug_query *query,
 			valid_class = _DPRINTK_CLASS_DFLT;
 		}
 
-		for (i = 0; i < dt->num_ddebugs; i++) {
-			struct _ddebug *dp = &dt->ddebugs[i];
+		for (i = 0; i < dt->info.descs.len; i++) {
+			struct _ddebug *dp = &dt->info.descs.start[i];
 
 			if (!ddebug_match_desc(query, dp, valid_class))
 				continue;
@@ -629,14 +627,14 @@ static int ddebug_exec_queries(char *query, const char *modname)
 }
 
 /* apply a new class-param setting */
-static int ddebug_apply_class_bitmap(const struct ddebug_class_param *dcp,
+static int ddebug_apply_class_bitmap(const struct _ddebug_class_param *dcp,
 				     const unsigned long *new_bits,
 				     const unsigned long old_bits,
 				     const char *query_modname)
 {
 #define QUERY_SIZE 128
 	char query[QUERY_SIZE];
-	const struct ddebug_class_map *map = dcp->map;
+	const struct _ddebug_class_map *map = dcp->map;
 	int matches = 0;
 	int bi, ct;
 
@@ -672,8 +670,8 @@ static int ddebug_apply_class_bitmap(const struct ddebug_class_param *dcp,
 /* accept comma-separated-list of [+-] classnames */
 static int param_set_dyndbg_classnames(const char *instr, const struct kernel_param *kp)
 {
-	const struct ddebug_class_param *dcp = kp->arg;
-	const struct ddebug_class_map *map = dcp->map;
+	const struct _ddebug_class_param *dcp = kp->arg;
+	const struct _ddebug_class_map *map = dcp->map;
 	unsigned long curr_bits, old_bits;
 	char *cl_str, *p, *tmp;
 	int cls_id, totct = 0;
@@ -743,8 +741,8 @@ static int param_set_dyndbg_module_classes(const char *instr,
 					   const struct kernel_param *kp,
 					   const char *mod_name)
 {
-	const struct ddebug_class_param *dcp = kp->arg;
-	const struct ddebug_class_map *map = dcp->map;
+	const struct _ddebug_class_param *dcp = kp->arg;
+	const struct _ddebug_class_map *map = dcp->map;
 	unsigned long inrep, new_bits, old_bits;
 	int rc, totct = 0;
 
@@ -831,8 +829,8 @@ EXPORT_SYMBOL(param_set_dyndbg_classes);
  */
 int param_get_dyndbg_classes(char *buffer, const struct kernel_param *kp)
 {
-	const struct ddebug_class_param *dcp = kp->arg;
-	const struct ddebug_class_map *map = dcp->map;
+	const struct _ddebug_class_param *dcp = kp->arg;
+	const struct _ddebug_class_map *map = dcp->map;
 
 	switch (map->map_type) {
 
@@ -1083,8 +1081,8 @@ static struct _ddebug *ddebug_iter_first(struct ddebug_iter *iter)
 	}
 	iter->table = list_entry(ddebug_tables.next,
 				 struct ddebug_table, link);
-	iter->idx = iter->table->num_ddebugs;
-	return &iter->table->ddebugs[--iter->idx];
+	iter->idx = iter->table->info.descs.len;
+	return &iter->table->info.descs.start[--iter->idx];
 }
 
 /*
@@ -1105,10 +1103,10 @@ static struct _ddebug *ddebug_iter_next(struct ddebug_iter *iter)
 		}
 		iter->table = list_entry(iter->table->link.next,
 					 struct ddebug_table, link);
-		iter->idx = iter->table->num_ddebugs;
+		iter->idx = iter->table->info.descs.len;
 		--iter->idx;
 	}
-	return &iter->table->ddebugs[iter->idx];
+	return &iter->table->info.descs.start[iter->idx];
 }
 
 /*
@@ -1152,16 +1150,19 @@ static void *ddebug_proc_next(struct seq_file *m, void *p, loff_t *pos)
 	return dp;
 }
 
-#define class_in_range(class_id, map)					\
-	(class_id >= map->base && class_id < map->base + map->length)
+static bool ddebug_class_in_range(const int class_id, const struct _ddebug_class_map *map)
+{
+	return (class_id >= map->base &&
+		class_id < map->base + map->length);
+}
 
-static const char *ddebug_class_name(struct ddebug_iter *iter, struct _ddebug *dp)
+static const char *ddebug_class_name(struct ddebug_table *dt, struct _ddebug *dp)
 {
-	struct ddebug_class_map *map = iter->table->classes;
-	int i, nc = iter->table->num_classes;
+	struct _ddebug_class_map *map;
+	int i;
 
-	for (i = 0; i < nc; i++, map++)
-		if (class_in_range(dp->class_id, map))
+	for_subvec(i, map, &dt->info, maps)
+		if (ddebug_class_in_range(dp->class_id, map))
 			return map->class_names[dp->class_id - map->base];
 
 	return NULL;
@@ -1194,7 +1195,7 @@ static int ddebug_proc_show(struct seq_file *m, void *p)
 	seq_putc(m, '"');
 
 	if (dp->class_id != _DPRINTK_CLASS_DFLT) {
-		class = ddebug_class_name(iter, dp);
+		class = ddebug_class_name(iter->table, dp);
 		if (class)
 			seq_printf(m, " class:%s", class);
 		else
@@ -1246,7 +1247,7 @@ static const struct proc_ops proc_fops = {
 
 static void ddebug_attach_module_classes(struct ddebug_table *dt, struct _ddebug_info *di)
 {
-	struct ddebug_class_map *cm;
+	struct _ddebug_class_map *cm;
 	int i, nc = 0;
 
 	/*
@@ -1254,18 +1255,18 @@ static void ddebug_attach_module_classes(struct ddebug_table *dt, struct _ddebug
 	 * the builtin/modular classmap vector/section.  Save the start
 	 * and length of the subrange at its edges.
 	 */
-	for_subvec(i, cm, di, classes) {
+	for_subvec(i, cm, di, maps) {
 		if (!strcmp(cm->mod_name, dt->mod_name)) {
 			if (!nc) {
 				v2pr_info("start subrange, class[%d]: module:%s base:%d len:%d ty:%d\n",
 					  i, cm->mod_name, cm->base, cm->length, cm->map_type);
-				dt->classes = cm;
+				dt->info.maps.start = cm;
 			}
 			nc++;
 		}
 	}
 	if (nc) {
-		dt->num_classes = nc;
+		dt->info.maps.len = nc;
 		vpr_info("module:%s attached %d classes\n", dt->mod_name, nc);
 	}
 }
@@ -1278,10 +1279,10 @@ static int ddebug_add_module(struct _ddebug_info *di, const char *modname)
 {
 	struct ddebug_table *dt;
 
-	if (!di->num_descs)
+	if (!di->descs.len)
 		return 0;
 
-	v3pr_info("add-module: %s %d sites\n", modname, di->num_descs);
+	v3pr_info("add-module: %s %d sites\n", modname, di->descs.len);
 
 	dt = kzalloc_obj(*dt);
 	if (dt == NULL) {
@@ -1295,19 +1296,18 @@ static int ddebug_add_module(struct _ddebug_info *di, const char *modname)
 	 * this struct ddebug_table.
 	 */
 	dt->mod_name = modname;
-	dt->ddebugs = di->descs;
-	dt->num_ddebugs = di->num_descs;
+	dt->info = *di;
 
 	INIT_LIST_HEAD(&dt->link);
 
-	if (di->classes && di->num_classes)
+	if (di->maps.len)
 		ddebug_attach_module_classes(dt, di);
 
 	mutex_lock(&ddebug_lock);
 	list_add_tail(&dt->link, &ddebug_tables);
 	mutex_unlock(&ddebug_lock);
 
-	vpr_info("%3u debug prints in module %s\n", di->num_descs, modname);
+	vpr_info("%3u debug prints in module %s\n", di->descs.len, modname);
 	return 0;
 }
 
@@ -1454,10 +1454,10 @@ static int __init dynamic_debug_init(void)
 	char *cmdline;
 
 	struct _ddebug_info di = {
-		.descs = __start___dyndbg,
-		.classes = __start___dyndbg_classes,
-		.num_descs = __stop___dyndbg - __start___dyndbg,
-		.num_classes = __stop___dyndbg_classes - __start___dyndbg_classes,
+		.descs.start = __start___dyndbg_descs,
+		.maps.start  = __start___dyndbg_class_maps,
+		.descs.len = __stop___dyndbg_descs - __start___dyndbg_descs,
+		.maps.len  = __stop___dyndbg_class_maps - __start___dyndbg_class_maps,
 	};
 
 #ifdef CONFIG_MODULES
@@ -1468,7 +1468,7 @@ static int __init dynamic_debug_init(void)
 	}
 #endif /* CONFIG_MODULES */
 
-	if (&__start___dyndbg == &__stop___dyndbg) {
+	if (&__start___dyndbg_descs == &__stop___dyndbg_descs) {
 		if (IS_ENABLED(CONFIG_DYNAMIC_DEBUG)) {
 			pr_warn("_ddebug table is empty in a CONFIG_DYNAMIC_DEBUG build\n");
 			return 1;
@@ -1478,16 +1478,16 @@ static int __init dynamic_debug_init(void)
 		return 0;
 	}
 
-	iter = iter_mod_start = __start___dyndbg;
+	iter = iter_mod_start = __start___dyndbg_descs;
 	modname = iter->modname;
 	i = mod_sites = mod_ct = 0;
 
-	for (; iter < __stop___dyndbg; iter++, i++, mod_sites++) {
+	for (; iter < __stop___dyndbg_descs; iter++, i++, mod_sites++) {
 
 		if (strcmp(modname, iter->modname)) {
 			mod_ct++;
-			di.num_descs = mod_sites;
-			di.descs = iter_mod_start;
+			di.descs.len = mod_sites;
+			di.descs.start = iter_mod_start;
 			ret = ddebug_add_module(&di, modname);
 			if (ret)
 				goto out_err;
@@ -1497,8 +1497,8 @@ static int __init dynamic_debug_init(void)
 			iter_mod_start = iter;
 		}
 	}
-	di.num_descs = mod_sites;
-	di.descs = iter_mod_start;
+	di.descs.len = mod_sites;
+	di.descs.start = iter_mod_start;
 	ret = ddebug_add_module(&di, modname);
 	if (ret)
 		goto out_err;
@@ -1508,8 +1508,8 @@ static int __init dynamic_debug_init(void)
 		 i, mod_ct, (int)((mod_ct * sizeof(struct ddebug_table)) >> 10),
 		 (int)((i * sizeof(struct _ddebug)) >> 10));
 
-	if (di.num_classes)
-		v2pr_info("  %d builtin ddebug class-maps\n", di.num_classes);
+	if (di.maps.len)
+		v2pr_info("  %d builtin ddebug class-maps\n", di.maps.len);
 
 	/* now that ddebug tables are loaded, process all boot args
 	 * again to find and activate queries given in dyndbg params.
diff --git a/lib/test_dynamic_debug.c b/lib/test_dynamic_debug.c
index 396144cf351b..8434f70b51bb 100644
--- a/lib/test_dynamic_debug.c
+++ b/lib/test_dynamic_debug.c
@@ -41,7 +41,7 @@ module_param_cb(do_prints, &param_ops_do_prints, NULL, 0600);
  */
 #define DD_SYS_WRAP(_model, _flags)					\
 	static unsigned long bits_##_model;				\
-	static struct ddebug_class_param _flags##_model = {		\
+	static struct _ddebug_class_param _flags##_model = {		\
 		.bits = &bits_##_model,					\
 		.flags = #_flags,					\
 		.map = &map_##_model,					\

-- 
2.53.0


^ permalink raw reply related	[flat|nested] 20+ messages in thread

end of thread, other threads:[~2026-04-23 20:55 UTC | newest]

Thread overview: 20+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-04-23 20:53 [PATCH v14 00/92] dyndbg: enable 0-off-cost for all of __drm_debug Jim Cromie
2026-04-23 20:53 ` [PATCH v14 01/92] dyndbg: fix NULL ptr on i386 due to section mis-alignment Jim Cromie
2026-04-23 20:53 ` [PATCH v14 02/92] vmlinux.lds.h: move BOUNDED_SECTION_* macros to reuse later Jim Cromie
2026-04-23 20:53 ` [PATCH v14 03/92] dyndbg.lds.S: fix lost dyndbg sections in modules Jim Cromie
2026-04-23 20:53 ` [PATCH v14 04/92] vmlinux.lds.h: drop unused HEADERED_SECTION* macros Jim Cromie
2026-04-23 20:53 ` [PATCH v14 05/92] dyndbg: factor ddebug_match_desc out from ddebug_change Jim Cromie
2026-04-23 20:53 ` [PATCH v14 06/92] dyndbg: add stub macro for DECLARE_DYNDBG_CLASSMAP Jim Cromie
2026-04-23 20:53 ` [PATCH v14 07/92] docs/dyndbg: update examples \012 to \n Jim Cromie
2026-04-23 20:53 ` [PATCH v14 08/92] docs/dyndbg: explain flags parse 1st Jim Cromie
2026-04-23 20:53 ` [PATCH v14 09/92] test-dyndbg: fixup CLASSMAP usage error Jim Cromie
2026-04-23 20:53 ` [PATCH v14 10/92] dyndbg: reword "class unknown," to "class:_UNKNOWN_" Jim Cromie
2026-04-23 20:53 ` [PATCH v14 11/92] dyndbg: make ddebug_class_param union members same size Jim Cromie
2026-04-23 20:53 ` [PATCH v14 12/92] dyndbg: drop NUM_TYPE_ARRAY Jim Cromie
2026-04-23 20:53 ` [PATCH v14 13/92] dyndbg: tweak pr_fmt to avoid expansion conflicts Jim Cromie
2026-04-23 20:53 ` [PATCH v14 14/92] dyndbg: reduce verbose/debug clutter Jim Cromie
2026-04-23 20:53 ` [PATCH v14 15/92] dyndbg: refactor param_set_dyndbg_classes and below Jim Cromie
2026-04-23 20:53 ` [PATCH v14 16/92] dyndbg: tighten fn-sig of ddebug_apply_class_bitmap Jim Cromie
2026-04-23 20:53 ` [PATCH v14 17/92] dyndbg: replace classmap list with a vector Jim Cromie
2026-04-23 20:53 ` [PATCH v14 18/92] dyndbg: macrofy a 2-index for-loop pattern Jim Cromie
2026-04-23 20:54 ` [PATCH v14 19/92] dyndbg,module: make proper substructs in _ddebug_info Jim Cromie

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox