From nobody Fri Sep 25 04:43:44 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5F74A52E042; Wed, 16 Sep 2026 15:33:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789572782; cv=none; b=Y/x9oAgnvYbcRpgDqNzLuganjAwjLakNVHmO4Ke88saLyU3xlOlRZZhyNtEzRYSX6HvBB48q+eJbqZjWQi1WF1N94rbhJAKHSCPtqfbhBiyStrP5L4wpUaLBUwwMUYFGOshsQyppVM2geNYmYCboon3Xw2kTrV1eLfQ8C6vMM7A= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789572782; c=relaxed/simple; bh=fhdiHiZhOKHCYRRFcXyv4nO3OAlJ9k5RcZl6CJcMZ/E=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=UY5fFlABHQNq0WPzkzN+ws+WmNUtAqOlVTgrpI8mso0jkqLYS3Y39bvyrt1MUY+B6gDGzy0QKlDHB1EP+7qJJbytUeJ6DsKVeOozs3leYjWBXR31M8+DTWblihE8FbRMhPZBpNJpQv03x446PPEnPDb/lA0504ovZ026gDN87+A= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=PTxO5ucb; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="PTxO5ucb" Received: by smtp.kernel.org (Postfix) with ESMTPS id 7FFA3C2BCB3; Wed, 16 Sep 2026 15:32:59 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1789572779; bh=fhdiHiZhOKHCYRRFcXyv4nO3OAlJ9k5RcZl6CJcMZ/E=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=PTxO5ucbfym2tRGDQ8v2cc9bYjtKzYdka96rTg7PaHY/6UpOIDcI3UDSwswTRlyqf eF4QTkewjWO4Iaw3IHu6bvORYzuhd0wQTeDU84gC08xNQv9QGTtrbRqI4gjlZgUVTD bL88K1t2dn9++Ux2cOB39LqBLWxWl58Xw1qvjXBmy18bgnAMxhDbubVo+aTAiC7yrB WMo2ZZXGDhTZeTsAvXMGsMcOu4m5Npr08ILd+fRj3AFFnHO5Dxix62zwi+mY3F1Ra4 jRT7tKGkwaWPlJetj/NpVwTXcui6wdxdIzMkFSnL7gafgr3I3QjLjAFxnNN3hsNVJi oJJndRwkBHmNA== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 5AC4BC982C3; Wed, 16 Sep 2026 15:32:59 +0000 (UTC) From: Jim Cromie via B4 Relay Date: Wed, 16 Sep 2026 09:32:53 -0600 Subject: [PATCH v10 01/38] selftests/dyndbg: Add kselftest script to verify dynamic-debug Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260916-dd-cmap-part2-clean-v10-1-af4cf4767707@gmail.com> References: <20260916-dd-cmap-part2-clean-v10-0-af4cf4767707@gmail.com> In-Reply-To: <20260916-dd-cmap-part2-clean-v10-0-af4cf4767707@gmail.com> To: Jason Baron , Shuah Khan , Andrew Morton , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Arnd Bergmann , Luis Chamberlain , Petr Pavlu , Daniel Gomez , Sami Tolvanen , Aaron Tomlin , Jonathan Corbet , Greg Kroah-Hartman , Nathan Chancellor , Nicolas Schier , Shuah Khan , Randy Dunlap , "Rafael J. Wysocki" , Pavel Machek , Len Brown Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-arch@vger.kernel.org, linux-modules@vger.kernel.org, linux-doc@vger.kernel.org, linux-kbuild@vger.kernel.org, linux-pm@vger.kernel.org, Jim Cromie X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789572777; l=38251; i=jim.cromie@gmail.com; s=20260203; h=from:subject:message-id; bh=Ub4ktuAINE2FKme3hh9OJfirPozcrLqOhO50Io9xP8M=; b=3etiamfd6J4GR+qYLydKJRSwXD9of0xj2VG0TSitWd+XAR2NrIQWZZMbWkI3NUv8RtEVqyTVj NbfsYyiWMZWDsHRWDT2hNS8dBkXScwQTPrB1GWDxBxg8cTe3wfLcfkP X-Developer-Key: i=jim.cromie@gmail.com; a=ed25519; pk=C6E5ODlPQo7ZBynATXH9wg7K6HxP0pIXyf4s38Qw0XE= X-Endpoint-Received: by B4 Relay for jim.cromie@gmail.com/20260203 with auth_id=958 X-Original-From: Jim Cromie Reply-To: jim.cromie@gmail.com From: Jim Cromie Ad-hoc dynamic debug testing by grepping /proc/dynamic_debug/control for counts (e.g. counting " =3Dpmf ") is brittle: multi-query commands, partial string matches, and broad module queries inadvertently alter unrelated callsites and hide syntax regressions. Introduce dyndbg_selftest.sh and reusable helper library syslog_hash_validation.sh using "the canonical test" model (baseline -> change -> verify) with two complementary validation mechanisms: 0. Spatial control-file slicing: capture_before captures the baseline state for a target range ["$range"]. After applying "$query", verify_after_change computes a normalized diff against /proc/dynamic_debug/control, stripping source line numbers and hunk headers. This renders checksum verification immune to upstream C line churn while catching unintended state drift. 1. Temporal syslog slicing: log_start and log_stop emit bookend markers into /dev/kmsg around an executed workload, slicing exact dmesg prints while stripping system timestamp/CPU/PID headers to verify reproducible output. This baseline introduces and executes the 3 built-in feature tests: 0. FT_grammar_ok: Validates valid syntax (keywords, line ranges, and colon-delimited file:line / file:func specs) using side-effect-free flags ("+_"). 1. FT_grammar_errs: Validates core parser error handling, token limits, and EINVAL paths. 2. FT_basic_queries: Validates direct queries targeting the built-in kernel/params.c file. Tests are verified against an embedded GOLDEN_RECORDS database of MD5 fingerprints. Downstream modular classmap tests (FT_classmap_inheritance, FT_test_classes, FT_modprobe_w_param) are left for commits that introduce corresponding kernel infrastructure. Runtime configuration: - V=3D0|1|2: output verbosity (0=3Dsilent pass, 1=3Dsummary, 2=3Dfull diff). - K=3D0|1|2: golden record mode (0=3Dstrict fail, 1=3Dfake pass, 2=3Dsoft p= ass). Signed-off-by: Jim Cromie --- v9: . sanitize "$K" integer input alongside "$V". . drop duplicate ifrmmod function declaration. . replace undeclared "$error_msg" with "$output" in handle_exit_code(). . rework LACK_DD_BUILTIN record filtering to check label column ($3). . truncate temp files (: > "$SEEN_HASHES_FILE") instead of rm -f under mktemp. . add handling for K=3D2 (silent soft-pass mode) to suppress DRIFT/UNREG blocks. v8: sashiko prompted cleanups . dont-skip-nomod-config . mktmp-in-test-script . fn-renames/cleanups: log_ddcmd, my_modname, set_param, verify_control_slice --- MAINTAINERS | 1 + tools/testing/selftests/dynamic_debug/Makefile | 10 + tools/testing/selftests/dynamic_debug/config | 8 + .../selftests/dynamic_debug/dyndbg_selftest.sh | 499 +++++++++++++++++= ++++ .../dynamic_debug/syslog_hash_validation.sh | 393 ++++++++++++++++ 5 files changed, 911 insertions(+) diff --git a/MAINTAINERS b/MAINTAINERS index c72453974dd7..74790be45d06 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -9260,6 +9260,7 @@ S: Maintained F: include/linux/dynamic_debug.h F: lib/dynamic_debug.c F: lib/test_dynamic_debug.c +F: tools/testing/selftests/dynamic_debug/ =20 DYNAMIC INTERRUPT MODERATION M: Tal Gilboa diff --git a/tools/testing/selftests/dynamic_debug/Makefile b/tools/testing= /selftests/dynamic_debug/Makefile new file mode 100644 index 000000000000..d998f485a9bc --- /dev/null +++ b/tools/testing/selftests/dynamic_debug/Makefile @@ -0,0 +1,10 @@ +# SPDX-License-Identifier: GPL-2.0-only +# borrowed from Makefile for user memory selftests + +# No binaries, but make sure arg-less "make" doesn't trigger "run_tests" +all: + +TEST_PROGS :=3D dyndbg_selftest.sh +TEST_FILES :=3D syslog_hash_validation.sh + +include ../lib.mk diff --git a/tools/testing/selftests/dynamic_debug/config b/tools/testing/s= elftests/dynamic_debug/config new file mode 100644 index 000000000000..ec478b17873d --- /dev/null +++ b/tools/testing/selftests/dynamic_debug/config @@ -0,0 +1,8 @@ + +# basic tests ref the builtin params module +CONFIG_DYNAMIC_DEBUG=3Dy + +# more testing is possible with these, +# but insisting on them here skips testing entirely for such configs +# CONFIG_TEST_DYNAMIC_DEBUG=3Dm +# CONFIG_TEST_DYNAMIC_DEBUG_SUBMOD=3Dm diff --git a/tools/testing/selftests/dynamic_debug/dyndbg_selftest.sh b/too= ls/testing/selftests/dynamic_debug/dyndbg_selftest.sh new file mode 100755 index 000000000000..73c2a4b07bd3 --- /dev/null +++ b/tools/testing/selftests/dynamic_debug/dyndbg_selftest.sh @@ -0,0 +1,499 @@ +#!/bin/bash +# SPDX-License-Identifier: GPL-2.0-only + +# Standard kselftest exit codes +ksft_pass=3D0 +ksft_fail=3D1 +ksft_skip=3D4 + +ESC=3D$'\033' +RED=3D"${ESC}[0;31m" +GREEN=3D"${ESC}[0;32m" +YELLOW=3D"${ESC}[0;33m" +BLUE=3D"${ESC}[0;34m" +MAGENTA=3D"${ESC}[0;35m" +CYAN=3D"${ESC}[0;36m" +NC=3D"${ESC}[0;0m" +# Environment Controls: +# V=3D0,1,2 : Verbosity (0=3Dconcise summary, 1=3Dverified assertions, 2= =3Dfull captured outputs) +# K=3D0 : Strict mode (fails with exit 1 on checksum drift or stale = records) +# K=3D1 : Soft-pass mode (prints DRIFT/STALE diffs, exits 0 with 'fa= ke success') +# K=3D2 : Silent soft-pass mode (suppresses DRIFT/STALE diffs, exits= 0 with 'fake success') +V=3D${V:=3D0} +K=3D${K:=3D0} + +# Sanitize V and K to ensure they are valid integers +if [[ ! "$V" =3D~ ^[0-9]+$ ]]; then + V=3D0 +fi +if [[ ! "$K" =3D~ ^[0-9]+$ ]]; then + K=3D0 +fi + +function v_echo { + [ "${V:-0}" -ge 1 ] && echo -e "$@" +} + +[ -e /proc/dynamic_debug/control ] || { + echo -e "${RED}: this test requires CONFIG_DYNAMIC_DEBUG=3Dy ${NC}" + exit $ksft_skip # nothing to test here, no good reason to fail. +} + +lsmod >/dev/null 2>&1 || { + echo -e "${RED}: lsmod requires /proc/modules ${NC}" + # exit $ksft_skip # maybe later we can do more +} + +# need info to avoid failures due to untestable configs + +[ -f "$KCONFIG_CONFIG" ] || KCONFIG_CONFIG=3D".config" +if [ -f "$KCONFIG_CONFIG" ]; then + v_echo "# consulting KCONFIG_CONFIG: $KCONFIG_CONFIG" + grep -q "CONFIG_DYNAMIC_DEBUG=3Dy" $KCONFIG_CONFIG ; LACK_DD_BUILTIN= =3D$? + grep -q "CONFIG_TEST_DYNAMIC_DEBUG=3Dm" $KCONFIG_CONFIG ; LACK_TMOD=3D= $? +else + # if no config, try runtime probes + modprobe -n test_dynamic_debug 2>/dev/null ; LACK_TMOD=3D$? + # assume builtin dyndbg if control exists (checked above) + LACK_DD_BUILTIN=3D0 +fi + +function ifrmmod { + [ "${LACK_TMOD:-0}" -eq 1 ] && return + grep -q "^$1 " /proc/modules 2>/dev/null && rmmod $1 +} + +# Clean up any leftover loaded test modules at initialization +ifrmmod test_dynamic_debug + +# =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D +# TESTING STRATEGY 1. +# Change and observe control-file settings: +# ddcmd: ie echo $dd_query_cmd > /proc/dynamic_debug/control +# read back control, count changes due to query_cmd +# =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D +DDCMD_LOG=3D"" # accumulate + +function log_ddcmd { + local cmd=3D"$1" + if [ "${IN_BOOKEND:-0}" -eq 1 ] && [ -n "$DDCMD_LOG" ]; then + DDCMD_LOG=3D"${DDCMD_LOG}; $cmd" + else + DDCMD_LOG=3D"$cmd" + fi +} + +function my_modprobe { + log_ddcmd "modprobe $*" + modprobe "$@" +} + +function set_param { + local val=3D"$1" + local path=3D"$2" + log_ddcmd "echo $val > $path" + echo "$val" > "$path" +} + +function ddcmd () { + # ddcmd [range_pattern] [pass|fail|log] + local args=3D"$1" + local range=3D"$2" + local action=3D"${3:-pass}" + local exp_exit=3D0 + + [ "$action" =3D "fail" ] && exp_exit=3D1 + log_ddcmd "$args" + + # Update cumulative state-machine lineage + if [[ "$args" =3D=3D *"=3D_"* ]]; then + CUMULATIVE_DDCMDS=3D"$args" + else + CUMULATIVE_DDCMDS=3D"${CUMULATIVE_DDCMDS}; $args" + fi + + [ "$action" !=3D "pass" ] && log_start + [ -n "$range" ] && capture_before "$range" + + output=3D$( (echo "$args" > /proc/dynamic_debug/control) 2>&1 ) + handle_exit_code $BASH_LINENO $FUNCNAME $? $exp_exit + + [ "$action" !=3D "pass" ] && log_stop + [ -n "$range" ] && verify_after_change +} + +function ddcmd_err () { + # ddcmd_err + # Semantic wrapper for parser syntax & error validation + ddcmd "$1" "" fail +} + +function ddcmd_load () { + # ddcmd_load + # Semantic wrapper for end-to-end filter setup and live workload loggi= ng + local query=3D"$1" + local range=3D"$2" + local param_path=3D"$3" + local val=3D"$4" + + # 1. Setup the control filters (using positional ddcmd range-check) + echo "$query" "$range" + ddcmd "$query" "$range" + + # 2. Execute the workload and capture syslog prints + log_start + echo "$val" > "$param_path" + log_stop +} + +function handle_exit_code() { + local exp_exit_code=3D0 + [ $# =3D=3D 4 ] && exp_exit_code=3D$4 + if [ "$3" -ne $exp_exit_code ]; then + echo -e "${RED}: $BASH_SOURCE:$1 $2() " \ + "expected to exit with code $exp_exit_code, got $3${NC}" + [ "$3" =3D=3D 1 ] && echo "Error: '$output'" + exit $ksft_fail + fi +} + +# =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D +# TESTING STRATEGY 2. +# do 1 to setup test expectations. +# run logging-workload +# capture output +# hash-validate it against GOLDEN_SAMPLE db (at file end) +# +# =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D +# Source hash-based validation and state verification helper library +DIR=3D"$(dirname "$(readlink -f "$0")")" +. "$DIR/syslog_hash_validation.sh" + +# Define target validation file path +CONTROL_FILE=3D"/proc/dynamic_debug/control" + +# App-specific wrappers mapping to generic library helpers +function verify_control_slice { + # $1 - pattern to slice + # $2 - optional extra args + verify_file_slice "$1" $CONTROL_FILE "$2" +} + +function slice_and_hash_ddctrl { + local slice=3D$(slice_by_grep "$1" "$CONTROL_FILE" | strip_control_lin= enos) + echo "$slice" | tr -d '\r' | md5sum | cut -d' ' -f1 +} + +# =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D +# FEATURE TESTS (FT_*) +# +# test legal queries which should execute and return 0 (success) +# so we dont look for errors in dmesg +function FT_grammar_ok { + v_echo "${GREEN}# GRAMMAR_OK_TESTS ${NC}" + ddcmd "+_" + ddcmd "-_" + + # use 4 keywords (max 9 words inc flags) + ddcmd "module foo file bar.c func buz class D2_CORE +_" # 4 keywords + #ddcmd "module foo file bar.c func buz class D2 line 100 +_" # 5 keywo= rds + + # 3. Dedicated lineno range grammar assertions (side-effect-free proof= s) + ddcmd "line 42 +_" # test exact line syntax + ddcmd "line 10- +_" # test open-ended line range (starting at 10) + ddcmd "line -100 +_" # test open-ended line range (ending at 100) + ddcmd "line 10-100 +_" # test closed-interval line range + + # 4. Dedicated colon-delimited file:line and file:func assertions + ddcmd "file a_file.c:1-100 +_" # test file:linerange syntax + ddcmd "file b_file.c:30 +_" # test file:exact_line syntax + ddcmd "file c_file.c:c_func +_" # test file:function_name syntax + ddcmd "file c_file.c:start_* +_" # test file:wildcard_function syntax + + # 5. Advanced formatting and separator checks (side-effect-free proofs) + ddcmd "format \"space\\040here\" +_" # test format query with octal es= cape + #ddcmd "module,foo +_" # test comma token separator syntax + ddcmd "func *my_func* +_" # test wildcard func syntax + ddcmd "file drivers/usb/* +_" # test wildcard file path syntax +} + +# test grammar, no actual sites chosen/changed +# use dyndbg's embedded comments in queries +function FT_grammar_errs { + v_echo "${GREEN}# GRAMMAR_ERROR_TESTS ${NC}" + ddcmd =3D_ + local verbose + + # Reset before loop + echo 0 > /sys/module/dynamic_debug/parameters/verbose + + # Sequence verbose level 0..3 to verify error diagnostics across all v= erbosity states! + for verbose in 1 2 3; do + echo $verbose > /sys/module/dynamic_debug/parameters/verbose + + ddcmd_err 'module foo format "parse +p #! unclosed quote: parse +p' + + # comments in queries tell the error in the logs + ddcmd_err "module foo unknown_keyword value #! bad flag-op v, at start of= value" + ddcmd_err "module foo %pm #! bad flag-op %, at start of %pm" + ddcmd_err "module foo +pfmHKDD #! unknown flag 'H'" + + ddcmd_err "w1 w2 w3 w4 w5 w6 w7 w8 w9 w10 w11 w12 w13 w 14 w15 w16 #! too= many words, legal max <=3D15" + ddcmd_err "func w2 w3 w4 w5 w6 w7 w8 w9 w10 w11 w12 +p #! unknown keyword= \"w3\"" + ddcmd_err "module foo line =3D_ #! expecting pairs of match-spec " + + # match-spec duplicate keywords + ddcmd_err "func foo func bar =3D_ #! match-spec:func val:foo overridden b= y bar" + ddcmd_err "file foo.c file bar.c =3D_ #! match-spec:file val:foo.c overri= dden by bar.c" + ddcmd_err "module foo module baz =3D_ #! match-spec:module val:foo overri= dden by baz" + ddcmd_err "format foo format bar =3D_ #! match-spec:format val:foo overri= dden by bar" + ddcmd_err "class D2_CORE class D2_KMS +p #! match-spec:class val:D2_CORE = overridden by D2_KMS" + ddcmd_err "module foo +x #! unknown flag 'x'" + + # line value errs + ddcmd_err "line 10 line 20 +l #! match-spec: line used 2x" + ddcmd_err "line 10a +pl #! bad line-number: 10a" + ddcmd_err "line 100-10 +pf #! last-line:10 < 1st-line:100" + + # colon-delimited syntax errs + ddcmd_err "func foo file bar.c:func_bar =3D_ #! match-spec:func val:foo o= verridden by func_bar" + ddcmd_err "file bar.c:100-10 +pf #! last-line:10 < 1st-line:100" + ddcmd_err "file bar.c:10a +pl #! bad line-number: 10a" + ddcmd_err "line 10-20 file bar.c:30 +pl #! match-spec: line used 2x" + done + + # Reset to default verbose level 0 at the end of basic errors + echo 0 > /sys/module/dynamic_debug/parameters/verbose + ddcmd =3D_ +} + +# these queries run against the builtin module: params, and change +# flags. The control file state-of-interest is found by path, +# kernel/params.c, to avoid module keyword entirely +function FT_basic_queries { + v_echo "${GREEN}# BASIC_TESTS ${NC}" + if [ $LACK_DD_BUILTIN -eq 1 ]; then + echo "SKIP - test requires params, which is a builtin module" + return + fi + ddcmd =3D_ # zero everything + + ddcmd "module params +mf" 'kernel/params.c' + ddcmd "module params +l" 'kernel/params.c' + ddcmd "module params -m" 'kernel/params.c' + ddcmd "module params =3D_" 'kernel/params.c' + + # multi-query commands split on ; on a single line + ddcmd "module params +mf ; module params func parse_args +sl" 'kernel= /params.c' + + # verify multi-cmd input, newline separated, with embedded comments + ddcmd =3D_ # reset before multiline query to capture full transition + ddcmd "module params =3D_ # clear params + module params +ml # set flags + module params func parse_args +fs # set other flags" \ + 'kernel/params.c' + + # clear flags and verify + ddcmd "module params =3D_" 'kernel/params.c' +} + +# Built-in Feature Tests (Can run on any CONFIG_DYNAMIC_DEBUG kernel, modu= lar or monolithic) +builtin_tests=3D( + FT_grammar_ok + FT_grammar_errs + FT_basic_queries +) + +# Modular Feature Tests (Require CONFIG_MODULES=3Dy and test_dynamic_debug= *.ko available) +modular_tests=3D( +) + +# =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D +# GOLDEN_RECORDS (MD5 Fingerprint Verification Database) +# +# This database stores the expected invariant log content hashes for our t= ests. +# Since the key has the line-number of the callsite, we dont yet +# support looping over a test-call, maybe we'll need to address that +# later. +# +# NB: records have lineno of the test in code above. table at bottom +# means inserts dont shift test-lines. +# +# =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D +function GOLDEN_RECORDS { + cat << 'EOF' | { +#K=3D b938440930e5f1297d524e6c0c1ec85c FT_grammar_errs.1 +#K=3D b9a397e807148d13ba07da7db7e69817 FT_grammar_errs.2 +#K=3D 5abefa504937a329f974504f1896e368 FT_grammar_errs.3 +#K=3D 1d94d0f239bf40bf51280caeab499de0 FT_grammar_errs.4 +#K=3D 135035c8a17ae100cc4ec954c4d75b2f FT_grammar_errs.5 +#K=3D a9cc14244f91a12d3174ad1314144a8e FT_grammar_errs.6 +#K=3D 5d400aad1a7d71f548b6b81274d00a55 FT_grammar_errs.7 +#K=3D 61cd359b10f9051862d3745eda07a295 FT_grammar_errs.8 +#K=3D 567379f4f4d099f00f37d1469d9370bd FT_grammar_errs.9 +#K=3D 31a026d10f85e8f4c9f8cf3e1cef3c61 FT_grammar_errs.10 +#K=3D ba62952b671a553d4b14e344a61926f7 FT_grammar_errs.11 +#K=3D 49aec6c2e99cc70a1e4137f86e94f6f4 FT_grammar_errs.12 +#K=3D cc02cccf15988a98dfd5b1df1e492e31 FT_grammar_errs.13 +#K=3D 2bbf3fac2b77b88b6cebe459ff9631d3 FT_grammar_errs.14 +#K=3D 93b67411c254875a6bae5c01c0239729 FT_grammar_errs.15 +#K=3D b22f2efe54a1637156b9521b2794806e FT_grammar_errs.16 +#K=3D de410dba40d8b097524f91da8ae2b1c5 FT_grammar_errs.17 +#K=3D 6c922048c21f6198720dfd68ae16fdad FT_grammar_errs.18 +#K=3D 4ddd57e9cbc3da2613ac59eb285ad8c1 FT_grammar_errs.19 +#K=3D ba65062f6be00a1d04907dd176d26c19 FT_grammar_errs.20 +#K=3D 94cdf3b32afa4f12a00a704208aa2e53 FT_grammar_errs.21 +#K=3D 1f6fedfe222af475211b3bfc6d08bc63 FT_grammar_errs.22 +#K=3D c67dfeca97697b707acdd70672816dff FT_grammar_errs.23 +#K=3D 9574dbfdac063409b41a44e6251fbcd9 FT_grammar_errs.24 +#K=3D 644b81753949ac1285e38ac995eeba46 FT_grammar_errs.25 +#K=3D 1bf2a93a39961f40e0c2dd4c5e2edc6d FT_grammar_errs.26 +#K=3D cdddf4ffd7fde3c12eb0c73770b872bf FT_grammar_errs.27 +#K=3D cdf7a2e2740ec007efbd29feda478420 FT_grammar_errs.28 +#K=3D f6650d69963cef433c50e1f2acb899fc FT_grammar_errs.29 +#K=3D e150a96693eb561a20eebebfd637e667 FT_grammar_errs.30 +#K=3D b63514cf73a93962311d098284d7b491 FT_grammar_errs.31 +#K=3D b253cde723889c42d2c944c1b14f5a45 FT_grammar_errs.32 +#K=3D 7ad3dfb73e82f4d75b0770179e6dc264 FT_grammar_errs.33 +#K=3D f4d905e4f72dbd535bb80d7fe9df84b0 FT_grammar_errs.34 +#K=3D 5bf50b198d8e5fe300541adfce92e073 FT_grammar_errs.35 +#K=3D 7c4d73d42cff377cd84a7683b0c3e0b9 FT_grammar_errs.36 +#K=3D 19f1aa8d33d71888be74b19a3143938f FT_grammar_errs.37 +#K=3D 84309c1322631ae74ecf2c729b6aa210 FT_grammar_errs.38 +#K=3D 8cfe48871f91a90e6eaaef9123892394 FT_grammar_errs.39 +#K=3D 8aaa5fdd50ead5cd429fbba4123b215c FT_grammar_errs.40 +#K=3D 94cdf3b32afa4f12a00a704208aa2e53 FT_grammar_errs.41 +#K=3D 1a402ada248d0d50cec13a1af150ea33 FT_grammar_errs.42 +#K=3D 5b46a8eb0d74009462f74cf7553e3228 FT_grammar_errs.43 +#K=3D 546e440044828d86135dd63f1eb9ed17 FT_grammar_errs.44 +#K=3D 644b81753949ac1285e38ac995eeba46 FT_grammar_errs.45 +#K=3D 1bf2a93a39961f40e0c2dd4c5e2edc6d FT_grammar_errs.46 +#K=3D 3e3acfb800cfb1bcb0cc07f33b75830a FT_grammar_errs.47 +#K=3D 42dc6cb4fe938bb82b64c82924ef28d8 FT_grammar_errs.48 +#K=3D cf9320d2188f5b48d508d610d95298b2 FT_grammar_errs.49 +#K=3D 1f33fb1fd2365e77c3cfbd61d1ae2a7c FT_grammar_errs.50 +#K=3D 67588c71f92f319c6224d5917456ecd2 FT_grammar_errs.51 +#K=3D 22e7795f7dbeb6dc2fce5e113312781c FT_grammar_errs.52 +#K=3D 66d253407728c1f8a850519eadd66880 FT_grammar_errs.53 +#K=3D 27e8345aaeed85c1de5516871e0bbd0c FT_grammar_errs.54 +#K=3D 43cc8a154f28f1a668ab409a1af4e77a FT_grammar_errs.55 +#K=3D eda21551fcdd76ef2f192e1d9950a05f FT_grammar_errs.56 +#K=3D 0a8a986b5610630cb75c0568deff8315 FT_grammar_errs.57 +#K=3D 29bfae73351c3157a5fe409febcef276 FT_grammar_errs.58 +#K=3D 73a9e53428d1fb1a9813e3eab7d0ea18 FT_grammar_errs.59 +#K=3D 800951095b297532e25785ab101a2ba9 FT_grammar_errs.60 +#K=3D 6e8599556a312200fb6d484565b6c52f FT_basic_queries.1 +#K=3D db17180b59444e5e34a8fc20c40e4530 FT_basic_queries.2 +#K=3D f7bd56bd407ff255ef2e3b5fb093ae6a FT_basic_queries.3 +#K=3D 4ce44468b3b5f80ae42ade1f261b952f FT_basic_queries.4 +#K=3D 02e4fd94602e108cb89bfc70d47a5dad FT_basic_queries.5 +#K=3D f03a7ca7316e8db4c0e16523dc41e75d FT_basic_queries.6 +#K=3D c518a50ba30ba8099d0dc874a27ecf16 FT_basic_queries.7 +EOF + # Read the K-recs and skip those for tests that can't run + while read -r line; do + # Filter built-in if needed + if [ "${LACK_DD_BUILTIN:-0}" -eq 1 ]; then + # Extract label (3rd field) from #K=3D line + local label=3D$(echo "$line" | awk '{print $3}') + if [[ "$label" =3D=3D FT_basic_queries* \ + || "$label" =3D=3D FT_comma_terminators* \ + || "$label" =3D=3D FT_multi_query* ]]; then + continue + fi + fi + # Filter modular if needed + if [ "${LACK_TMOD:-0}" -eq 1 ]; then + # Extract label (3rd field) from #K=3D line + local label=3D$(echo "$line" | awk '{print $3}') + if [[ "$label" =3D=3D FT_test_classes* \ + || "$label" =3D=3D FT_classmap_inheritance* \ + || "$label" =3D=3D FT_modprobe_w_param* ]]; then + continue + fi + fi + echo "$line" + done + } +} + +# =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D +# Run tests + +# Clear any stale seen/unregistered/drifted hashes from previous runs +: > "$SEEN_HASHES_FILE" +: > "$UNREG_HASHES_FILE" +: > "$DRIFT_HASHES_FILE" + +ifrmmod test_dynamic_debug + +# Check if loadable module support or our test modules are missing/builtin +LACK_TMOD=3D0 +if [ -d "/sys/module/test_dynamic_debug" ]; then + # If module is present but not in /proc/modules, + # it is a builtin module (cannot unload/reload) + if ! grep -q "^test_dynamic_debug " /proc/modules 2>/dev/null; then + LACK_TMOD=3D1 + fi +else + # Check if we can modprobe it from disk + modprobe -q -n test_dynamic_debug || LACK_TMOD=3D1 +fi + +# 1. Run all Built-in Feature Tests +v_echo "${GREEN}# RUNNING BUILT-IN FEATURE TESTS ${NC}" +for test_func in "${builtin_tests[@]}"; do + $test_func + v_echo "" +done + +# 2. Run Modular Feature Tests only if test modules are available +if [ $LACK_TMOD -eq 0 ]; then + v_echo "${GREEN}# RUNNING MODULAR FEATURE TESTS ${NC}" + for test_func in "${modular_tests[@]}"; do + $test_func + v_echo "" + done +else + v_echo "${YELLOW}# SKIPPING MODULAR TESTS: test_dynamic_debug.ko not a= vailable ${NC}" +fi + +if [ "$V" -ge 1 ]; then + echo -en "${GREEN}# Done on: " + date + echo -en "${NC}" +fi + +audit_golden_records + +# Output consolidated blocks of unregistered and drifted fingerprints +failed=3D0 + +if [ -s "$UNREG_HASHES_FILE" ]; then + if [ "$K" -ne 2 ]; then + echo -e "${YELLOW}\n# --- Unregistered Baselines ---" + cat "$UNREG_HASHES_FILE" + echo -e "# ------------------------------${NC}" + fi + : > "$UNREG_HASHES_FILE" + failed=3D1 +fi + +if [ -s "$DRIFT_HASHES_FILE" ]; then + if [ "$K" -ne 2 ]; then + echo -e "${RED}\n# --- Drifted Baselines ---" + cat "$DRIFT_HASHES_FILE" + echo -e "# -------------------------${NC}" + fi + : > "$DRIFT_HASHES_FILE" + failed=3D1 +fi + +if [ $failed -eq 1 ]; then + [ "$K" -eq 1 ] && echo "fake success" && exit $ksft_pass + [ "$K" -eq 2 ] && exit $ksft_pass + exit $ksft_fail +fi + +exit $ksft_pass + diff --git a/tools/testing/selftests/dynamic_debug/syslog_hash_validation.s= h b/tools/testing/selftests/dynamic_debug/syslog_hash_validation.sh new file mode 100644 index 000000000000..8c6e91f5d9c2 --- /dev/null +++ b/tools/testing/selftests/dynamic_debug/syslog_hash_validation.sh @@ -0,0 +1,393 @@ +#!/bin/bash +# SPDX-License-Identifier: GPL-2.0-only +# +# Generic, zero-dependency syslog and file-slicing verification helper lib= rary. +# +# Provides 2 validation mechanisms: +# 1. Spatial Control-File Slicing (State Checks & Transitions): +# - verify_file_slice: Hashes module state in /proc/.../control. +# - capture_before / verify_after_change: Hashes normalized diff between +# pre- and post-stimulus states. Strips line numbers and hunk headers, +# making the hash immune to upstream line churn in C source files. +# 2. Temporal Syslog Slicing (Workload Logging Checks): +# - log_start / log_stop / verify_dmesg_slice: Emits bookend markers to +# /dev/kmsg, slicing exact dmesg prints produced during a workload wh= ile +# stripping multi-bracket timestamp/CPU/PID headers. + +# Default APP to DYNDBG if not already set +APP=3D"${APP:-DYNDBG}" +APP_LOWER=3D$(echo "$APP" | tr '[:upper:]' '[:lower:]') + +# Global files for tracking seen, unregistered, and drifted hashes securel= y via mktemp +SEEN_HASHES_FILE=3D$(mktemp -t "${APP_LOWER}_seen_hashes.XXXXXX") +UNREG_HASHES_FILE=3D$(mktemp -t "${APP_LOWER}_unreg_hashes.XXXXXX") +DRIFT_HASHES_FILE=3D$(mktemp -t "${APP_LOWER}_drift_hashes.XXXXXX") + +# Secure trap handler to clean up temp files on exit or interrupt +trap 'rm -f "$SEEN_HASHES_FILE" "$UNREG_HASHES_FILE" "$DRIFT_HASHES_FILE"'= EXIT INT TERM HUP + +# Global variables for tracking active function transitions and sequence r= esets +LAST_FT_FUNC=3D"" +TEST_SEQ_CTR=3D0 +ACTIVE_RESOLVED_LABEL=3D"" + +# Global variables for bookending state transitions and local stimulus tra= cking +IN_BOOKEND=3D0 +DDCMD_LOG=3D"" + +# Global variable to track the active dmesg block label +ACTIVE_LOG_LABEL=3D"" + +# Helper function to auto-resolve active FT_ test and sequence label +function rdi_resolve_label { + local caller_fn=3D"" + # Traverse the call stack to find the active Feature Test function (FT= _*) + for fn in "${FUNCNAME[@]}"; do + if [[ "$fn" =3D=3D FT_* ]]; then + caller_fn=3D"$fn" + break + fi + done + + # Fallback to the immediate caller if no FT_ is in the stack + if [ -z "$caller_fn" ]; then + caller_fn=3D"${FUNCNAME[1]:-}" + fi + + # Automatically reset sequence counter if the executing function has t= ransitioned + if [ -n "$caller_fn" ] && [ "$caller_fn" !=3D "$LAST_FT_FUNC" ]; then + TEST_SEQ_CTR=3D1 + LAST_FT_FUNC=3D"$caller_fn" + fi + + if [ -n "$caller_fn" ]; then + ACTIVE_RESOLVED_LABEL=3D"${caller_fn}.${TEST_SEQ_CTR}" + else + ACTIVE_RESOLVED_LABEL=3D"${TEST_SEQ_CTR}" + fi +} + +function log_start { + ((TEST_SEQ_CTR++)) + + rdi_resolve_label + ACTIVE_LOG_LABEL=3D"$ACTIVE_RESOLVED_LABEL" + + IN_BOOKEND=3D1 + + echo "${APP}_START_${ACTIVE_LOG_LABEL}_$$" > /dev/kmsg +} + +function log_stop { + # Ends the dmesg capture block and verifies the slice + if [ -z "$ACTIVE_LOG_LABEL" ]; then + echo "Error: log_stop called without a matching log_start!" >&2 + return 1 + fi + + echo "${APP}_END_${ACTIVE_LOG_LABEL}_$$" > /dev/kmsg + + # Verify the dmesg slice + verify_dmesg_slice "$ACTIVE_LOG_LABEL" + + # Reset active state, bookend flag, and command tracker at teardown + ACTIVE_LOG_LABEL=3D"" + IN_BOOKEND=3D0 + DDCMD_LOG=3D"" +} + +function verify_fingerprint { + # Verifies a calculated fingerprint against the GOLDEN_RECORDS database + # $1 - unique test key (e.g. normal_513) + # $2 - the calculated fingerprint hash to verify + # $3 - description of what was captured (e.g. "Dmesg Log" or "File Sli= ce") + # $4 - the raw captured text block (to display in case of mismatch) + + local label=3D"$1" + local fingerprint=3D"$2" + local capture_desc=3D"$3" + local raw_capture=3D"$4" + + # Require GOLDEN_RECORDS to be defined in the caller script + if ! declare -f GOLDEN_RECORDS >/dev/null; then + echo "Error: GOLDEN_RECORDS() is not defined in the caller script.= " >&2 + return 1 + fi + + # Resolve the expected hash specifically for this label + local expected_hash_field + expected_hash_field=3D$(GOLDEN_RECORDS | \ + grep -E "[[:space:]]${label}([[:space:]]|$)" | head -n1 | awk '{pr= int $2}') + + local matched=3D0 + local h + local OLD_IFS=3D"$IFS" + IFS=3D"," + for h in $expected_hash_field; do + if [ "$h" =3D "$fingerprint" ]; then + matched=3D1 + break + fi + done + IFS=3D"$OLD_IFS" + + # Strictly verify that the computed fingerprint matches any + # expected hash for this label + if [ -n "$expected_hash_field" ] && [ $matched -eq 1 ]; then + local short_hash=3D"${fingerprint:0:12}" + [ "$V" -ge 1 ] && echo -e "${GREEN}=E2=9C=94 Verified '${label}' "= \ + "(${short_hash}) [via: '${DDCMD_LOG}']${NC}" + + if [ "$V" -ge 2 ]; then + echo -e "${CYAN}--- Captured Invariant ${capture_desc} Output = ($label) ---" + printf "#K=3D %-32s %-24s\n" "${fingerprint}" "${label}" + echo "$raw_capture" + echo -e "-----------------------------------${NC}" + fi + echo "$fingerprint" >> "$SEEN_HASHES_FILE" + else + # Failure path: display mismatch and append to corrections + local status_str=3D"UNREGISTERED" + local stimulus=3D"${DDCMD_LOG:-direct write to control}" + if [ -n "$expected_hash_field" ]; then + local short_expected=3D"${expected_hash_field:0:12}" + local short_got=3D"${fingerprint:0:12}" + if [ "${K:-0}" -ne 2 ]; then + echo -e "${RED}: DRIFT for '${label}'${NC}" + echo -e " Stimulus: ${stimulus}" + echo -e " Expected: '${short_expected}' (${expected_hash= _field})" + echo -e " Got: '${short_got}' (${fingerprint})${NC}" + fi + status_str=3D"DRIFTED" + else + if [ "${K:-0}" -ne 2 ]; then + echo -e "${YELLOW}: NO RECORD for '${label}'${NC}" + echo -e " Stimulus: ${stimulus}${NC}" + fi + fi + + if [ "${K:-0}" -ne 2 ]; then + echo -e "\nAdd or replace this line in GOLDEN_RECORDS():" + printf "#K=3D %-32s %-24s\n" "${fingerprint}" "${label}" + echo -e "\n--- Captured Invariant ${capture_desc} Output ---" + if [ "$capture_desc" =3D "File Slice" ]; then + echo "$raw_capture" | \ + sed -E "s/ =3D([_a-z]*[a-z][_a-z]*) / ${YELLOW}=3D\1${= NC} /g" + else + echo "$raw_capture" + fi + echo -e "-----------------------------------${NC}" + fi + + if [ "$status_str" =3D "DRIFTED" ]; then + printf "#K=3D %-32s %s\n" \ + "${fingerprint}" "${label}" \ + >> "$DRIFT_HASHES_FILE" + else + printf "#K=3D %-32s %s\n" \ + "${fingerprint}" "${label}" \ + >> "$UNREG_HASHES_FILE" + fi + fi +} + +function verify_dmesg_slice { + # Slices dmesg, computes its hash, and verifies it against the databas= e. + # $1 - unique test key (e.g. normal_513) + # $2 - optional start marker (defaults to ${APP}_START_${label}) + # $3 - optional end marker (defaults to ${APP}_END_${label}) + + local label=3D"$1" + local app=3D"${APP:-DYNDBG}" + local start_marker=3D"${2:-${app}_START_${label}_$$}" + local end_marker=3D"${3:-${app}_END_${label}_$$}" + + # 1. Capture the log slice (exactly once!) + local log_slice=3D$(dmesg | sed -n "/$start_marker/,/$end_marker/p" | \ + grep -E -v "$start_marker|$end_marker" | \ + sed -E -e 's/^(\[[^]]*\][[:space:]]*)+//' ) + + # 2. Compute its fingerprint + local fingerprint=3D$(echo "$log_slice" | tr -d '\r' | md5sum | cut -d= ' ' -f1) + + # 3. Verify + verify_fingerprint "$label" "$fingerprint" "Dmesg Log" "$log_slice" +} + +function strip_control_linenos { + # Normalizes 'filename:123' to 'filename:0' for /proc/dynamic_debug/co= ntrol output + sed -E 's/^([^:]+):[0-9]+/\1:0/' +} + +function slice_by_grep { + # Isolate lines matching a pattern from a file + # $1 - pattern to grep (returns entire file if empty or "*") + # $2 - file path (reads $CONTROL_FILE if not provided) + local pattern=3D"$1" + local file_path=3D"${2:-$CONTROL_FILE}" + + if [ -z "$pattern" ] || [ "$pattern" =3D "*" ]; then + cat "$file_path" + else + grep "$pattern" "$file_path" + fi +} + +function verify_file_slice { + # Captures a file slice by pattern, computes its hash, + # and verifies it against the database. + # $1 - pattern to slice + # $2 - optional file path (defaults to $CONTROL_FILE) + + local pattern=3D"$1" + local file=3D"${2:-$CONTROL_FILE}" + + # Always auto-resolve label via call stack sequence resets! + ((TEST_SEQ_CTR++)) + rdi_resolve_label + local label=3D"$ACTIVE_RESOLVED_LABEL" + + # 1. Capture the file slice (exactly once!) + local slice=3D$(slice_by_grep "$pattern" "$file") + if [ "$file" =3D "$CONTROL_FILE" ]; then + slice=3D$(echo "$slice" | strip_control_linenos) + fi + + # 2. Compute its fingerprint + local fingerprint=3D$(echo "$slice" | tr -d '\r' | md5sum | cut -d' ' = -f1) + + # 3. Verify + verify_fingerprint "$label" "$fingerprint" "File Slice" "$slice" + + # Reset state, bookend flag, and command tracker at teardown + IN_BOOKEND=3D0 + DDCMD_LOG=3D"" +} + +# Global variables for bookending state transitions +BEFORE_CAPTURE_SLICE=3D"" +BEFORE_CAPTURE_PATTERN=3D"" +BEFORE_CAPTURE_FILE=3D"" + +function capture_before { + # Captures and stores the 'before' state for a file slice transition + # $1 - pattern to slice + # $2 - optional file path (defaults to $CONTROL_FILE) + + BEFORE_CAPTURE_PATTERN=3D"$1" + BEFORE_CAPTURE_FILE=3D"${2:-$CONTROL_FILE}" + BEFORE_CAPTURE_SLICE=3D$(slice_by_grep "$BEFORE_CAPTURE_PATTERN" "$BEF= ORE_CAPTURE_FILE") + if [ "$BEFORE_CAPTURE_FILE" =3D "$CONTROL_FILE" ]; then + BEFORE_CAPTURE_SLICE=3D$(echo "$BEFORE_CAPTURE_SLICE" | strip_cont= rol_linenos) + fi + + IN_BOOKEND=3D1 +} + +function verify_after_change { + # Verifies the transition between the stored 'before' state and the cu= rrent state + # $1 - optional unique test key (resolved via stack if empty) + + local label=3D"$1" + + if [ -z "$label" ]; then + ((TEST_SEQ_CTR++)) + rdi_resolve_label + label=3D"$ACTIVE_RESOLVED_LABEL" + fi + + if [ -z "$BEFORE_CAPTURE_PATTERN" ]; then + echo "Error: verify_after_change called without a matching capture= _before!" >&2 + return 1 + fi + + # 1. Capture the 'after' state (exactly once!) + local after_slice=3D$(slice_by_grep "$BEFORE_CAPTURE_PATTERN" "$BEFORE= _CAPTURE_FILE") + if [ "$BEFORE_CAPTURE_FILE" =3D "$CONTROL_FILE" ]; then + after_slice=3D$(echo "$after_slice" | strip_control_linenos) + fi + + # 2. Generate the unified diff, stripped of volatile diff headers AND = hunk line-numbers + local transition_diff=3D$(diff -u <(echo "$BEFORE_CAPTURE_SLICE") <(ec= ho "$after_slice") | \ + tail -n +3 | \ + sed -E 's/^@@ -[0-9]+.* \+[0-9]+.* @@/@@/g') + + # 3. Compute its fingerprint + local fingerprint=3D$(echo "$transition_diff" | tr -d '\r' | md5sum | = cut -d' ' -f1) + + # 4. Verify the diff as the captured text block + verify_fingerprint "$label" "$fingerprint" "File Change Diff" "$transi= tion_diff" + + # Reset state, bookend flag, and command tracker at teardown + BEFORE_CAPTURE_SLICE=3D"" + BEFORE_CAPTURE_PATTERN=3D"" + BEFORE_CAPTURE_FILE=3D"" + IN_BOOKEND=3D0 + DDCMD_LOG=3D"" +} + +function audit_golden_records { + local seen_file=3D"$SEEN_HASHES_FILE" + + if [ ! -f "$seen_file" ]; then + return + fi + + # Require GOLDEN_RECORDS to be defined in the caller script + if ! declare -f GOLDEN_RECORDS >/dev/null; then + return + fi + + [ "${V:-0}" -ge 1 ] && echo -e "${YELLOW}# --- GOLDEN_RECORDS Audit --= -${NC}" + local stale_found=3D0 + local total_records=3D$(GOLDEN_RECORDS | grep -c "^#K=3D") + + # Read each active record line from GOLDEN_RECORDS + while read -r line; do + # Extract the hash/hashes (second word) from the #K=3D line + local hash_field=3D$(echo "$line" | awk '{print $2}') + + # Check if at least one of the comma-separated hashes was seen + local hash_seen=3D0 + local h + local OLD_IFS=3D"$IFS" + IFS=3D"," + for h in $hash_field; do + if grep -q "$h" "$seen_file" 2>/dev/null; then + hash_seen=3D1 + break + fi + done + IFS=3D"$OLD_IFS" + + # Check if this hash field was seen during the run + if [ $hash_seen -eq 0 ]; then + if [ "${K:-0}" -ne 2 ]; then + if [ $stale_found -eq 0 ]; then + # On first failure, print header if not already printed + [ "${V:-0}" -eq 0 ] && \ + echo -e "${YELLOW}# --- GOLDEN_RECORDS Audit ---${= NC}" + echo -e "${YELLOW}# The following GOLDEN_RECORDS entri= es " \ + "were never hit and may be stale:${NC}" + fi + echo -e "${YELLOW}#K_STALE=3D $line${NC}" + fi + stale_found=3D1 + fi + done < <(GOLDEN_RECORDS | grep "^#K=3D" | grep -v "") + + if [ $stale_found -eq 0 ] && [ "${V:-0}" -ge 1 ]; then + echo -e "${GREEN}# All $total_records GOLDEN_RECORDS entries " \ + "were successfully hit!${NC}" + fi + + # Detect duplicate labels in the database + local dupes=3D$(GOLDEN_RECORDS | grep "^#K=3D" | awk '{print $3}' | so= rt | uniq -d) + if [ -n "$dupes" ]; then + echo -e "\n${RED}# WARNING: Duplicate labels detected in GOLDEN_RE= CORDS():${NC}" + echo "$dupes" | sed 's/^/# /' + fi + + # Clean up + rm -f "$seen_file" +} --=20 2.55.0 From nobody Fri Sep 25 04:43:44 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5FB9452E064; Wed, 16 Sep 2026 15:33:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789572782; cv=none; b=MeMU2evRDN7pLqlhXQrej9kZstUB4nB0msHGKpYfexMduSS1x/lcq2PsIi1ZBxnTlyDVTD6mGzv4RRPB1k49LF5jQE+7fSwjj2zCYb0C/XL89X0uJPLSk1Apnlf+x2ZrHDUqJwSf7G5qdyYIb+Vr1n7ihvxwFBcLPbsPDsvrCtA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789572782; c=relaxed/simple; bh=quH97pzV1CtXlnKeUyBN5rKrZ5ibIEYYlVcGld/HXrU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=dtjmRw7Lk5+09fEMEjWC8/MIG3ezishoGiyFKmtUsd2mmPX8BZ45/RUoNCtof8N3iqcOmFJj4TgVOXAGm/TpiffmAaF7kjI9Hg4TIlPMn9qw2NbTfQjSdFgnc2EvK7wcKPUhqHpR8aPoJLgCpa3yNghCsPhtCF3eMVeNgzetG2k= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=NA3lg0aa; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="NA3lg0aa" Received: by smtp.kernel.org (Postfix) with ESMTPS id 9CF24C2BCFF; Wed, 16 Sep 2026 15:32:59 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1789572779; bh=quH97pzV1CtXlnKeUyBN5rKrZ5ibIEYYlVcGld/HXrU=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=NA3lg0aa7LMi/qaPILldobe9QPEZC8hzwUZi2QLCBfp8W9Vwtll/gwyUQtKiiOhnB rk6UoEZUqSFdPsg1MeuPUspRRLA7jPb4xD8s06pbn0WvY1SiivBx7TA5LW4i9b6NIz mj9U8f7pgnbwMapcZ0pt4x4Yd7J+SasDHA3Ql2GzoB7iair8WZ1j/y1BMkvuIFV7op oljVt7Im8q1llMDthC9ui2G00nwKR40EJosORrIZzEcXFZiSJIp29a/L41ndqQ1VA9 4vSJpNSURz+2VGRcRMOjPQB3m+BaEcJ+jNwH/XMzevOrUB77NVYKpQlCmjDqpHqEIj 9urYJYnP4fuGA== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 780B6C982C5; Wed, 16 Sep 2026 15:32:59 +0000 (UTC) From: Jim Cromie via B4 Relay Date: Wed, 16 Sep 2026 09:32:54 -0600 Subject: [PATCH v10 02/38] vmlinux.lds.h: refactor BOUNDED_SECTION_* macros into bounded_sections.lds.h Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260916-dd-cmap-part2-clean-v10-2-af4cf4767707@gmail.com> References: <20260916-dd-cmap-part2-clean-v10-0-af4cf4767707@gmail.com> In-Reply-To: <20260916-dd-cmap-part2-clean-v10-0-af4cf4767707@gmail.com> To: Jason Baron , Shuah Khan , Andrew Morton , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Arnd Bergmann , Luis Chamberlain , Petr Pavlu , Daniel Gomez , Sami Tolvanen , Aaron Tomlin , Jonathan Corbet , Greg Kroah-Hartman , Nathan Chancellor , Nicolas Schier , Shuah Khan , Randy Dunlap , "Rafael J. Wysocki" , Pavel Machek , Len Brown Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-arch@vger.kernel.org, linux-modules@vger.kernel.org, linux-doc@vger.kernel.org, linux-kbuild@vger.kernel.org, linux-pm@vger.kernel.org, Jim Cromie X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789572777; l=4249; i=jim.cromie@gmail.com; s=20260203; h=from:subject:message-id; bh=DmN3dQkizTo0tooZt8HHaXhkTJxaFppBGFefz+LuWYE=; b=uUh0c7edMYohecQYQX4CbqhGA9/2ZT6ajm72OmEveHCn488srngXQRDNko3baFGRQVUF+SHT3 D3crPB8UIrlCQLcbEAK6YGGMNX2wwZCmUrwg51SN2yXcvUkoq/VNMvb X-Developer-Key: i=jim.cromie@gmail.com; a=ed25519; pk=C6E5ODlPQo7ZBynATXH9wg7K6HxP0pIXyf4s38Qw0XE= X-Endpoint-Received: by B4 Relay for jim.cromie@gmail.com/20260203 with auth_id=958 X-Original-From: Jim Cromie Reply-To: jim.cromie@gmail.com From: 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 failure to keep dyndbg sections in some circumstances. NOTES: These macros are only for use in vmlinux.lds.h, where the _start & _end symbols are needed. Modules keep sections separate in ELF sections, with their boundaries known, so the _start and _end are not useful, and may confuse tools not expecting them. This patch ignores a checkpatch warning, because new file is covered by "GENERIC INCLUDE/ASM HEADER FILES" in MAINTAINERS CC: Arnd Bergmann CC: linux-arch@vger.kernel.org Signed-off-by: Jim Cromie --- v3: move include to top --- include/asm-generic/bounded_sections.lds.h | 36 ++++++++++++++++++++++++++= ++++ include/asm-generic/vmlinux.lds.h | 31 +------------------------ 2 files changed, 37 insertions(+), 30 deletions(-) diff --git a/include/asm-generic/bounded_sections.lds.h b/include/asm-gener= ic/bounded_sections.lds.h new file mode 100644 index 000000000000..8c29293ca7fb --- /dev/null +++ b/include/asm-generic/bounded_sections.lds.h @@ -0,0 +1,36 @@ +/* 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_) \ + _BEGIN_##_label_ =3D .; \ + KEEP(*(_sec_)) \ + _END_##_label_ =3D .; + +#define BOUNDED_SECTION_POST_LABEL(_sec_, _label_, _BEGIN_, _END_) \ + _label_##_BEGIN_ =3D .; \ + KEEP(*(_sec_)) \ + _label_##_END_ =3D .; + +#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_ =3D .; \ + KEEP(*(.gnu.linkonce.##_sec_)) \ + BOUNDED_SECTION_PRE_LABEL(_sec_, _label_, _BEGIN_, _END_) + +#define HEADERED_SECTION_POST_LABEL(_sec_, _label_, _BEGIN_, _END_, _HDR_)= \ + _label_##_HDR_ =3D .; \ + 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/vmlinu= x.lds.h index b2988aa12f66..b4ece391f7b1 100644 --- a/include/asm-generic/vmlinux.lds.h +++ b/include/asm-generic/vmlinux.lds.h @@ -50,6 +50,7 @@ * [__nosave_begin, __nosave_end] for the nosave data */ =20 +#include #include =20 #ifndef LOAD_OFFSET @@ -211,36 +212,6 @@ # endif #endif =20 -#define BOUNDED_SECTION_PRE_LABEL(_sec_, _label_, _BEGIN_, _END_) \ - _BEGIN_##_label_ =3D .; \ - KEEP(*(_sec_)) \ - _END_##_label_ =3D .; - -#define BOUNDED_SECTION_POST_LABEL(_sec_, _label_, _BEGIN_, _END_) \ - _label_##_BEGIN_ =3D .; \ - KEEP(*(_sec_)) \ - _label_##_END_ =3D .; - -#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_ =3D .; \ - KEEP(*(.gnu.linkonce.##_sec_)) \ - BOUNDED_SECTION_PRE_LABEL(_sec_, _label_, _BEGIN_, _END_) - -#define HEADERED_SECTION_POST_LABEL(_sec_, _label_, _BEGIN_, _END_, _HDR_)= \ - _label_##_HDR_ =3D .; \ - 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) - #ifdef CONFIG_TRACE_BRANCH_PROFILING #define LIKELY_PROFILE() \ BOUNDED_SECTION_BY(_ftrace_annotated_branch, _annotated_branch_profile) --=20 2.55.0 From nobody Fri Sep 25 04:43:44 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5F87852E045; Wed, 16 Sep 2026 15:33:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789572782; cv=none; b=OAbvtR2sMjEq8pdD8c06+03wjbcl+uDFeCet3RGadEra9sE7gsOnZgfNpzqQtBpAmCSiTlEGxGE28H9iqrHCgP/Px9K/RYb01wfAIzoq7U69xg0ELVJ9Pw/pvJY63zsbTKU0vQeROcDWT8XYtmu/8ju5uCpS3cv6ozypy54T2C0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789572782; c=relaxed/simple; bh=GWkapSVvyFUFAgZ+6PHr+LM1u0ZhUP84bP/x3TY51II=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=JASv9y5Do8zOj7hZuJO8kXRSrre1kdjn6v5uHjPyO66dCAcaGsVz/H76PDDIokkHW7Ick4dkiC2nEk3KsuhBk7V92xXPMtUlD53IDBthg61h2dZtTqMHQV+5F8r6b7oh7s9XUD3wYol38YTmfBMmtXmtuGkfiztyyHq+LE5lvPk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=XXrv9QMT; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="XXrv9QMT" Received: by smtp.kernel.org (Postfix) with ESMTPS id AA015C4AF0F; Wed, 16 Sep 2026 15:32:59 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1789572779; bh=GWkapSVvyFUFAgZ+6PHr+LM1u0ZhUP84bP/x3TY51II=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=XXrv9QMT7MaUzeqvYM4H3XQHPEPSXNCP8r6Rrkt6zQbYqtcr73oD/xDKXSzCVjWR5 3ysS1i0zjx+9uAU0TJ+LNITuoWjBK6/QXN5Foxw04o1T00L/4RBodiXWfTkcb1tJTO efkxMQHEVJC+xjsvZk9A2LlD+HXHfh/vvIx2A34ea2GurhfkCobAGX755S7yvHDq9Q E8b8XgdmdwixdUzJsYAmSPd5B9ZrIDm76OnZlRX9jgYDZP1JZW0fHZy0icY7oD/lYi Ys1AJuD4+l/k5UKQU1blfBdFk3OgW8iB0bQMYqLv3+dXPTAcXFEybYpud1QWjwD3hS 2dygGZVzdQzmA== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 94BEDC982C4; Wed, 16 Sep 2026 15:32:59 +0000 (UTC) From: Jim Cromie via B4 Relay Date: Wed, 16 Sep 2026 09:32:55 -0600 Subject: [PATCH v10 03/38] vmlinux.lds.h: drop unused HEADERED_SECTION* macros Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260916-dd-cmap-part2-clean-v10-3-af4cf4767707@gmail.com> References: <20260916-dd-cmap-part2-clean-v10-0-af4cf4767707@gmail.com> In-Reply-To: <20260916-dd-cmap-part2-clean-v10-0-af4cf4767707@gmail.com> To: Jason Baron , Shuah Khan , Andrew Morton , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Arnd Bergmann , Luis Chamberlain , Petr Pavlu , Daniel Gomez , Sami Tolvanen , Aaron Tomlin , Jonathan Corbet , Greg Kroah-Hartman , Nathan Chancellor , Nicolas Schier , Shuah Khan , Randy Dunlap , "Rafael J. Wysocki" , Pavel Machek , Len Brown Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-arch@vger.kernel.org, linux-modules@vger.kernel.org, linux-doc@vger.kernel.org, linux-kbuild@vger.kernel.org, linux-pm@vger.kernel.org, Jim Cromie X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789572777; l=1428; i=jim.cromie@gmail.com; s=20260203; h=from:subject:message-id; bh=R+ywodY9/HEwLU1o/08HL92DtAFTrUi2XM/5yuI7Itk=; b=yeGUJYLY5UNjv61gX7CJpZJIEsl9XT5mUHj6BYjcizx/TjOFADzgXfj4SqN5qB9pFRDivDQBX XFA7bYt3XikCbnAWN40221eiikf41dY/+foJ0tnZVa9Sp/P6fikTgyf X-Developer-Key: i=jim.cromie@gmail.com; a=ed25519; pk=C6E5ODlPQo7ZBynATXH9wg7K6HxP0pIXyf4s38Qw0XE= X-Endpoint-Received: by B4 Relay for jim.cromie@gmail.com/20260203 with auth_id=958 X-Original-From: Jim Cromie Reply-To: jim.cromie@gmail.com From: 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 --- 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-gener= ic/bounded_sections.lds.h index 8c29293ca7fb..268cdc34389b 100644 --- a/include/asm-generic/bounded_sections.lds.h +++ b/include/asm-generic/bounded_sections.lds.h @@ -18,19 +18,4 @@ =20 #define BOUNDED_SECTION(_sec) BOUNDED_SECTION_BY(_sec, _sec) =20 -#define HEADERED_SECTION_PRE_LABEL(_sec_, _label_, _BEGIN_, _END_, _HDR_) \ - _HDR_##_label_ =3D .; \ - KEEP(*(.gnu.linkonce.##_sec_)) \ - BOUNDED_SECTION_PRE_LABEL(_sec_, _label_, _BEGIN_, _END_) - -#define HEADERED_SECTION_POST_LABEL(_sec_, _label_, _BEGIN_, _END_, _HDR_)= \ - _label_##_HDR_ =3D .; \ - 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 */ --=20 2.55.0 From nobody Fri Sep 25 04:43:44 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 60D7552E078; Wed, 16 Sep 2026 15:33:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789572782; cv=none; b=rz2e/vvVINq8Bdp23mSmGWf/niS5hDCHXcZhQNKpdYgkgNHyOcxdka4YZqHOkdsZ3vEoSCdLSSgyER94E77xS6jxKCC+HJji7RAftS9rgCmMIGWjnhK+K2k66yPjSVP+aSIThjCrC+b1g5hShwjWeRZsa1Cc3qoBaLpPMhLyLE8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789572782; c=relaxed/simple; bh=NDrZE41402D/UHYSx49263+3eXhDlauLvRgsYeGLj0M=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=DKRwxjiBs+43wjnPV3l7Y0C1fsEARjNyd09OhehsArodsCXI/ne7Bg8FlFLZREk/XEPaU06di/a5EkUszgGxsF/USX44yc7jx6DXTue7XSwh755J7/1CuzZ3Z4k8Qya9V8ggpDqnl48n4Kc4X/8g3XNYVz0+lTnBbbdyYZJbOHo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=NHYP1n+h; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="NHYP1n+h" Received: by smtp.kernel.org (Postfix) with ESMTPS id C988EC4AF15; Wed, 16 Sep 2026 15:32:59 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1789572779; bh=NDrZE41402D/UHYSx49263+3eXhDlauLvRgsYeGLj0M=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=NHYP1n+hhPY3yrKlimTlcdCg6r+xcH4jfIvEuGkAJHIPSa141vuo5aAiBQGnHBvxo CteJE2rIhRxeDM5E5xMqvb/frS7RV8ROqwUanizbxG8TLA71/WQp/6bHJ8bkN95Vl0 0e4/nWgoQG6oM/l+Lz8UrLbBrAVcww3C1Ev08LrDblkAbrbnJpjnRLF6ZCo9QeiTJ8 u+JXOmfzjdyENaGz1B6XaTLQlLj0vK0+TWVXyuB7+R697eleFZm1F+78pjmGdIEhRU GAfAWHZpQbPT/+lxIN+0Z4JvuwmV9djh3/ARmDrKsBQfUGKrDSimuY32D4g+KBYZBU dUHW+B69ckGsg== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id B01A9C982C9; Wed, 16 Sep 2026 15:32:59 +0000 (UTC) From: Jim Cromie via B4 Relay Date: Wed, 16 Sep 2026 09:32:56 -0600 Subject: [PATCH v10 04/38] vmlinux.lds.h: Fix ALIGN(8) omission causing NULL ptr on i386 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260916-dd-cmap-part2-clean-v10-4-af4cf4767707@gmail.com> References: <20260916-dd-cmap-part2-clean-v10-0-af4cf4767707@gmail.com> In-Reply-To: <20260916-dd-cmap-part2-clean-v10-0-af4cf4767707@gmail.com> To: Jason Baron , Shuah Khan , Andrew Morton , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Arnd Bergmann , Luis Chamberlain , Petr Pavlu , Daniel Gomez , Sami Tolvanen , Aaron Tomlin , Jonathan Corbet , Greg Kroah-Hartman , Nathan Chancellor , Nicolas Schier , Shuah Khan , Randy Dunlap , "Rafael J. Wysocki" , Pavel Machek , Len Brown Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-arch@vger.kernel.org, linux-modules@vger.kernel.org, linux-doc@vger.kernel.org, linux-kbuild@vger.kernel.org, linux-pm@vger.kernel.org, Jim Cromie , Louis Chauvet X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789572777; l=6221; i=jim.cromie@gmail.com; s=20260203; h=from:subject:message-id; bh=22WCSuGF05p8gA76uv7PlnmHWahruFec5XONc19uauM=; b=0A7NnOViySI5isyLb0PtrCo6DPjCTk4HR08Sf0w8Xw7vpJ470MrK41HfHkVD1g+Fnw5ABF1Zr vYt2wXH7fAyCw2U0xkGvDDUM66L3EjJsZJKnciN6d7lZQE75sb9q8DZ X-Developer-Key: i=jim.cromie@gmail.com; a=ed25519; pk=C6E5ODlPQo7ZBynATXH9wg7K6HxP0pIXyf4s38Qw0XE= X-Endpoint-Received: by B4 Relay for jim.cromie@gmail.com/20260203 with auth_id=958 X-Original-From: Jim Cromie Reply-To: jim.cromie@gmail.com From: Jim Cromie Almost all uses of the BOUNDED_SECTION macros are ALIGN(8), either explicitly, or by being below an aligned section containing x*8 byte objects. The noteworthy exception is BOUNDED_SECTION(__dyndbg), which immediately follows BOUNDED_SECTION(__dyndbg_classes). On i386, struct _ddebug_classmap is 28 bytes, so without an explicit ALIGN(8) in the macro, the following __dyndbg section gets misaligned, causing a NULL ptr deref in dynamic_debug_init(). So fix this with an explicit ALIGN(8) in the existing BOUNDED_SECTION macros, and introduce _ALIGNED variants to handle the cases with an explicit . =3D ALIGN(x) Also add explicit alignments for: EXCEPTION_TABLE, ORC_UNWIND_TABLE, TRACEDATA, INIT_SETUP, and NOTES. update BOUNDED_SECTION uses inside . =3D ALIGN(x) stanzas to use _ALIGNED variants, but keep the outer ALIGNs so the symbols between them are not "re-aligned". In particular, scripts/sorttable.c does not tolerate sloppy padding. At the top of ORC_UNWIND_TABLE, add . =3D ALIGN(4) to match the struct orc_header __align() call in the code: commit b9f174c811e3 ("x86/unwind/orc: Add ELF section with ORC version iden= tifier") Suggested-by: Louis Chauvet # _ALIGNED variant= s. Link: https://lore.kernel.org/lkml/177402491426.6181.12855763650074831089.b= 4-review@b4/ Signed-off-by: Jim Cromie --- v3: sashiko complained about NOTES and .BTF_ids. gemini asserts that NOTES are natively 4-byte aligned, add comment repeatin= g it. .BTF_ids doesnt use BOUNDED_BY, since start/end isnt needed; sashiko evidently got confused by immediately preceding usage. v2: sashiko picked up 2 cases, added to the explicit list above https://sashiko.dev/#/patchset/20260515-asm-generic-1-v3-0-680b273666d4%40g= mail.com --- include/asm-generic/bounded_sections.lds.h | 17 ++++++++++++++--- include/asm-generic/vmlinux.lds.h | 18 ++++++++++-------- 2 files changed, 24 insertions(+), 11 deletions(-) diff --git a/include/asm-generic/bounded_sections.lds.h b/include/asm-gener= ic/bounded_sections.lds.h index 268cdc34389b..8ff3e3420f60 100644 --- a/include/asm-generic/bounded_sections.lds.h +++ b/include/asm-generic/bounded_sections.lds.h @@ -3,19 +3,30 @@ #ifndef _ASM_GENERIC_BOUNDED_SECTIONS_H #define _ASM_GENERIC_BOUNDED_SECTIONS_H =20 -#define BOUNDED_SECTION_PRE_LABEL(_sec_, _label_, _BEGIN_, _END_) \ +#define BOUNDED_SECTION_PRE_LABEL_ALIGNED(_sec_, _label_, _BEGIN_, _END_, = _ALIGNED_) \ + . =3D ALIGN(_ALIGNED_); \ _BEGIN_##_label_ =3D .; \ KEEP(*(_sec_)) \ _END_##_label_ =3D .; =20 -#define BOUNDED_SECTION_POST_LABEL(_sec_, _label_, _BEGIN_, _END_) \ +#define BOUNDED_SECTION_PRE_LABEL(_sec_, _label_, _BEGIN_, _END_) \ + BOUNDED_SECTION_PRE_LABEL_ALIGNED(_sec_, _label_, _BEGIN_, _END_, 8) + +#define BOUNDED_SECTION_POST_LABEL_ALIGNED(_sec_, _label_, _BEGIN_, _END_,= _ALIGNED_) \ + . =3D ALIGN(_ALIGNED_); \ _label_##_BEGIN_ =3D .; \ KEEP(*(_sec_)) \ _label_##_END_ =3D .; =20 +#define BOUNDED_SECTION_POST_LABEL(_sec_, _label_, _BEGIN_, _END_) \ + BOUNDED_SECTION_POST_LABEL_ALIGNED(_sec_, _label_, _BEGIN_, _END_, 8) + #define BOUNDED_SECTION_BY(_sec_, _label_) \ BOUNDED_SECTION_PRE_LABEL(_sec_, _label_, __start, __stop) =20 -#define BOUNDED_SECTION(_sec) BOUNDED_SECTION_BY(_sec, _sec) +#define BOUNDED_SECTION_BY_ALIGNED(_sec_, _label_, _ALIGNED_) \ + BOUNDED_SECTION_PRE_LABEL_ALIGNED(_sec_, _label_, __start, __stop, _ALIGN= ED_) + +#define BOUNDED_SECTION(_sec) BOUNDED_SECTION_BY(_sec, _sec) =20 #endif /* _ASM_GENERIC_BOUNDED_SECTIONS_H */ diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinu= x.lds.h index b4ece391f7b1..b1a69f8af6d2 100644 --- a/include/asm-generic/vmlinux.lds.h +++ b/include/asm-generic/vmlinux.lds.h @@ -640,7 +640,7 @@ #define EXCEPTION_TABLE(align) \ . =3D ALIGN(align); \ __ex_table : AT(ADDR(__ex_table) - LOAD_OFFSET) { \ - BOUNDED_SECTION_BY(__ex_table, ___ex_table) \ + BOUNDED_SECTION_BY_ALIGNED(__ex_table, ___ex_table, align) \ } =20 /* @@ -650,7 +650,7 @@ #define BTF \ . =3D ALIGN(PAGE_SIZE); \ .BTF : AT(ADDR(.BTF) - LOAD_OFFSET) { \ - BOUNDED_SECTION_BY(.BTF, _BTF) \ + BOUNDED_SECTION_BY_ALIGNED(.BTF, _BTF, PAGE_SIZE) \ } \ . =3D ALIGN(PAGE_SIZE); \ .BTF_ids : AT(ADDR(.BTF_ids) - LOAD_OFFSET) { \ @@ -840,16 +840,17 @@ =20 #ifdef CONFIG_UNWINDER_ORC #define ORC_UNWIND_TABLE \ + . =3D ALIGN(4); \ .orc_header : AT(ADDR(.orc_header) - LOAD_OFFSET) { \ - BOUNDED_SECTION_BY(.orc_header, _orc_header) \ + BOUNDED_SECTION_BY_ALIGNED(.orc_header, _orc_header, 4) \ } \ . =3D ALIGN(4); \ .orc_unwind_ip : AT(ADDR(.orc_unwind_ip) - LOAD_OFFSET) { \ - BOUNDED_SECTION_BY(.orc_unwind_ip, _orc_unwind_ip) \ + BOUNDED_SECTION_BY_ALIGNED(.orc_unwind_ip, _orc_unwind_ip, 4)\ } \ . =3D ALIGN(2); \ .orc_unwind : AT(ADDR(.orc_unwind) - LOAD_OFFSET) { \ - BOUNDED_SECTION_BY(.orc_unwind, _orc_unwind) \ + BOUNDED_SECTION_BY_ALIGNED(.orc_unwind, _orc_unwind, 2) \ } \ text_size =3D _etext - _stext; \ . =3D ALIGN(4); \ @@ -877,7 +878,7 @@ #define TRACEDATA \ . =3D ALIGN(4); \ .tracedata : AT(ADDR(.tracedata) - LOAD_OFFSET) { \ - BOUNDED_SECTION_POST_LABEL(.tracedata, __tracedata, _start, _end) \ + BOUNDED_SECTION_POST_LABEL_ALIGNED(.tracedata, __tracedata, _start, _end= , 4) \ } #else #define TRACEDATA @@ -906,13 +907,14 @@ *(.note.gnu.property) \ } \ .notes : AT(ADDR(.notes) - LOAD_OFFSET) { \ - BOUNDED_SECTION_BY(.note.*, _notes) \ + /* *(.note.*) are natively 4-byte aligned */ \ + BOUNDED_SECTION_BY_ALIGNED(.note.*, _notes, 4) \ } NOTES_HEADERS \ NOTES_HEADERS_RESTORE =20 #define INIT_SETUP(initsetup_align) \ . =3D ALIGN(initsetup_align); \ - BOUNDED_SECTION_POST_LABEL(.init.setup, __setup, _start, _end) + BOUNDED_SECTION_POST_LABEL_ALIGNED(.init.setup, __setup, _start, _end, i= nitsetup_align) =20 #define INIT_CALLS_LEVEL(level) \ __initcall##level##_start =3D .; \ --=20 2.55.0 From nobody Fri Sep 25 04:43:44 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 919755328A8; Wed, 16 Sep 2026 15:33:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789572783; cv=none; b=ezTq5ptwpqh9pE9wbkb7KsJxU0pEqIQDZJwo5Nb2mCvn3WtqZuLuRp1p2qW8i69XqM8deAFKOlA1FHkvyesTtipHx9eitnaO5b19y1Zjd7gRJnovtk0Id7zY/Bhww7lUCGATnjzcKK6/5hQHB6yL//S4jxpSpR7BS5fa1UFvfH8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789572783; c=relaxed/simple; bh=wg1tGDYh1lFd6dygIw9mLBo0c7CqBzrzb1ytYq9rmVQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=AEjlXKSTyMyE8lYnRyoqYdMH2LYTBSptoV3qrTaF8lfY4lz+rSsn0avet3tx/iMcr7g5uNxPh+Uklhakn2zhKGy3BA783CIfQvp2YN8ecbgo2HrREvGJf01QQnI3LFCuOs8XBUoB+Y1z3a1FlHsci8XzcYR7W3B26Q5K4vmZsAU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=O2oNXmyO; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="O2oNXmyO" Received: by smtp.kernel.org (Postfix) with ESMTPS id 0A088C2BCF5; Wed, 16 Sep 2026 15:33:00 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1789572780; bh=wg1tGDYh1lFd6dygIw9mLBo0c7CqBzrzb1ytYq9rmVQ=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=O2oNXmyO7AgVKih2W/8bQhDf6/KEBtAZqEBjh8PTousbBSEBY3xwOAZDehPSa5GLv pKniX+dxftgd7reWYw3A5iP8wQ0S2Twrm1sLHBFwvHn7TJKB0a4adDnwtAM4oX+RLH bZv6B6exaBQiTsYHBKfSefvkefd1YnHBTOCwk2cCNOiz4Ss0W8pIiJsiuZuSOVlax7 J1O1RptWYzwnmlHqusPeAWUaJu6idEt02bDp06J/yBwMhTJ/On+Vg9v07xJMJQlNa2 cm1DlPedWKGH40JaAdkXWqtAnaOWh84B/5F7F5OdlTcT+biywXvtKx02rFrrrZ9nWg 7n3gg3A3qJ/qQ== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id E51A1C982CA; Wed, 16 Sep 2026 15:32:59 +0000 (UTC) From: Jim Cromie via B4 Relay Date: Wed, 16 Sep 2026 09:32:57 -0600 Subject: [PATCH v10 05/38] vmlinux.lds.h: remove redundant ALIGN(8) directives Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260916-dd-cmap-part2-clean-v10-5-af4cf4767707@gmail.com> References: <20260916-dd-cmap-part2-clean-v10-0-af4cf4767707@gmail.com> In-Reply-To: <20260916-dd-cmap-part2-clean-v10-0-af4cf4767707@gmail.com> To: Jason Baron , Shuah Khan , Andrew Morton , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Arnd Bergmann , Luis Chamberlain , Petr Pavlu , Daniel Gomez , Sami Tolvanen , Aaron Tomlin , Jonathan Corbet , Greg Kroah-Hartman , Nathan Chancellor , Nicolas Schier , Shuah Khan , Randy Dunlap , "Rafael J. Wysocki" , Pavel Machek , Len Brown Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-arch@vger.kernel.org, linux-modules@vger.kernel.org, linux-doc@vger.kernel.org, linux-kbuild@vger.kernel.org, linux-pm@vger.kernel.org, Jim Cromie X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789572777; l=3579; i=jim.cromie@gmail.com; s=20260203; h=from:subject:message-id; bh=2FyYghk7+WtWximUwhZ9mLDdeXsyVuRl38mPARiNKV4=; b=bmMy2PhErUVFRXT3J+x7MDtjV47r4eAX6sDDZo2fbpfTBBM8bYhVXTrmk88zERdc4FaHw1k41 6HnYMOF8BNmD+Ks2ii6D7Ntb7ktjOPXWMIzabcTZrwprDUDL4LhwmvE X-Developer-Key: i=jim.cromie@gmail.com; a=ed25519; pk=C6E5ODlPQo7ZBynATXH9wg7K6HxP0pIXyf4s38Qw0XE= X-Endpoint-Received: by B4 Relay for jim.cromie@gmail.com/20260203 with auth_id=958 X-Original-From: Jim Cromie Reply-To: jim.cromie@gmail.com From: Jim Cromie The BOUNDED_SECTION_PRE_LABEL and BOUNDED_SECTION_POST_LABEL macros were recently updated to inherently enforce an 8-byte alignment. This makes the explicit '. =3D ALIGN(8);' statements preceding 'naked' macro calls in vmlinux.lds.h redundant. Remove these redundant alignment directives to clean up the file and clarify that the macros handle their own alignment padding. Signed-off-by: Jim Cromie --- include/asm-generic/vmlinux.lds.h | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinu= x.lds.h index b1a69f8af6d2..c3376665d027 100644 --- a/include/asm-generic/vmlinux.lds.h +++ b/include/asm-generic/vmlinux.lds.h @@ -228,7 +228,6 @@ =20 #ifdef CONFIG_KPROBES #define KPROBE_BLACKLIST() \ - . =3D ALIGN(8); \ BOUNDED_SECTION(_kprobe_blacklist) #else #define KPROBE_BLACKLIST() @@ -244,7 +243,6 @@ =20 #ifdef CONFIG_EVENT_TRACING #define FTRACE_EVENTS() \ - . =3D ALIGN(8); \ BOUNDED_SECTION(_ftrace_events) \ BOUNDED_SECTION_BY(_ftrace_eval_map, _ftrace_eval_maps) #else @@ -261,7 +259,6 @@ =20 #ifdef CONFIG_FTRACE_SYSCALLS #define TRACE_SYSCALLS() \ - . =3D ALIGN(8); \ BOUNDED_SECTION_BY(__syscalls_metadata, _syscalls_metadata) #else #define TRACE_SYSCALLS() @@ -276,7 +273,6 @@ =20 #ifdef CONFIG_SERIAL_EARLYCON #define EARLYCON_TABLE() \ - . =3D ALIGN(8); \ BOUNDED_SECTION_POST_LABEL(__earlycon_table, __earlycon_table, , _end) #else #define EARLYCON_TABLE() @@ -284,11 +280,9 @@ =20 #ifdef CONFIG_SECURITY #define LSM_TABLE() \ - . =3D ALIGN(8); \ BOUNDED_SECTION_PRE_LABEL(.lsm_info.init, _lsm_info, __start, __end) =20 #define EARLY_LSM_TABLE() \ - . =3D ALIGN(8); \ BOUNDED_SECTION_PRE_LABEL(.early_lsm_info.init, _early_lsm_info, __start,= __end) #else #define LSM_TABLE() @@ -314,7 +308,6 @@ =20 #ifdef CONFIG_ACPI #define ACPI_PROBE_TABLE(name) \ - . =3D ALIGN(8); \ BOUNDED_SECTION_POST_LABEL(__##name##_acpi_probe_table, \ __##name##_acpi_probe_table,, _end) #else @@ -323,7 +316,6 @@ =20 #ifdef CONFIG_THERMAL #define THERMAL_TABLE(name) \ - . =3D ALIGN(8); \ BOUNDED_SECTION_POST_LABEL(__##name##_thermal_table, \ __##name##_thermal_table,, _end) #else @@ -403,12 +395,10 @@ __end_init_stack =3D .; =20 #define JUMP_TABLE_DATA \ - . =3D ALIGN(8); \ BOUNDED_SECTION_BY(__jump_table, ___jump_table) =20 #ifdef CONFIG_HAVE_STATIC_CALL_INLINE #define STATIC_CALL_DATA \ - . =3D ALIGN(8); \ BOUNDED_SECTION_BY(.static_call_sites, _static_call_sites) \ BOUNDED_SECTION_BY(.static_call_tramp_key, _static_call_tramp_key) #else @@ -453,7 +443,6 @@ *(.rodata) *(.rodata.*) *(.data.rel.ro*) \ SCHED_DATA \ RO_AFTER_INIT_DATA /* Read only after init */ \ - . =3D ALIGN(8); \ BOUNDED_SECTION_BY(__tracepoints_ptrs, ___tracepoints_ptrs) \ *(__tracepoints_strings)/* Tracepoints: strings */ \ } \ @@ -958,12 +947,10 @@ =20 /* Alignment must be consistent with (kunit_suite *) in include/kunit/test= .h */ #define KUNIT_TABLE() \ - . =3D ALIGN(8); \ BOUNDED_SECTION_POST_LABEL(.kunit_test_suites, __kunit_suites, _start, _= end) =20 /* Alignment must be consistent with (kunit_suite *) in include/kunit/test= .h */ #define KUNIT_INIT_TABLE() \ - . =3D ALIGN(8); \ BOUNDED_SECTION_POST_LABEL(.kunit_init_test_suites, \ __kunit_init_suites, _start, _end) =20 --=20 2.55.0 From nobody Fri Sep 25 04:43:44 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8FA2752FE50; Wed, 16 Sep 2026 15:33:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789572783; cv=none; b=m3TXPxcJCV535kp+m/1tI9wr+VXBLKGmd33QDFtm1sLXmHRGZg2meUbKUPs3Z6z1TFM7tRs6Lnr9UwVOqCTlTsSEQ7qoIKxqkThdo3hT1MsPltmFy0kJI4tmC1HdPB6Qe7eRzkKyIRHDkmwa7sNC0wfdu8mjYp6eMPpszb0Ccw4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789572783; c=relaxed/simple; bh=QRxuj1yH1PuNVes7iCi4WmD5WcodnmEUFLj37ilTgg0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=g39FfxwxT9yM+kpEpzQnTFu9qp9KndE8hZOHvIF0ZjY10zsv3r+Z3mL9QvCt9hHAGrfQ4AQHlYn2RS92P0S+b0DL4xJAQDLSH5yKaGzChUlBZkvwq8gAtRVH+7/2jUZnYT1F9GsMi9lQvN+WPB7gkCKqEyxoXbwN0U6I3JyCJCA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=k9jdW6KB; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="k9jdW6KB" Received: by smtp.kernel.org (Postfix) with ESMTPS id 25ABEC2BCF7; Wed, 16 Sep 2026 15:33:00 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1789572780; bh=QRxuj1yH1PuNVes7iCi4WmD5WcodnmEUFLj37ilTgg0=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=k9jdW6KBG9pBJCHsiz6MklWbrI6NTgegcWHO3YOYuhN1VHJcJtuJ1W8Ky6tEf9mra Jo5z5eoO7vCRd5a2XpZHrG/Sh1uLb2jYD1bZuddaWK+CmmRtb+L6Fvld8lYLd4arv0 dqDrB6pAUEFahabcjD00aUMA51W/7DmW8HEBP9MnB6U7nkOfIHMFmn5bS/AVjEEjwv pNE6uMDvrMQTKHTsEzthr8hEfZyRFbSQj5/fSXwuBmlTUyRQ2iOFScminQMuZy7Mll h+qZam/OTupJlMRGYCAor+OHLut1nJ7fc0X6F5gsBzGzJ5nEdVuoPoQZGGQVSUNGRV llkPmmJG1GNeQ== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 09A32C982C3; Wed, 16 Sep 2026 15:33:00 +0000 (UTC) From: Jim Cromie via B4 Relay Date: Wed, 16 Sep 2026 09:32:58 -0600 Subject: [PATCH v10 06/38] dyndbg.lds.S: fix lost dyndbg sections in modules Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260916-dd-cmap-part2-clean-v10-6-af4cf4767707@gmail.com> References: <20260916-dd-cmap-part2-clean-v10-0-af4cf4767707@gmail.com> In-Reply-To: <20260916-dd-cmap-part2-clean-v10-0-af4cf4767707@gmail.com> To: Jason Baron , Shuah Khan , Andrew Morton , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Arnd Bergmann , Luis Chamberlain , Petr Pavlu , Daniel Gomez , Sami Tolvanen , Aaron Tomlin , Jonathan Corbet , Greg Kroah-Hartman , Nathan Chancellor , Nicolas Schier , Shuah Khan , Randy Dunlap , "Rafael J. Wysocki" , Pavel Machek , Len Brown Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-arch@vger.kernel.org, linux-modules@vger.kernel.org, linux-doc@vger.kernel.org, linux-kbuild@vger.kernel.org, linux-pm@vger.kernel.org, Jim Cromie X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789572777; l=5098; i=jim.cromie@gmail.com; s=20260203; h=from:subject:message-id; bh=QGUVBtjqBJKOYQaTdea6wB7cDS8p3pXEk17D71y7DqE=; b=1qmtJv1xDNbjPDLEhXF1V2RgwkAse0bVEdgawoUV7tFJnM+m/yKpjGI0YolCghzMQWcy9+k14 o2OlPhHlXqbABQjiDYC9bI+0vjwEsux/dpDkxVukqo1ukClOfShxQza X-Developer-Key: i=jim.cromie@gmail.com; a=ed25519; pk=C6E5ODlPQo7ZBynATXH9wg7K6HxP0pIXyf4s38Qw0XE= X-Endpoint-Received: by B4 Relay for jim.cromie@gmail.com/20260203 with auth_id=958 X-Original-From: Jim Cromie Reply-To: jim.cromie@gmail.com From: Jim Cromie With CONFIG_DRM_USE_DYNAMIC_DEBUG=3Dy, several build configs had problems with __dyndbg* sections getting lost in drm drivers. Fix this by following the model demonstrated in codetag.lds.h. Introduce include/asm-generic/dyndbg.lds.h, to bundle dynamic-debug's multiple sections together, into 2 macros: vmlinux.lds.h DATA_DATA: move the 2 BOUNDED_SECTION_BY(__dyndbg*) calls into dyndbg.lds.h DYNDBG_SECTIONS(). vmlinux.lds.h now includes the new file and calls the new macro. MOD_DYNDBG_SECTIONS keeps the 2 sections by name, aligns them and sets the output address to 0 when the sections are empty. 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 Signed-off-by: Jim Cromie Reviewed-by: Petr Pavlu --- v3: move #includes to top, drop extra ALIGN(8) in DYNDBG_SECTIONS, add RvBy v2: Address linker script review feedback for relocatable modules. MOD_DYNDBG_SECTIONS() used the BOUNDED_SECTION_BY() macro, which proved problematic for kernel modules for two reasons: 1. Unwanted Empty Sections: BOUNDED_SECTION_BY() automatically generates `__start` and `__stop` symbols. When applied to `MOD_DYNDBG_SECTIONS()`, the linker assumes the sections are populated due to the symbol definitions, forcing an empty `__dyndbg` and `__dyndbg_classes` output section in every compiled module, even those without dynamic debug configuration. Since the module loader uses `section_objs()` to locate data via ELF headers instead of relying on `__start`/`__stop` symbols, these assignments are completely unnecessary. 2. Non-zero Output Addresses: During relocatable linking (e.g., `ld.bfd -r`), omitting an explicit base address causes the section to inherit the current location counter. This results in non-zero sh_addr values in `.ko` files, which is confusing, degrades compressibility, and can cause issues with external tools parsing the ELF. Fix both issues by dropping `BOUNDED_SECTION_BY()` in favor of a simple `KEEP(*(...))` constraint and explicitly defining the sections with a `0` base address: `__dyndbg 0 : ALIGN(8) { ... }`. fixup-inc-vml --- MAINTAINERS | 1 + include/asm-generic/dyndbg.lds.h | 18 ++++++++++++++++++ include/asm-generic/vmlinux.lds.h | 6 ++---- scripts/module.lds.S | 2 ++ 4 files changed, 23 insertions(+), 4 deletions(-) diff --git a/MAINTAINERS b/MAINTAINERS index 74790be45d06..009d628417d5 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -9257,6 +9257,7 @@ DYNAMIC DEBUG M: Jason Baron M: Jim Cromie 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..9d8951bef688 --- /dev/null +++ b/include/asm-generic/dyndbg.lds.h @@ -0,0 +1,18 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +#ifndef __ASM_GENERIC_DYNDBG_LDS_H +#define __ASM_GENERIC_DYNDBG_LDS_H + +#include +#define DYNDBG_SECTIONS() \ + BOUNDED_SECTION_BY(__dyndbg, ___dyndbg) \ + BOUNDED_SECTION_BY(__dyndbg_classes, ___dyndbg_classes) + +#define MOD_DYNDBG_SECTIONS() \ + __dyndbg 0 : ALIGN(8) { \ + KEEP(*(__dyndbg)) \ + } \ + __dyndbg_classes 0 : ALIGN(8) { \ + KEEP(*(__dyndbg_classes)) \ + } + +#endif /* __ASM_GENERIC_DYNDBG_LDS_H */ diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinu= x.lds.h index c3376665d027..48f00c5e8762 100644 --- a/include/asm-generic/vmlinux.lds.h +++ b/include/asm-generic/vmlinux.lds.h @@ -52,6 +52,7 @@ =20 #include #include +#include =20 #ifndef LOAD_OFFSET #define LOAD_OFFSET 0 @@ -344,10 +345,7 @@ *(.data..do_once) \ STRUCT_ALIGN(); \ *(__tracepoints) \ - /* implement dynamic printk debug */ \ - . =3D 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 d0f200428957..5950ff8edc31 100644 --- a/scripts/module.lds.S +++ b/scripts/module.lds.S @@ -5,6 +5,7 @@ */ =20 #include +#include =20 SECTIONS { /DISCARD/ : { @@ -56,6 +57,7 @@ SECTIONS { *(.rodata..L*) } =20 + MOD_DYNDBG_SECTIONS() MOD_SEPARATE_CODETAG_SECTIONS() } =20 --=20 2.55.0 From nobody Fri Sep 25 04:43:44 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 91A915328AC; Wed, 16 Sep 2026 15:33:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789572783; cv=none; b=VSwouM+BqHAc1wiDyRrmujH0OvjMraJP9ELN46FO98Cr28CZR1RFz8l84YU0DJwExdhKhK4144yWK8QGs0fBFdv/gjZFvjx2HHrybg9O1CgZ7VyeWjwUodFgNcmTeY7LHCSN84AybN891Mwf5Llvd8M/inwpUTROr6Ls0+lcoCQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789572783; c=relaxed/simple; bh=o4ErHrpACX+NN+qnYzcHo//NVgcI3D2Bv/q8WoohIdw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=BbiJrpXO8R94aAZ9GwnWkmL9dAeNfpqCqiFRgBWiTzzG6G4Fz8iTZiPE3FTHiWxMv+Spj4bYBG+qGYl13sSK/pX6zMLrw66/872aShPL3TkAIWyjViIi1fWiPQdFN1I4m6FEgRX6FRl7N+pNkSiHuHKBkpviKlPlakKXKm6Xeko= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=cIqRnXVJ; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="cIqRnXVJ" Received: by smtp.kernel.org (Postfix) with ESMTPS id 35540C2BCFA; Wed, 16 Sep 2026 15:33:00 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1789572780; bh=o4ErHrpACX+NN+qnYzcHo//NVgcI3D2Bv/q8WoohIdw=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=cIqRnXVJtBKIAKL6bMZ85OM3SJpRtC9WyzFeijxVOBWNPMHAmczL0zvG7hMqwSE7b 46Jzb+pdd/ghqaSey4NNDhoF2bQjhvfrtBPzc48h4jMfYJHQvpJloq8kvP4l/oc7/H 5kOl8CfsntvF050eEkoeY0ouKl/kRhFrwcuFgWmMsFpPuFLj40QM2JA0Qd9k2CrHXQ Ji8l9DWwaCa5s+K3KYhPr0zNi0oZYz7ifcLEe1Xe7HBEn0AM3LFV5Unt4JPA3IGn8m glnM1uj8GqUu/fzvmTE+kh8dToXR+wgraljRwuAAMKG/+P1ghxl3ODsev9MxskGdIP cTEgoSXF7c9ZA== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 1FE30C982C5; Wed, 16 Sep 2026 15:33:00 +0000 (UTC) From: Jim Cromie via B4 Relay Date: Wed, 16 Sep 2026 09:32:59 -0600 Subject: [PATCH v10 07/38] dyndbg: factor ddebug_match_desc out from ddebug_change Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260916-dd-cmap-part2-clean-v10-7-af4cf4767707@gmail.com> References: <20260916-dd-cmap-part2-clean-v10-0-af4cf4767707@gmail.com> In-Reply-To: <20260916-dd-cmap-part2-clean-v10-0-af4cf4767707@gmail.com> To: Jason Baron , Shuah Khan , Andrew Morton , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Arnd Bergmann , Luis Chamberlain , Petr Pavlu , Daniel Gomez , Sami Tolvanen , Aaron Tomlin , Jonathan Corbet , Greg Kroah-Hartman , Nathan Chancellor , Nicolas Schier , Shuah Khan , Randy Dunlap , "Rafael J. Wysocki" , Pavel Machek , Len Brown Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-arch@vger.kernel.org, linux-modules@vger.kernel.org, linux-doc@vger.kernel.org, linux-kbuild@vger.kernel.org, linux-pm@vger.kernel.org, Jim Cromie , Louis Chauvet X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789572777; l=4731; i=jim.cromie@gmail.com; s=20260203; h=from:subject:message-id; bh=NI1Y/NrLVd6WAGaD5x4xLazpESkvbiaOFoHiq156bNc=; b=GRbHZRY/3eY7Mid6kygcNw0saYbnfSu0bvftUTlPFtbw4h6dfaHpUJIsvHKFE7wMO7DeJPvih rUV1gqpifJNCi+kWkx+pKtk0u1ppODTcjpC3JcbupDQgivAEZoqWPpO X-Developer-Key: i=jim.cromie@gmail.com; a=ed25519; pk=C6E5ODlPQo7ZBynATXH9wg7K6HxP0pIXyf4s38Qw0XE= X-Endpoint-Received: by B4 Relay for jim.cromie@gmail.com/20260203 with auth_id=958 X-Original-From: Jim Cromie Reply-To: jim.cromie@gmail.com From: 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. Signed-off-by: Jim Cromie Reviewed-by: Louis Chauvet --- v5: check for null format in callsite. shouldnt happen, but pr_debug() isnt= illegal v7: elevate null format to pr_err adding filename, function, lineno. --- lib/dynamic_debug.c | 91 ++++++++++++++++++++++++++++++++-----------------= ---- 1 file changed, 55 insertions(+), 36 deletions(-) diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c index 49334d1aa4b3..5187516c57a9 100644 --- a/lib/dynamic_debug.c +++ b/lib/dynamic_debug.c @@ -172,6 +172,60 @@ static struct ddebug_class_map *ddebug_find_valid_clas= s(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 !=3D valid_class) + return false; + + if (!dp->format) { + pr_err_ratelimited("ddebug: NULL format string at %s:%s:%u\n", + dp->filename ? dp->filename : "?", + dp->function ? dp->function : "?", + dp->lineno); + 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 =3D=3D '^') { + char *p; + /* anchored search. match must be at beginning */ + p =3D strstr(dp->format, query->format + 1); + if (p !=3D 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 +258,7 @@ static int ddebug_change(const struct ddebug_query *qu= ery, for (i =3D 0; i < dt->num_ddebugs; i++) { struct _ddebug *dp =3D &dt->ddebugs[i]; =20 - /* match site against query-class */ - if (dp->class_id !=3D 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 =3D=3D '^') { - char *p; - /* anchored search. match must be at beginning */ - p =3D strstr(dp->format, query->format+1); - if (p !=3D 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; =20 nfound++; --=20 2.55.0 From nobody Fri Sep 25 04:43:44 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 91D265328C8; Wed, 16 Sep 2026 15:33:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789572783; cv=none; b=p+sHJwwX+m55SuJcPLrAa9+za8MQEV1/xFL217JRze43mJ84hLWNjP9xllwV656WfGEeJlHHmoI4vJPtrYL5tBhGFqiXj1RVm2O5rZ4+GD9RwHWl8fFbcvB/wgmQIoKHBxh+3IREZ0/QA0EuT+oBVMBMOafV7TqZAYOuR7ZzmRI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789572783; c=relaxed/simple; bh=cNiGErIulZKMDAbhqRkYA5lNr7vWOESlPNeVtrkWjAA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=MBiZQ9dENLl5ukTxBufCtaGbSNjEOfTMUwQ0A/Fn5e1xljAsbjWkxOzR6XQsNmpti8jX4VhkvByahj9XeANG3BVhpyQ8cGdkCg4ilhwlrRb95B6I+l7x5987z1C+NNpmC1lNChK2C1w9Wfzs1LJMCNGNQFnhA5bBNw7Pug1+TAI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=tqUR8fxK; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="tqUR8fxK" Received: by smtp.kernel.org (Postfix) with ESMTPS id 599DDC2BCFC; Wed, 16 Sep 2026 15:33:00 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1789572780; bh=cNiGErIulZKMDAbhqRkYA5lNr7vWOESlPNeVtrkWjAA=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=tqUR8fxKwHEAv103ZSLj0EC2uau/KHK3tAcfxAnNgM1Dwrz2FtZ5VcIQwOIFNKr18 lR/w7cRrkyQP0ONFjqUWxxLkWPyzyTm+8cnignT7XBHkj6pYNsh4m+0vQmUTmyvm1I uC4ddJjsiaApvTosIn/hGF5Wo20Po+I6orWWMQprNpFcIzfpleVo55q7JwVohaSv75 R0Sc4hoFaufvv1tKnywfyZjzcArudX3eavfFIzSLabzs44GEaPenJM+SWOuGAkDSMG 2PzFA0/qzpe8bpdCDwZYgzwiXyDk+HIbtD6zCUqzyGZZsxX0eg6tTR2Wpt6lddBJ9e Vxw29Gkp108Uw== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 36E6BC982C4; Wed, 16 Sep 2026 15:33:00 +0000 (UTC) From: Jim Cromie via B4 Relay Date: Wed, 16 Sep 2026 09:33:00 -0600 Subject: [PATCH v10 08/38] dyndbg: add stub macro for DECLARE_DYNDBG_CLASSMAP Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260916-dd-cmap-part2-clean-v10-8-af4cf4767707@gmail.com> References: <20260916-dd-cmap-part2-clean-v10-0-af4cf4767707@gmail.com> In-Reply-To: <20260916-dd-cmap-part2-clean-v10-0-af4cf4767707@gmail.com> To: Jason Baron , Shuah Khan , Andrew Morton , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Arnd Bergmann , Luis Chamberlain , Petr Pavlu , Daniel Gomez , Sami Tolvanen , Aaron Tomlin , Jonathan Corbet , Greg Kroah-Hartman , Nathan Chancellor , Nicolas Schier , Shuah Khan , Randy Dunlap , "Rafael J. Wysocki" , Pavel Machek , Len Brown Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-arch@vger.kernel.org, linux-modules@vger.kernel.org, linux-doc@vger.kernel.org, linux-kbuild@vger.kernel.org, linux-pm@vger.kernel.org, Jim Cromie X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789572777; l=3163; i=jim.cromie@gmail.com; s=20260203; h=from:subject:message-id; bh=ZuzqA3zGt/j9kYmFGfFlaL94NbjSKGlzcBcWBUqAWbM=; b=zpzVNPNi6BirL5+75bfaSRvtlmosMixzbPIKy1tA129ywzf/p4Yd9f16XTi6UOc1kG+Pggzso DTEHXTD53ZZBX8XcMvmq/4MW5cE+qiTZ7Lp4wlIABNsjMCgeePStJC2 X-Developer-Key: i=jim.cromie@gmail.com; a=ed25519; pk=C6E5ODlPQo7ZBynATXH9wg7K6HxP0pIXyf4s38Qw0XE= X-Endpoint-Received: by B4 Relay for jim.cromie@gmail.com/20260203 with auth_id=958 X-Original-From: Jim Cromie Reply-To: jim.cromie@gmail.com From: 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 --- 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; }; =20 -/** - * 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[] =3D { __VA_ARGS__ }; \ - static struct ddebug_class_map __aligned(8) __used \ - __section("__dyndbg_classes") _var =3D { \ - .mod =3D THIS_MODULE, \ - .mod_name =3D KBUILD_MODNAME, \ - .base =3D _base, \ - .map_type =3D _maptype, \ - .length =3D NUM_TYPE_ARGS(char*, __VA_ARGS__), \ - .class_names =3D _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)) =20 +/** + * 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[] =3D { __VA_ARGS__ }; \ + static struct ddebug_class_map __aligned(8) __used \ + __section("__dyndbg_classes") _var =3D { \ + .mod =3D THIS_MODULE, \ + .mod_name =3D KBUILD_MODNAME, \ + .base =3D _base, \ + .map_type =3D _maptype, \ + .length =3D NUM_TYPE_ARGS(char*, __VA_ARGS__), \ + .class_names =3D _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, ...); =20 @@ -314,6 +314,7 @@ void __dynamic_ibdev_dbg(struct _ddebug *descriptor, =20 #define DEFINE_DYNAMIC_DEBUG_METADATA(name, fmt) #define DYNAMIC_DEBUG_BRANCH(descriptor) false +#define DECLARE_DYNDBG_CLASSMAP(...) =20 #define dynamic_pr_debug(fmt, ...) \ no_printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__) --=20 2.55.0 From nobody Fri Sep 25 04:43:44 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8F8EB511180; Wed, 16 Sep 2026 15:33:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789572783; cv=none; b=cPNhWJahCW9AGqTxDZOOVuu4jPcedeKRfHSww63BV/JBYc8Gz33pMS+d2/GgGvEjZPe2lvUHrHzMAqPj7k4AEznFAM5nXkHLcJHm4RkiAqZE5rXYcUIP2KDoLMw69v7kEvgEI6I5BYCqobXNRUVcjRnG+aSzt8fMm7aooYqeWho= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789572783; c=relaxed/simple; bh=oYK6blO7F6plBbHXnQ3FHlcmqrRnRoAREkrF1chFxd4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=eE/YHi50pYstWAHLbE5QKM2pmWuHjCk2BqXniOhAie0BhRdM7+VVYPp3/CH9y0l6SZAeJp83ffzd3/INxw8MW1dyNtj0VSg1eH3fAOlG0UNPCSzrLfHgQSoOCQ3UUJAHm9xoPpWveyIBdeAmvi0HOxjvmT7JlEwiimDM2DAMdyo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=BUpGEwU4; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="BUpGEwU4" Received: by smtp.kernel.org (Postfix) with ESMTPS id 73B7CC4AF13; Wed, 16 Sep 2026 15:33:00 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1789572780; bh=oYK6blO7F6plBbHXnQ3FHlcmqrRnRoAREkrF1chFxd4=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=BUpGEwU4yKlgbOudlGfGgpBPDJrjY7riC/UfezUp/6AsuwSBs/k1afPJbR8y78Bby 3A9F1H/2D3ZU+HoitoQKYG0KxbN+5h/qH7TftR4cSM/6lW20Qx5JPXv2HN6XQz4Iw9 +Rh5FHmidVuvT1A8BMWagJkya6KXAIlokuZGBheUSY/W60AFtOEGau39C+yS9SfU0Q nWAAGSEGRQOuEtbCcn9jj5I2tjFDSxnt0yUsRc5rZHmADKMcet8EQ4DAn5hGibJoq7 /CQcj0q76xDIOcGqW4692KYf/0lWrAtK4mO1WwLGuZvWy569jZyuHWCvAwtTdXplfK TBVBgHUIwpTlA== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 4F76AC982CB; Wed, 16 Sep 2026 15:33:00 +0000 (UTC) From: Jim Cromie via B4 Relay Date: Wed, 16 Sep 2026 09:33:01 -0600 Subject: [PATCH v10 09/38] dyndbg: reword "class unknown," to "class:_UNKNOWN_" Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260916-dd-cmap-part2-clean-v10-9-af4cf4767707@gmail.com> References: <20260916-dd-cmap-part2-clean-v10-0-af4cf4767707@gmail.com> In-Reply-To: <20260916-dd-cmap-part2-clean-v10-0-af4cf4767707@gmail.com> To: Jason Baron , Shuah Khan , Andrew Morton , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Arnd Bergmann , Luis Chamberlain , Petr Pavlu , Daniel Gomez , Sami Tolvanen , Aaron Tomlin , Jonathan Corbet , Greg Kroah-Hartman , Nathan Chancellor , Nicolas Schier , Shuah Khan , Randy Dunlap , "Rafael J. Wysocki" , Pavel Machek , Len Brown Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-arch@vger.kernel.org, linux-modules@vger.kernel.org, linux-doc@vger.kernel.org, linux-kbuild@vger.kernel.org, linux-pm@vger.kernel.org, Jim Cromie , Louis Chauvet X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789572777; l=1375; i=jim.cromie@gmail.com; s=20260203; h=from:subject:message-id; bh=csqO3nNcbjzgMPxkjWfqE3DZm4hxNgITA915Yd69aPA=; b=7ADwEfXu+vb3PCq2NEl1CNxzwsWxZKKMLDSu9U7PwWa2x9bFQ8wfb3R0hxR7Or+rXJOQI1Pta w6s5TByVQ5VCZfxdIr7D+x8zVgW90biqEZd3dgaIM4ZcFOo0zd02wTT X-Developer-Key: i=jim.cromie@gmail.com; a=ed25519; pk=C6E5ODlPQo7ZBynATXH9wg7K6HxP0pIXyf4s38Qw0XE= X-Endpoint-Received: by B4 Relay for jim.cromie@gmail.com/20260203 with auth_id=958 X-Original-From: Jim Cromie Reply-To: jim.cromie@gmail.com From: Jim Cromie When a dyndbg classname is unknown to a kernel module, the callsite is un-addressable via >control queries, and therefore uncontrollable. The control-file displays this condition as "class unknown, _id:N" currently. That spelling is sub-optimal/too-generic, so change it to "class:_UNKNOWN_ _id:N" to loudly announce the erroneous situation, and to make it uniquely greppable. NB: while this might be seen as a user-visible change, this shouldn't disqualify the change: a- it reports a classmap coding error condition, which should be detected in (or before) review. b- SHOUTING the error makes it more visible, uniquely greppable. c- the classmap feature is marked BROKEN for its only current user. Signed-off-by: Jim Cromie Reviewed-by: Louis Chauvet --- 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 5187516c57a9..2269166763cc 100644 --- a/lib/dynamic_debug.c +++ b/lib/dynamic_debug.c @@ -1174,7 +1174,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'); =20 --=20 2.55.0 From nobody Fri Sep 25 04:43:44 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9175A531B1B; Wed, 16 Sep 2026 15:33:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789572783; cv=none; b=smcMu6xTbobraK4HinAzt0hFOBbHOWEgv++KbXHSp1Xdqcax0nVySOKDo99fJEqGTzDmWOfhx+R1uHv94zV18n/HwGnZKWVn+1eQEPRlBeEYgW6/cCFmEIE4F/Ew3uI+6YHhN2HDZxlk3LGICnt/eobhEiuofInTjxYSRB2RhOo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789572783; c=relaxed/simple; bh=/WWAuv5FDwbk1azib53ihgVVRzuAyuQr8Bm8BzyZhH8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=K66Ruwlg4VBOiMqZ3ScCvfgF92zJ0F6NqMqNy0bqk7KZcwiOK8qhZ6c28n9nKlXpq6MALZHvlmxD6Hs65eoKajA7CZ0YDnBUHGW7xDwUAocn+F6qgwLL+/2wRT4xFn65TuvFhwTBUKJAOJhHqrSPWiLxziDMCorkbkNlexmKfP4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=GK8bP5r5; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="GK8bP5r5" Received: by smtp.kernel.org (Postfix) with ESMTPS id 81A1AC4AF1B; Wed, 16 Sep 2026 15:33:00 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1789572780; bh=/WWAuv5FDwbk1azib53ihgVVRzuAyuQr8Bm8BzyZhH8=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=GK8bP5r5Z5phc7A6t+EylfIsfDwa4Es2z+bZKsAOMstGI5W0l7FPIKUdp7EhUDdW6 1fPL23JqsVcZHjLl+HKXHNM2MTFWr4wfy5LSP7zth60Pyfkv9g4J49oTk/Bg1vN9fe BMTfftGqsLmsmG/E7VZcgIZtPR0YOIWcsmqgWB6MaX63mZvoO5HOrqcBORKb//i3X4 gTx0UDXdjrPZ3DF15XTnsLHf3BejB/ptgf5/lJ3rka9pCNm2MD9Pkb6bxUGySNr8SZ HPqoxUSiPBHZ4WSBPbDRrbOaeD3gbxsUy3oZCk8HG1FDwLnl5rDf2V5/CH5icSITwt Igc/upRLYvVyg== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 69DF8C982C3; Wed, 16 Sep 2026 15:33:00 +0000 (UTC) From: Jim Cromie via B4 Relay Date: Wed, 16 Sep 2026 09:33:02 -0600 Subject: [PATCH v10 10/38] dyndbg-API: remove DD_CLASS_TYPE_(DISJOINT|LEVEL)_NAMES and code Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260916-dd-cmap-part2-clean-v10-10-af4cf4767707@gmail.com> References: <20260916-dd-cmap-part2-clean-v10-0-af4cf4767707@gmail.com> In-Reply-To: <20260916-dd-cmap-part2-clean-v10-0-af4cf4767707@gmail.com> To: Jason Baron , Shuah Khan , Andrew Morton , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Arnd Bergmann , Luis Chamberlain , Petr Pavlu , Daniel Gomez , Sami Tolvanen , Aaron Tomlin , Jonathan Corbet , Greg Kroah-Hartman , Nathan Chancellor , Nicolas Schier , Shuah Khan , Randy Dunlap , "Rafael J. Wysocki" , Pavel Machek , Len Brown Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-arch@vger.kernel.org, linux-modules@vger.kernel.org, linux-doc@vger.kernel.org, linux-kbuild@vger.kernel.org, linux-pm@vger.kernel.org, Jim Cromie , Louis Chauvet X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789572777; l=9445; i=jim.cromie@gmail.com; s=20260203; h=from:subject:message-id; bh=yxYyep5OTNiEvcv0hnmYo9+MSyWpXsarvFgRViAeOck=; b=Hf/i9cHuukVXlITF4INiO0KVuF+3u85VcQ4I9LASAiBLoxAaBHBkCsV8XBDHoKyPB/mkrFrEA UOHMZlVucFlChb8ZqEsLIrA/4oe8K/bbJyKobgFcd//2pdwNLOrHxCK X-Developer-Key: i=jim.cromie@gmail.com; a=ed25519; pk=C6E5ODlPQo7ZBynATXH9wg7K6HxP0pIXyf4s38Qw0XE= X-Endpoint-Received: by B4 Relay for jim.cromie@gmail.com/20260203 with auth_id=958 X-Original-From: Jim Cromie Reply-To: jim.cromie@gmail.com From: Jim Cromie Remove the DD_CLASS_TYPE_*_NAMES classmap types and code. These 2 classmap types accept class names at the PARAM interface, for example: echo +DRM_UT_CORE,-DRM_UT_KMS > /sys/module/drm/parameters/debug_names The code works, but its only used by test-dynamic-debug, and wasn't asked for by anyone else, so reduce LOC & test-surface; simplify things. Also rename enum class_map_type to enum ddebug_class_map_type. Signed-off-by: Jim Cromie Reviewed-by: Louis Chauvet --- v3: fix name of enum in kdoc also change name of struct (to future name) v2: move RvB after SoB respect const instr in param_set_dyndbg_module_classes, return -EINVAL on c= lasstype err. --- include/linux/dynamic_debug.h | 28 ++++--------- lib/dynamic_debug.c | 98 +++------------------------------------= ---- lib/test_dynamic_debug.c | 26 ------------ 3 files changed, 15 insertions(+), 137 deletions(-) diff --git a/include/linux/dynamic_debug.h b/include/linux/dynamic_debug.h index a10adac8e8f0..9607121c3072 100644 --- a/include/linux/dynamic_debug.h +++ b/include/linux/dynamic_debug.h @@ -59,27 +59,17 @@ struct _ddebug { #endif } __attribute__((aligned(8))); =20 -enum class_map_type { +enum ddebug_class_map_type { DD_CLASS_TYPE_DISJOINT_BITS, /** - * DD_CLASS_TYPE_DISJOINT_BITS: classes are independent, one per bit. - * expecting hex input. Built for drm.debug, basis for other types. + * DD_CLASS_TYPE_DISJOINT_BITS: classes are independent, + * mapped to bits[0..N]. Expects hex input. Built for + * drm.debug, basis for other types. */ DD_CLASS_TYPE_LEVEL_NUM, /** - * DD_CLASS_TYPE_LEVEL_NUM: input is numeric level, 0-N. - * N turns on just bits N-1 .. 0, so N=3D0 turns all bits off. - */ - DD_CLASS_TYPE_DISJOINT_NAMES, - /** - * DD_CLASS_TYPE_DISJOINT_NAMES: input is a CSV of [+-]CLASS_NAMES, - * classes are independent, like _DISJOINT_BITS. - */ - DD_CLASS_TYPE_LEVEL_NAMES, - /** - * DD_CLASS_TYPE_LEVEL_NAMES: input is a CSV of [+-]CLASS_NAMES, - * intended for names like: INFO,DEBUG,TRACE, with a module prefix - * avoid EMERG,ALERT,CRIT,ERR,WARNING: they're not debug + * DD_CLASS_TYPE_LEVEL_NUM: input is numeric level, 0..N. + * Input N turns on bits 0..N-1 */ }; =20 @@ -90,7 +80,7 @@ struct ddebug_class_map { const char **class_names; const int length; const int base; /* index of 1st .class_id, allows split/shared space */ - enum class_map_type map_type; + enum ddebug_class_map_type map_type; }; =20 /* encapsulate linker provided built-in (or module) dyndbg data */ @@ -119,8 +109,8 @@ struct ddebug_class_param { =20 /** * 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 + * @_var: a struct _ddebug_class_map, passed to module_param_cb + * @_maptype: enum ddebug_class_map_type, chooses bits/verbose * @_base: offset of 1st class-name. splits .class_id space * @classes: class-names used to control class'd prdbgs */ diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c index 2269166763cc..b4617c57dcec 100644 --- a/lib/dynamic_debug.c +++ b/lib/dynamic_debug.c @@ -654,76 +654,6 @@ static int ddebug_apply_class_bitmap(const struct ddeb= ug_class_param *dcp, =20 #define CLASSMAP_BITMASK(width) ((1UL << (width)) - 1) =20 -/* accept comma-separated-list of [+-] classnames */ -static int param_set_dyndbg_classnames(const char *instr, const struct ker= nel_param *kp) -{ - const struct ddebug_class_param *dcp =3D kp->arg; - const struct ddebug_class_map *map =3D dcp->map; - unsigned long curr_bits, old_bits; - char *cl_str, *p, *tmp; - int cls_id, totct =3D 0; - bool wanted; - - cl_str =3D tmp =3D kstrdup_and_replace(instr, '\n', '\0', GFP_KERNEL); - if (!tmp) - return -ENOMEM; - - /* start with previously set state-bits, then modify */ - curr_bits =3D old_bits =3D *dcp->bits; - vpr_info("\"%s\" > %s:0x%lx\n", cl_str, KP_NAME(kp), curr_bits); - - for (; cl_str; cl_str =3D p) { - p =3D strchr(cl_str, ','); - if (p) - *p++ =3D '\0'; - - if (*cl_str =3D=3D '-') { - wanted =3D false; - cl_str++; - } else { - wanted =3D true; - if (*cl_str =3D=3D '+') - cl_str++; - } - cls_id =3D match_string(map->class_names, map->length, cl_str); - if (cls_id < 0) { - pr_err("%s unknown to %s\n", cl_str, KP_NAME(kp)); - continue; - } - - /* have one or more valid class_ids of one *_NAMES type */ - switch (map->map_type) { - case DD_CLASS_TYPE_DISJOINT_NAMES: - /* the +/- pertains to a single bit */ - if (test_bit(cls_id, &curr_bits) =3D=3D wanted) { - v3pr_info("no change on %s\n", cl_str); - continue; - } - curr_bits ^=3D BIT(cls_id); - totct +=3D ddebug_apply_class_bitmap(dcp, &curr_bits, dcp->bits); - *dcp->bits =3D curr_bits; - v2pr_info("%s: changed bit %d:%s\n", KP_NAME(kp), cls_id, - map->class_names[cls_id]); - break; - case DD_CLASS_TYPE_LEVEL_NAMES: - /* cls_id =3D N in 0..max. wanted +/- determines N or N-1 */ - old_bits =3D CLASSMAP_BITMASK(*dcp->lvl); - curr_bits =3D CLASSMAP_BITMASK(cls_id + (wanted ? 1 : 0 )); - - totct +=3D ddebug_apply_class_bitmap(dcp, &curr_bits, &old_bits); - *dcp->lvl =3D (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); - break; - default: - pr_err("illegal map-type value %d\n", map->map_type); - } - } - kfree(tmp); - vpr_info("total matches: %d\n", totct); - return 0; -} - /** * param_set_dyndbg_classes - class FOO >control * @instr: string echo>d to sysfs, input depends on map_type @@ -742,28 +672,15 @@ int param_set_dyndbg_classes(const char *instr, const= struct kernel_param *kp) unsigned long inrep, new_bits, old_bits; int rc, totct =3D 0; =20 - switch (map->map_type) { - - case DD_CLASS_TYPE_DISJOINT_NAMES: - case DD_CLASS_TYPE_LEVEL_NAMES: - /* handle [+-]classnames list separately, we are done here */ - return param_set_dyndbg_classnames(instr, kp); + rc =3D kstrtoul(instr, 0, &inrep); + if (rc) { + int len =3D strcspn(instr, "\n"); =20 - case DD_CLASS_TYPE_DISJOINT_BITS: - case DD_CLASS_TYPE_LEVEL_NUM: - /* numeric input, accept and fall-thru */ - rc =3D kstrtoul(instr, 0, &inrep); - if (rc) { - pr_err("expecting numeric input: %s > %s\n", instr, KP_NAME(kp)); - return -EINVAL; - } - break; - default: - pr_err("%s: bad map type: %d\n", KP_NAME(kp), map->map_type); + pr_err("expecting numeric input, not: %.*s > %s\n", + len, instr, KP_NAME(kp)); return -EINVAL; } =20 - /* only _BITS,_NUM (numeric) map-types get here */ switch (map->map_type) { case DD_CLASS_TYPE_DISJOINT_BITS: /* expect bits. mask and warn if too many */ @@ -791,6 +708,7 @@ int param_set_dyndbg_classes(const char *instr, const s= truct kernel_param *kp) break; default: pr_warn("%s: bad map type: %d\n", KP_NAME(kp), map->map_type); + return -EINVAL; } vpr_info("%s: total matches: %d\n", KP_NAME(kp), totct); return 0; @@ -812,12 +730,8 @@ int param_get_dyndbg_classes(char *buffer, const struc= t kernel_param *kp) const struct ddebug_class_map *map =3D dcp->map; =20 switch (map->map_type) { - - case DD_CLASS_TYPE_DISJOINT_NAMES: case DD_CLASS_TYPE_DISJOINT_BITS: return scnprintf(buffer, PAGE_SIZE, "0x%lx\n", *dcp->bits); - - case DD_CLASS_TYPE_LEVEL_NAMES: case DD_CLASS_TYPE_LEVEL_NUM: return scnprintf(buffer, PAGE_SIZE, "%d\n", *dcp->lvl); default: diff --git a/lib/test_dynamic_debug.c b/lib/test_dynamic_debug.c index 77c2a669b6af..74d183ebf3e0 100644 --- a/lib/test_dynamic_debug.c +++ b/lib/test_dynamic_debug.c @@ -74,13 +74,6 @@ DECLARE_DYNDBG_CLASSMAP(map_disjoint_bits, DD_CLASS_TYPE= _DISJOINT_BITS, 0, DD_SYS_WRAP(disjoint_bits, p); DD_SYS_WRAP(disjoint_bits, T); =20 -/* symbolic input, independent bits */ -enum cat_disjoint_names { LOW =3D 11, MID, HI }; -DECLARE_DYNDBG_CLASSMAP(map_disjoint_names, DD_CLASS_TYPE_DISJOINT_NAMES, = 10, - "LOW", "MID", "HI"); -DD_SYS_WRAP(disjoint_names, p); -DD_SYS_WRAP(disjoint_names, T); - /* numeric verbosity, V2 > V1 related */ enum cat_level_num { V0 =3D 14, V1, V2, V3, V4, V5, V6, V7 }; DECLARE_DYNDBG_CLASSMAP(map_level_num, DD_CLASS_TYPE_LEVEL_NUM, 14, @@ -88,13 +81,6 @@ DECLARE_DYNDBG_CLASSMAP(map_level_num, DD_CLASS_TYPE_LEV= EL_NUM, 14, DD_SYS_WRAP(level_num, p); DD_SYS_WRAP(level_num, T); =20 -/* symbolic verbosity */ -enum cat_level_names { L0 =3D 22, L1, L2, L3, L4, L5, L6, L7 }; -DECLARE_DYNDBG_CLASSMAP(map_level_names, DD_CLASS_TYPE_LEVEL_NAMES, 22, - "L0", "L1", "L2", "L3", "L4", "L5", "L6", "L7"); -DD_SYS_WRAP(level_names, p); -DD_SYS_WRAP(level_names, T); - /* stand-in for all pr_debug etc */ #define prdbg(SYM) __pr_debug_cls(SYM, #SYM " msg\n") =20 @@ -102,10 +88,6 @@ static void do_cats(void) { pr_debug("doing categories\n"); =20 - prdbg(LOW); - prdbg(MID); - prdbg(HI); - prdbg(D2_CORE); prdbg(D2_DRIVER); prdbg(D2_KMS); @@ -129,14 +111,6 @@ static void do_levels(void) prdbg(V5); prdbg(V6); prdbg(V7); - - prdbg(L1); - prdbg(L2); - prdbg(L3); - prdbg(L4); - prdbg(L5); - prdbg(L6); - prdbg(L7); } =20 static void do_prints(void) --=20 2.55.0 From nobody Fri Sep 25 04:43:44 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 97EDC533587; Wed, 16 Sep 2026 15:33:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789572783; cv=none; b=av2yOqQ0zA4laecbcHXpiShO6zym6ebdvzaC+N9BAaaoUoYHVZac8T7o104l9scSc7guf9irQHKYSjg91SR3lEA/RJpiXN+vHz8iVgb7cSsoklidjW3/57j/cdRXGbHwQUARfFQ50NRbThOEIIx34CF0ChAbY8ZzwBbH+6JKBYE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789572783; c=relaxed/simple; bh=pv9RuonqNYo3AzOvwPP3dOHmyzUbuqx9/doej0kXmOg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=b5NnTvxiJuVvKyA0G22drJR6o+kgLrBi2Z1u6YYOiMxDCoftwmyF7kI/6EN8+6NxjV53a+tYE+B9ul1S2RAIIO5sv7/EhvTOhPlB2O57qwBZuMuOHP6u2gqPgXPDAL7cgUyI3dC2kvfZGrpiE7q/3Shkw4Zv2MKpr5LWHmq4xuM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=ChUPmIGK; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="ChUPmIGK" Received: by smtp.kernel.org (Postfix) with ESMTPS id 93EF1C2BCFD; Wed, 16 Sep 2026 15:33:00 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1789572780; bh=pv9RuonqNYo3AzOvwPP3dOHmyzUbuqx9/doej0kXmOg=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=ChUPmIGKVomfPOVwkZfin5dy6QLWIZR7l9jUG8DoUL7dN6hxcPDKGcoJAm0PDYuUV jdAQDasXQx7vCSrh7xUNAnW0CrvyJGmDx1//urZGMtK71cCGshtGXZx+UPc0y7Pawz KgtwF/M4r/TFHlOa2hZ5PfGeWVtYXGKw3S2dT3hyoOT+XpCRS84NCMqGYenKTZqDtS KbFKhFkh/zIT/U1beBYel937enV64GzMx8FlLNO70UyRCsZEN3rq0zm+Bk9es4zLYx VaFfOT3Hnpbj8QQtHNdCa4rTkJFiTIrX5jx4omVDAZj14RFStge19QlEzqQdXhWlRa Ud9/hvfruDCLQ== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 7F8C1C982CA; Wed, 16 Sep 2026 15:33:00 +0000 (UTC) From: Jim Cromie via B4 Relay Date: Wed, 16 Sep 2026 09:33:03 -0600 Subject: [PATCH v10 11/38] dyndbg: drop NUM_TYPE_ARGS Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260916-dd-cmap-part2-clean-v10-11-af4cf4767707@gmail.com> References: <20260916-dd-cmap-part2-clean-v10-0-af4cf4767707@gmail.com> In-Reply-To: <20260916-dd-cmap-part2-clean-v10-0-af4cf4767707@gmail.com> To: Jason Baron , Shuah Khan , Andrew Morton , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Arnd Bergmann , Luis Chamberlain , Petr Pavlu , Daniel Gomez , Sami Tolvanen , Aaron Tomlin , Jonathan Corbet , Greg Kroah-Hartman , Nathan Chancellor , Nicolas Schier , Shuah Khan , Randy Dunlap , "Rafael J. Wysocki" , Pavel Machek , Len Brown Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-arch@vger.kernel.org, linux-modules@vger.kernel.org, linux-doc@vger.kernel.org, linux-kbuild@vger.kernel.org, linux-pm@vger.kernel.org, Jim Cromie , Louis Chauvet X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789572777; l=1542; i=jim.cromie@gmail.com; s=20260203; h=from:subject:message-id; bh=xMZm/oO0FtfekjkxZIUS9OIoDKqTmliEkK4gwpH/mIw=; b=QAdmd7OnyByqB+vshsCQgOUhwUJReQUtQy5E0MMQNfuys3qoOjW8MKWrkHPL69EPT7LGBl0fe 7iCE7S/LKwgA7ttanS2UZzPl7Ln06Kohe6CyF0zRKvADbWiyKk6reIZ X-Developer-Key: i=jim.cromie@gmail.com; a=ed25519; pk=C6E5ODlPQo7ZBynATXH9wg7K6HxP0pIXyf4s38Qw0XE= X-Endpoint-Received: by B4 Relay for jim.cromie@gmail.com/20260203 with auth_id=958 X-Original-From: Jim Cromie Reply-To: jim.cromie@gmail.com From: Jim Cromie ARRAY_SIZE almost works here, since array decl is complete. But define it locally, named __DDEBUG_ARRAY_SIZE, to avoid include conflicts with boot/ on some arch. no functional change Signed-off-by: Jim Cromie Reviewed-by: Louis Chauvet --- v7: actually use macro v5: drop include, it causes redefined probs in /boot/* for some arch. v2: include linux/array_size.h, correct commit subject, review after sob --- include/linux/dynamic_debug.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/include/linux/dynamic_debug.h b/include/linux/dynamic_debug.h index 9607121c3072..baf5c0853f45 100644 --- a/include/linux/dynamic_debug.h +++ b/include/linux/dynamic_debug.h @@ -8,6 +8,8 @@ =20 #include =20 +#define __DDEBUG_ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0])) + /* * An instance of this structure is created in a special * ELF section at every dynamic debug callsite. At runtime, @@ -122,11 +124,9 @@ struct ddebug_class_param { .mod_name =3D KBUILD_MODNAME, \ .base =3D _base, \ .map_type =3D _maptype, \ - .length =3D NUM_TYPE_ARGS(char*, __VA_ARGS__), \ .class_names =3D _var##_classnames, \ + .length =3D __DDEBUG_ARRAY_SIZE(_var##_classnames), \ } -#define NUM_TYPE_ARGS(eltype, ...) \ - (sizeof((eltype[]) {__VA_ARGS__}) / sizeof(eltype)) =20 extern __printf(2, 3) void __dynamic_pr_debug(struct _ddebug *descriptor, const char *fmt, ...); --=20 2.55.0 From nobody Fri Sep 25 04:43:44 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 97D4F5328DD; Wed, 16 Sep 2026 15:33:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789572783; cv=none; b=LoIgIJJp/ZAXmAC8XOe7zn+h5jlpcdr+Gf+OF6BCkB7R42jhfV7sb5IWi/FK5S08Gc5gMrXAL8IfilopDr+rcrL401Oxu8R57Sk6PHoJzPcOfnQ3UgW0IS11RGhwfem+b5dlplwcmWBuTjKQ5pm8y001fZLl09YSruVpcR7LHyI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789572783; c=relaxed/simple; bh=glf6GvR7NBPCbYbbUUvjVhae1qwaU/+22fD70PopBQA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=c8dn4J4TuxHocOd7hf6nZdYxEcu+PAERoXdOQhrNZwnbuawkjfiRpt7silzbRTm8Y4V41D43BGZvUu0nbA2NhXpFtJGMXmtdC6/BXa/V2B87mTnO+umMaLdQgiL7ETQGMWjgN+WJhZqBYLjk1criuChsiUF3vFY6VrNIvTEgMMU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=PEGFcVRC; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="PEGFcVRC" Received: by smtp.kernel.org (Postfix) with ESMTPS id AAD98C2BD01; Wed, 16 Sep 2026 15:33:00 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1789572780; bh=glf6GvR7NBPCbYbbUUvjVhae1qwaU/+22fD70PopBQA=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=PEGFcVRCM3+v1UNKHx+cnsharKXbNrIsiiO43uqcz1PpqZqU54+gCOXYUOq1h8g2O G0WBhoEzQpGCk5ua98zxxDVO/4bP8StoKemD0inuRbPJ2bda/+61S120aAw5k0yfwX FBIkNH5vI6/vlzVgaOFVbsmGnwgyY2OUV+bZSAGMOzUrus4Om8PKTnB6g7R8mTPzcV 3ytPQZUDZ6H7zgAUfgC1alOgo90wTVlzNxzxKzVcLqNVieizYtbmS0Tb10i4g5amKm pVHxc8mYlBTGaYhNuo4KMc2s7HWESw8gzuUZXHCl+jN6Y7rFZOwaxGz9r7R6mLq7NJ i7dTKCmfcmuKw== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 962F5C982C5; Wed, 16 Sep 2026 15:33:00 +0000 (UTC) From: Jim Cromie via B4 Relay Date: Wed, 16 Sep 2026 09:33:04 -0600 Subject: [PATCH v10 12/38] dyndbg: bump num-tokens in a query-cmd from 9 to 15 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260916-dd-cmap-part2-clean-v10-12-af4cf4767707@gmail.com> References: <20260916-dd-cmap-part2-clean-v10-0-af4cf4767707@gmail.com> In-Reply-To: <20260916-dd-cmap-part2-clean-v10-0-af4cf4767707@gmail.com> To: Jason Baron , Shuah Khan , Andrew Morton , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Arnd Bergmann , Luis Chamberlain , Petr Pavlu , Daniel Gomez , Sami Tolvanen , Aaron Tomlin , Jonathan Corbet , Greg Kroah-Hartman , Nathan Chancellor , Nicolas Schier , Shuah Khan , Randy Dunlap , "Rafael J. Wysocki" , Pavel Machek , Len Brown Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-arch@vger.kernel.org, linux-modules@vger.kernel.org, linux-doc@vger.kernel.org, linux-kbuild@vger.kernel.org, linux-pm@vger.kernel.org, Jim Cromie X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789572777; l=3086; i=jim.cromie@gmail.com; s=20260203; h=from:subject:message-id; bh=ZGemRpU3viZV1yyWNrUvp83bn0nizPoTEiNG6+9byRk=; b=U11SX80pKnjEiP9L+ni/xIVpnJ0qf6b63AUzYMQGC8xqR+eZWUXymkZ+KVoSZ7Fm7lGn3baEP emhNvZv5MzFAtb/0qv/NrLW/ayPRmHZ303QZx0oHngbc9shpedhCENb X-Developer-Key: i=jim.cromie@gmail.com; a=ed25519; pk=C6E5ODlPQo7ZBynATXH9wg7K6HxP0pIXyf4s38Qw0XE= X-Endpoint-Received: by B4 Relay for jim.cromie@gmail.com/20260203 with auth_id=958 X-Original-From: Jim Cromie Reply-To: jim.cromie@gmail.com From: Jim Cromie Current MAXWORDS in ddebug_exec_query() is too small to accept a legal query-command using all 6 keywords. We *need* 13, but this adds a few extra to allow certain errors to fail on subsequent, more meaningful grammar checks. Signed-off-by: Jim Cromie --- lib/dynamic_debug.c | 2 +- tools/testing/selftests/dynamic_debug/dyndbg_selftest.sh | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c index b4617c57dcec..83983b261bf8 100644 --- a/lib/dynamic_debug.c +++ b/lib/dynamic_debug.c @@ -558,7 +558,7 @@ static int ddebug_exec_query(char *query_string, const = char *modname) { struct flag_settings modifiers =3D {}; struct ddebug_query query =3D {}; -#define MAXWORDS 9 +#define MAXWORDS 15 int nwords, nfound; char *words[MAXWORDS]; =20 diff --git a/tools/testing/selftests/dynamic_debug/dyndbg_selftest.sh b/too= ls/testing/selftests/dynamic_debug/dyndbg_selftest.sh index 73c2a4b07bd3..04c1d9254ca9 100755 --- a/tools/testing/selftests/dynamic_debug/dyndbg_selftest.sh +++ b/tools/testing/selftests/dynamic_debug/dyndbg_selftest.sh @@ -326,8 +326,8 @@ function GOLDEN_RECORDS { #K=3D b9a397e807148d13ba07da7db7e69817 FT_grammar_errs.2 #K=3D 5abefa504937a329f974504f1896e368 FT_grammar_errs.3 #K=3D 1d94d0f239bf40bf51280caeab499de0 FT_grammar_errs.4 -#K=3D 135035c8a17ae100cc4ec954c4d75b2f FT_grammar_errs.5 -#K=3D a9cc14244f91a12d3174ad1314144a8e FT_grammar_errs.6 +#K=3D 9a5e1c1856f1ebbe57a4afdfc4c9703a FT_grammar_errs.5 +#K=3D b3809a6f9f643f049f1ef30827d4b001 FT_grammar_errs.6 #K=3D 5d400aad1a7d71f548b6b81274d00a55 FT_grammar_errs.7 #K=3D 61cd359b10f9051862d3745eda07a295 FT_grammar_errs.8 #K=3D 567379f4f4d099f00f37d1469d9370bd FT_grammar_errs.9 @@ -346,8 +346,8 @@ function GOLDEN_RECORDS { #K=3D 1f6fedfe222af475211b3bfc6d08bc63 FT_grammar_errs.22 #K=3D c67dfeca97697b707acdd70672816dff FT_grammar_errs.23 #K=3D 9574dbfdac063409b41a44e6251fbcd9 FT_grammar_errs.24 -#K=3D 644b81753949ac1285e38ac995eeba46 FT_grammar_errs.25 -#K=3D 1bf2a93a39961f40e0c2dd4c5e2edc6d FT_grammar_errs.26 +#K=3D 3c694a0ee2cf3a1d39f2ca8a9f3b9094 FT_grammar_errs.25 +#K=3D c23be05426c8727be833ff055944aa96 FT_grammar_errs.26 #K=3D cdddf4ffd7fde3c12eb0c73770b872bf FT_grammar_errs.27 #K=3D cdf7a2e2740ec007efbd29feda478420 FT_grammar_errs.28 #K=3D f6650d69963cef433c50e1f2acb899fc FT_grammar_errs.29 @@ -366,8 +366,8 @@ function GOLDEN_RECORDS { #K=3D 1a402ada248d0d50cec13a1af150ea33 FT_grammar_errs.42 #K=3D 5b46a8eb0d74009462f74cf7553e3228 FT_grammar_errs.43 #K=3D 546e440044828d86135dd63f1eb9ed17 FT_grammar_errs.44 -#K=3D 644b81753949ac1285e38ac995eeba46 FT_grammar_errs.45 -#K=3D 1bf2a93a39961f40e0c2dd4c5e2edc6d FT_grammar_errs.46 +#K=3D 3c694a0ee2cf3a1d39f2ca8a9f3b9094 FT_grammar_errs.45 +#K=3D 37b7ab754e579683a28ce086c470cdc9 FT_grammar_errs.46 #K=3D 3e3acfb800cfb1bcb0cc07f33b75830a FT_grammar_errs.47 #K=3D 42dc6cb4fe938bb82b64c82924ef28d8 FT_grammar_errs.48 #K=3D cf9320d2188f5b48d508d610d95298b2 FT_grammar_errs.49 --=20 2.55.0 From nobody Fri Sep 25 04:43:44 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9A349533596; Wed, 16 Sep 2026 15:33:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789572783; cv=none; b=nIp3+QOz9LRLPbS9LMh+dMBzAbu8xhI0LpWRU0aOOSc9YZC1J1RY+Hp7GCzlgcEzoE5OhufqZTX3JaG/K5myAC24x2ZZHZC/GzcXYc+sJKmp0hPo588kLzOt19Cgrmyxxm62Iw242qy2YYDrJSCECq/U32KgQ88p3k4CjjrW0IA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789572783; c=relaxed/simple; bh=ENkD5UoeCXHwYzzogxvyhtgUFl88lmKV7Dk79EW3LMs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Bz0CI9iboDl3KBg8az28s0BsXJt2+gpjXJOQkVB62DFGc8tLeVpdvGDwX0uJy/f+4ZKC62BE+bbcsUWZ0v4BPhrfrBD6hYgGzDrDP6pVDVp9V+TLO2fbs1rfG21ef5Shy381DtzfglyHfxPUXeHRJXJRxRkoe07Vph4353DNJIA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=TDnde0kP; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="TDnde0kP" Received: by smtp.kernel.org (Postfix) with ESMTPS id C2850C2BD00; Wed, 16 Sep 2026 15:33:00 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1789572780; bh=ENkD5UoeCXHwYzzogxvyhtgUFl88lmKV7Dk79EW3LMs=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=TDnde0kPt32qeh8PTuWUiaEzM1Hqnyv5hG3/yl8I/yTHN6CO3W/4aS2VAXoprb7ae 3k5Zcpnr+czmNJbueo1FuBq6xXfdmpz1Gok4vGsI7NNX629Z4VUe+8QN42nLZybqPq iHzQqKEPxDBMRm2a2ZHfmEO1Ot/IKY5vx75s8PZUlbbdtGVZOWimZhraZXvkseARDD qBzSopheUmg8xMKumtopGjKxAVpkdIgBwFjV629xF+GgGTEnf+Z0L23JjvKfZpQrwP fTbRjY8dsBffJv6Nfw4oBSIBgjsc0MuF6vFVKYee0225P0KLY7Fjc8+6IJucHqGWf0 f9A78NFuLiwSg== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id ACD5AC982C9; Wed, 16 Sep 2026 15:33:00 +0000 (UTC) From: Jim Cromie via B4 Relay Date: Wed, 16 Sep 2026 09:33:05 -0600 Subject: [PATCH v10 13/38] dyndbg: reduce verbose/debug clutter Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260916-dd-cmap-part2-clean-v10-13-af4cf4767707@gmail.com> References: <20260916-dd-cmap-part2-clean-v10-0-af4cf4767707@gmail.com> In-Reply-To: <20260916-dd-cmap-part2-clean-v10-0-af4cf4767707@gmail.com> To: Jason Baron , Shuah Khan , Andrew Morton , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Arnd Bergmann , Luis Chamberlain , Petr Pavlu , Daniel Gomez , Sami Tolvanen , Aaron Tomlin , Jonathan Corbet , Greg Kroah-Hartman , Nathan Chancellor , Nicolas Schier , Shuah Khan , Randy Dunlap , "Rafael J. Wysocki" , Pavel Machek , Len Brown Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-arch@vger.kernel.org, linux-modules@vger.kernel.org, linux-doc@vger.kernel.org, linux-kbuild@vger.kernel.org, linux-pm@vger.kernel.org, Jim Cromie , Louis Chauvet X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789572777; l=12932; i=jim.cromie@gmail.com; s=20260203; h=from:subject:message-id; bh=cn289Vv5vBG6H4LI9zm5c2S/wvfFrR5HNFwuhQU/epI=; b=s1T2H/B5da2j5TLClhnqlJJmqjhNolRdhYs638k/bWG8BQhJiXU0UcXV/Lvj0sa78ANmwduz1 XJmg+EashMDDURxgV3rzyicX2Y6aOgQ94sAnL6acSlEItOjDV64b7+U X-Developer-Key: i=jim.cromie@gmail.com; a=ed25519; pk=C6E5ODlPQo7ZBynATXH9wg7K6HxP0pIXyf4s38Qw0XE= X-Endpoint-Received: by B4 Relay for jim.cromie@gmail.com/20260203 with auth_id=958 X-Original-From: Jim Cromie Reply-To: jim.cromie@gmail.com From: Jim Cromie currently, for verbose=3D3, 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=3D'+' dyndbg: flags=3D0x1 dyndbg: *flagsp=3D0x1 *maskp=3D0xffffffff dyndbg: parsed: func=3D"" file=3D"" module=3D"" format=3D"" lineno=3D0-0 c= lass=3D... dyndbg: no matches for query dyndbg: no-match: func=3D"" file=3D"" module=3D"" format=3D"" lineno=3D0-0= class=3D... 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" dyndbg: split into words: "class" "DRM_UT_CORE" "+p" dyndbg: op=3D'+' flags=3D0x1 maskp=3D0xffffffff dyndbg: processed 1 queries, with 0 matches, 0 errs Also drop several verbose=3D3 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. Unmatched query diagnostics are intentionally restricted to verbose level 3 (v3pr_info_dq) to reduce dmesg output clutter on standard verbose levels (verbose=3D1 and verbose=3D2), aligning with the overall de-cluttering of dynamic debug logging. Signed-off-by: Jim Cromie Reviewed-by: Louis Chauvet --- v7: update fingerprints of grammar-errs changed here v4: rename vpr_dq_info to v3pr_dq_info to tell its active logging level adjust some vX levels per doc'd intentions v2: RvB after SoB trivial change to verbose-debug output line to output the actual "module" keyword rather than "mod:", and do so only when the module is constrained by the callchain (ie as part of a modprobe). was: query X: "(keyword value)* [+-=3D]flags" mod:* now: query X: "(keyword value)* [+-=3D]flags" or query X: module FOO "keyword value)* [+-=3D]flags" IOW, adjust output to reflect the input grammar more closely. --- lib/dynamic_debug.c | 24 ++--- .../selftests/dynamic_debug/dyndbg_selftest.sh | 120 ++++++++++-------= ---- 2 files changed, 70 insertions(+), 74 deletions(-) diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c index 83983b261bf8..ca8e3cea504c 100644 --- a/lib/dynamic_debug.c +++ b/lib/dynamic_debug.c @@ -128,7 +128,7 @@ do { \ #define v3pr_info(fmt, ...) vnpr_info(3, fmt, ##__VA_ARGS__) #define v4pr_info(fmt, ...) vnpr_info(4, fmt, ##__VA_ARGS__) =20 -static void vpr_info_dq(const struct ddebug_query *query, const char *msg) +static void v3pr_info_dq(const struct ddebug_query *query, const char *msg) { /* trim any trailing newlines */ int fmtlen =3D 0; @@ -284,9 +284,6 @@ static int ddebug_change(const struct ddebug_query *que= ry, } mutex_unlock(&ddebug_lock); =20 - if (!nfound && verbose) - pr_info("no matches for query\n"); - return nfound; } =20 @@ -495,7 +492,6 @@ static int ddebug_parse_query(char *words[], int nwords, */ query->module =3D modname; =20 - vpr_info_dq(query, "parsed"); return 0; } =20 @@ -519,7 +515,6 @@ static int ddebug_parse_flags(const char *str, struct f= lag_settings *modifiers) pr_err("bad flag-op %c, at start of %s\n", *str, str); return -EINVAL; } - v3pr_info("op=3D'%c'\n", op); =20 for (; *str ; ++str) { for (i =3D ARRAY_SIZE(opt_array) - 1; i >=3D 0; i--) { @@ -533,7 +528,6 @@ static int ddebug_parse_flags(const char *str, struct f= lag_settings *modifiers) return -EINVAL; } } - v3pr_info("flags=3D0x%x\n", modifiers->flags); =20 /* calculate final flags, mask based upon op */ switch (op) { @@ -549,7 +543,7 @@ static int ddebug_parse_flags(const char *str, struct f= lag_settings *modifiers) modifiers->flags =3D 0; break; } - v3pr_info("*flagsp=3D0x%x *maskp=3D0x%x\n", modifiers->flags, modifiers->= mask); + v3pr_info("op=3D'%c' flags=3D0x%x maskp=3D0x%x\n", op, modifiers->flags, = modifiers->mask); =20 return 0; } @@ -578,7 +572,7 @@ static int ddebug_exec_query(char *query_string, const = char *modname) } /* actually go and implement the change */ nfound =3D ddebug_change(&query, &modifiers); - vpr_info_dq(&query, nfound ? "applied" : "no-match"); + v3pr_info_dq(&query, nfound ? "applied" : "no-match"); =20 return nfound; } @@ -601,7 +595,10 @@ static int ddebug_exec_queries(char *query, const char= *modname) if (!query || !*query || *query =3D=3D '#') continue; =20 - vpr_info("query %d: \"%s\" mod:%s\n", i, query, modname ?: "*"); + if (modname) + v2pr_info("query %d: module %s \"%s\"\n", i, modname, query); + else + v2pr_info("query %d: \"%s\"\n", i, query); =20 rc =3D ddebug_exec_query(query, modname); if (rc < 0) { @@ -1168,11 +1165,10 @@ static int ddebug_add_module(struct _ddebug_info *d= i, const char *modname) { struct ddebug_table *dt; =20 - 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); =20 dt =3D kzalloc_obj(*dt); if (dt =3D=3D NULL) { diff --git a/tools/testing/selftests/dynamic_debug/dyndbg_selftest.sh b/too= ls/testing/selftests/dynamic_debug/dyndbg_selftest.sh index 04c1d9254ca9..972f12c70a8e 100755 --- a/tools/testing/selftests/dynamic_debug/dyndbg_selftest.sh +++ b/tools/testing/selftests/dynamic_debug/dyndbg_selftest.sh @@ -322,66 +322,66 @@ modular_tests=3D( # =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D function GOLDEN_RECORDS { cat << 'EOF' | { -#K=3D b938440930e5f1297d524e6c0c1ec85c FT_grammar_errs.1 -#K=3D b9a397e807148d13ba07da7db7e69817 FT_grammar_errs.2 -#K=3D 5abefa504937a329f974504f1896e368 FT_grammar_errs.3 -#K=3D 1d94d0f239bf40bf51280caeab499de0 FT_grammar_errs.4 -#K=3D 9a5e1c1856f1ebbe57a4afdfc4c9703a FT_grammar_errs.5 -#K=3D b3809a6f9f643f049f1ef30827d4b001 FT_grammar_errs.6 -#K=3D 5d400aad1a7d71f548b6b81274d00a55 FT_grammar_errs.7 -#K=3D 61cd359b10f9051862d3745eda07a295 FT_grammar_errs.8 -#K=3D 567379f4f4d099f00f37d1469d9370bd FT_grammar_errs.9 -#K=3D 31a026d10f85e8f4c9f8cf3e1cef3c61 FT_grammar_errs.10 -#K=3D ba62952b671a553d4b14e344a61926f7 FT_grammar_errs.11 -#K=3D 49aec6c2e99cc70a1e4137f86e94f6f4 FT_grammar_errs.12 -#K=3D cc02cccf15988a98dfd5b1df1e492e31 FT_grammar_errs.13 -#K=3D 2bbf3fac2b77b88b6cebe459ff9631d3 FT_grammar_errs.14 -#K=3D 93b67411c254875a6bae5c01c0239729 FT_grammar_errs.15 -#K=3D b22f2efe54a1637156b9521b2794806e FT_grammar_errs.16 -#K=3D de410dba40d8b097524f91da8ae2b1c5 FT_grammar_errs.17 -#K=3D 6c922048c21f6198720dfd68ae16fdad FT_grammar_errs.18 -#K=3D 4ddd57e9cbc3da2613ac59eb285ad8c1 FT_grammar_errs.19 -#K=3D ba65062f6be00a1d04907dd176d26c19 FT_grammar_errs.20 -#K=3D 94cdf3b32afa4f12a00a704208aa2e53 FT_grammar_errs.21 -#K=3D 1f6fedfe222af475211b3bfc6d08bc63 FT_grammar_errs.22 -#K=3D c67dfeca97697b707acdd70672816dff FT_grammar_errs.23 -#K=3D 9574dbfdac063409b41a44e6251fbcd9 FT_grammar_errs.24 -#K=3D 3c694a0ee2cf3a1d39f2ca8a9f3b9094 FT_grammar_errs.25 -#K=3D c23be05426c8727be833ff055944aa96 FT_grammar_errs.26 -#K=3D cdddf4ffd7fde3c12eb0c73770b872bf FT_grammar_errs.27 -#K=3D cdf7a2e2740ec007efbd29feda478420 FT_grammar_errs.28 -#K=3D f6650d69963cef433c50e1f2acb899fc FT_grammar_errs.29 -#K=3D e150a96693eb561a20eebebfd637e667 FT_grammar_errs.30 -#K=3D b63514cf73a93962311d098284d7b491 FT_grammar_errs.31 -#K=3D b253cde723889c42d2c944c1b14f5a45 FT_grammar_errs.32 -#K=3D 7ad3dfb73e82f4d75b0770179e6dc264 FT_grammar_errs.33 -#K=3D f4d905e4f72dbd535bb80d7fe9df84b0 FT_grammar_errs.34 -#K=3D 5bf50b198d8e5fe300541adfce92e073 FT_grammar_errs.35 -#K=3D 7c4d73d42cff377cd84a7683b0c3e0b9 FT_grammar_errs.36 -#K=3D 19f1aa8d33d71888be74b19a3143938f FT_grammar_errs.37 -#K=3D 84309c1322631ae74ecf2c729b6aa210 FT_grammar_errs.38 -#K=3D 8cfe48871f91a90e6eaaef9123892394 FT_grammar_errs.39 -#K=3D 8aaa5fdd50ead5cd429fbba4123b215c FT_grammar_errs.40 -#K=3D 94cdf3b32afa4f12a00a704208aa2e53 FT_grammar_errs.41 -#K=3D 1a402ada248d0d50cec13a1af150ea33 FT_grammar_errs.42 -#K=3D 5b46a8eb0d74009462f74cf7553e3228 FT_grammar_errs.43 -#K=3D 546e440044828d86135dd63f1eb9ed17 FT_grammar_errs.44 -#K=3D 3c694a0ee2cf3a1d39f2ca8a9f3b9094 FT_grammar_errs.45 -#K=3D 37b7ab754e579683a28ce086c470cdc9 FT_grammar_errs.46 -#K=3D 3e3acfb800cfb1bcb0cc07f33b75830a FT_grammar_errs.47 -#K=3D 42dc6cb4fe938bb82b64c82924ef28d8 FT_grammar_errs.48 -#K=3D cf9320d2188f5b48d508d610d95298b2 FT_grammar_errs.49 -#K=3D 1f33fb1fd2365e77c3cfbd61d1ae2a7c FT_grammar_errs.50 -#K=3D 67588c71f92f319c6224d5917456ecd2 FT_grammar_errs.51 -#K=3D 22e7795f7dbeb6dc2fce5e113312781c FT_grammar_errs.52 -#K=3D 66d253407728c1f8a850519eadd66880 FT_grammar_errs.53 -#K=3D 27e8345aaeed85c1de5516871e0bbd0c FT_grammar_errs.54 -#K=3D 43cc8a154f28f1a668ab409a1af4e77a FT_grammar_errs.55 -#K=3D eda21551fcdd76ef2f192e1d9950a05f FT_grammar_errs.56 -#K=3D 0a8a986b5610630cb75c0568deff8315 FT_grammar_errs.57 -#K=3D 29bfae73351c3157a5fe409febcef276 FT_grammar_errs.58 -#K=3D 73a9e53428d1fb1a9813e3eab7d0ea18 FT_grammar_errs.59 -#K=3D 800951095b297532e25785ab101a2ba9 FT_grammar_errs.60 +#K=3D 26fd1565f209b383d9f2fbf0b54cd5fc FT_grammar_errs.1 +#K=3D 200c01632c52a63f6d186da1c6460740 FT_grammar_errs.2 +#K=3D 7d7141900ce6e32f15c99202309c63a4 FT_grammar_errs.3 +#K=3D 1bb798a5831d0119789d424ef6cb55c4 FT_grammar_errs.4 +#K=3D 5edd66e308b2792d5694df86c07a3eaf FT_grammar_errs.5 +#K=3D 6f87d92ffe0812550f43287127c6f2b9 FT_grammar_errs.6 +#K=3D c0eb05b58a008c722e091e1ae74440ec FT_grammar_errs.7 +#K=3D 911929ec0e2ffc1f13822b479dec6805 FT_grammar_errs.8 +#K=3D 1ac52ce8ba553ec23eb70faa3ffa1197 FT_grammar_errs.9 +#K=3D c1407512376369d2e591a4b25a4b607a FT_grammar_errs.10 +#K=3D ea94add1d76d17dbb69c1b86f3aa42b2 FT_grammar_errs.11 +#K=3D 2046abda72725ea06fe339d5f364f1c9 FT_grammar_errs.12 +#K=3D b72f7fccf76f8a5bee47a05d7bb545fb FT_grammar_errs.13 +#K=3D 98e2bd3e4f3da58536496a38ec3e6238 FT_grammar_errs.14 +#K=3D b371c6ba52503d037dbc43da788af8be FT_grammar_errs.15 +#K=3D cb8288d607b0c5282125852f3ab05107 FT_grammar_errs.16 +#K=3D c2a8d0401e4cf85ccebedf61c5d0ff4b FT_grammar_errs.17 +#K=3D cb8288d607b0c5282125852f3ab05107 FT_grammar_errs.18 +#K=3D b371c6ba52503d037dbc43da788af8be FT_grammar_errs.19 +#K=3D 98e2bd3e4f3da58536496a38ec3e6238 FT_grammar_errs.20 +#K=3D 02b210b2646aceb68f3d6d2876a3d57a FT_grammar_errs.21 +#K=3D 51030cd01ed601a68dd48356902954b1 FT_grammar_errs.22 +#K=3D af8818de076407d4e7f4e384ba110ac5 FT_grammar_errs.23 +#K=3D 023ba04ffced833b4776fb4fcaae7755 FT_grammar_errs.24 +#K=3D 0a082bb9d50f9a6257c3be5938758150 FT_grammar_errs.25 +#K=3D 3b956344b2338de9dd0625391b41ed35 FT_grammar_errs.26 +#K=3D 97779a5b22bb43912268caca0dc391d8 FT_grammar_errs.27 +#K=3D c02a669a8b76e15f0dcced9c4aacc5da FT_grammar_errs.28 +#K=3D 89822eac51e11b55c50c4e72a1203452 FT_grammar_errs.29 +#K=3D 56a65b28955c743f18001d1b423356fb FT_grammar_errs.30 +#K=3D ff1186fdf1ffe20c89fe38db596e75c2 FT_grammar_errs.31 +#K=3D 10945c0e8920342903ffeeb0d601babd FT_grammar_errs.32 +#K=3D 6a333eb2cfbb2c347b8fdfb06a979aa9 FT_grammar_errs.33 +#K=3D 55dba10e65775dfd1e229ddf0eb2608e FT_grammar_errs.34 +#K=3D dfa3b6908ea9f4b23005925d95dedd8e FT_grammar_errs.35 +#K=3D 3cfcc96931e76ce6396da3e27c61a6ef FT_grammar_errs.36 +#K=3D 04e37fe069eed91515c6a24301378548 FT_grammar_errs.37 +#K=3D 130bf64b92a5e34d1c4cce98899084e1 FT_grammar_errs.38 +#K=3D 9681a05658f1a50e3434aa991b5ce992 FT_grammar_errs.39 +#K=3D 38506317363a188fbb7a417ff50457a9 FT_grammar_errs.40 +#K=3D 02b210b2646aceb68f3d6d2876a3d57a FT_grammar_errs.41 +#K=3D 8c08a8b5cacbf885d022360ed856e7a1 FT_grammar_errs.42 +#K=3D f0f4d894a49bd2c1856cf4f013f83e54 FT_grammar_errs.43 +#K=3D 25b92d52cb299fa8d84c5584e490bd97 FT_grammar_errs.44 +#K=3D 0a082bb9d50f9a6257c3be5938758150 FT_grammar_errs.45 +#K=3D 2a41940f70efa80e39cb3356931e49af FT_grammar_errs.46 +#K=3D a3cbfcf5e452fb11994fdf41254c6775 FT_grammar_errs.47 +#K=3D d47387d5885927ac4d33f0675a721963 FT_grammar_errs.48 +#K=3D 37d2984315284521b084e62feb889527 FT_grammar_errs.49 +#K=3D 99b7d60f3afb7ab9fb8e14340c30df02 FT_grammar_errs.50 +#K=3D a16f404c515c40418f43ea1d4d8e6a7b FT_grammar_errs.51 +#K=3D 424841345d03bcfad704e9cdfce29794 FT_grammar_errs.52 +#K=3D de2bf9687e8374f566db45d45274c313 FT_grammar_errs.53 +#K=3D 6d923562c9fc7aaf1ac1c393aa7b55f9 FT_grammar_errs.54 +#K=3D 704bfc82d4cf8fee52552d33bacfc7df FT_grammar_errs.55 +#K=3D 426bf966b975ade7ec8c6ccf40463583 FT_grammar_errs.56 +#K=3D 59a11ff06013a43e7bb6a21f8f55e7b7 FT_grammar_errs.57 +#K=3D d6fde9bf3500a509fbd9cbf69fedb04f FT_grammar_errs.58 +#K=3D c6a1064235d93bc17a623216b3817cb8 FT_grammar_errs.59 +#K=3D 4042bdb2ea75ed254c429324b20c82b8 FT_grammar_errs.60 #K=3D 6e8599556a312200fb6d484565b6c52f FT_basic_queries.1 #K=3D db17180b59444e5e34a8fc20c40e4530 FT_basic_queries.2 #K=3D f7bd56bd407ff255ef2e3b5fb093ae6a FT_basic_queries.3 --=20 2.55.0 From nobody Fri Sep 25 04:43:44 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9A73853359F; Wed, 16 Sep 2026 15:33:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789572783; cv=none; b=qjwuUSP4ecZIvZPJuM6YSnhbqTM+hiiMhyrHV1nArVoCcLPikNUi0exL4B41wTAECuBKIxH8W5HrYGxxz4Wtw+hJ+JaS5sXoWKuoMha/7pboBd+D+JuE/LQmTv7pw7sOXSyxzl3Sa1op+fy/xiiqCqTyv6HwLBIKL4bu1xit24A= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789572783; c=relaxed/simple; bh=g327Lt1Wa7i5zRuwpE68v025f5tdq+5vIvxaHeUZQ4s=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=UvXVVul6DMjQCEVHtRmgk7J7rkL1IaXviOeWA90aOtpUFztI0IbfksFABEM4F+149oETfNVck/SPNDsF37y3RGb7o/oJ25gs0ywlszNE8Xlu49d9FFlp5+VcQoi8V8gJ7qL5srlo0HRIFRPAgU2LG1M0PZ8++JJPODv77pIWgak= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=LUfbySdY; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="LUfbySdY" Received: by smtp.kernel.org (Postfix) with ESMTPS id DA6E9C2BD04; Wed, 16 Sep 2026 15:33:00 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1789572780; bh=g327Lt1Wa7i5zRuwpE68v025f5tdq+5vIvxaHeUZQ4s=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=LUfbySdYCtXC82qRA2oGqfhf1GIUbmlEhiv441NSy9sLwFjk3GUtYFmvH09YeYN19 oLjnLvgF/OMoAv5DtSzkLu8DmQdgqxOUPMYnz35QVRM1ftw1L1VhkSO3DVzFTdW+2q hxJRDCHyB5pqVZYFFkfrYSe2mlCeZhsA0fpByhIWbpEMgCQFdFEsqphCU10tx/imJo kRvUGey6MBYPMidJeP7sVleBRRqZDlNHl5UUBK7Qk0rePCliS0ffhbLO64gA2wCH+d 9I//qJDKbr1U8cuGMzAMT6QGQJPlSzqXRopWfYNe2D7yALuLXZYVfwlO/WP6FTSd+L 5kGTttuVftsyA== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id C5178C982C4; Wed, 16 Sep 2026 15:33:00 +0000 (UTC) From: Jim Cromie via B4 Relay Date: Wed, 16 Sep 2026 09:33:06 -0600 Subject: [PATCH v10 14/38] dyndbg: Bind callsites and classmaps to DDEBUG_MODNAME Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260916-dd-cmap-part2-clean-v10-14-af4cf4767707@gmail.com> References: <20260916-dd-cmap-part2-clean-v10-0-af4cf4767707@gmail.com> In-Reply-To: <20260916-dd-cmap-part2-clean-v10-0-af4cf4767707@gmail.com> To: Jason Baron , Shuah Khan , Andrew Morton , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Arnd Bergmann , Luis Chamberlain , Petr Pavlu , Daniel Gomez , Sami Tolvanen , Aaron Tomlin , Jonathan Corbet , Greg Kroah-Hartman , Nathan Chancellor , Nicolas Schier , Shuah Khan , Randy Dunlap , "Rafael J. Wysocki" , Pavel Machek , Len Brown Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-arch@vger.kernel.org, linux-modules@vger.kernel.org, linux-doc@vger.kernel.org, linux-kbuild@vger.kernel.org, linux-pm@vger.kernel.org, Jim Cromie X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789572777; l=5456; i=jim.cromie@gmail.com; s=20260203; h=from:subject:message-id; bh=QBYHFOAGtPUZQ0XtQfqknu+wV/y2/uE7ShWvPiZO9qg=; b=UBn3jzJiK8zgbFC+xg1+b0mfu0MV0P6ogZrSO9KhMbgJN3fmX3t1Ckby9SBoVGQbUb2xySmUT wPCVCh19BSuABrXQCh6w3mrUrd0KkNkohzY3imdW5yTotY8VgOllM9c X-Developer-Key: i=jim.cromie@gmail.com; a=ed25519; pk=C6E5ODlPQo7ZBynATXH9wg7K6HxP0pIXyf4s38Qw0XE= X-Endpoint-Received: by B4 Relay for jim.cromie@gmail.com/20260203 with auth_id=958 X-Original-From: Jim Cromie Reply-To: jim.cromie@gmail.com From: Jim Cromie Currently, dyndbg binds KBUILD_MODNAME directly into callsite and classmap declarator macros. For built-ins, KBUILD_MODNAME defaults to the basename of the source file. For many subsystems, this fragments what should be a single module into separate file basenames: kernel/power/ produces "main", "suspend", "hibernate", "snapshot", and "swap" when all should be "power". Conversely, multiple unrelated built-in files across the tree (init/main.c, kernel/power/main.c) all collide under "main". While consolidating these fragments into unified subsystem names is desirable for query targeting and classmaps, attempting a bulk heuristic renaming across Kbuild introduces broad churn and disrupts control file output across the kernel. Module naming should remain under explicit maintainer control instead. Define DDEBUG_MODNAME in include/linux/dynamic_debug.h guarded with #ifndef, defaulting cleanly to KBUILD_MODNAME. Bind DDEBUG_MODNAME into callsite and classmap declarator macros instead of hardcoding KBUILD_MODNAME. This establishes an opt-in hook allowing subsystem maintainers to consolidate their module fragments if desired (e.g. via ccflags-y +=3D -DDDEBUG_MODNAME=3D'"power"' in a subsystem Makefile) while preserving existing module-name invariants by default. What's Unchanged: - Default module names remain strictly identical to KBUILD_MODNAME. - Zero callsite memory overhead or layout changes in struct _ddebug. - dynamic_debug/control output remains unchanged across the tree. Signed-off-by: Jim Cromie --- include/linux/dynamic_debug.h | 12 +++++++-- .../selftests/dynamic_debug/dyndbg_selftest.sh | 29 +++++++++++-------= ---- 2 files changed, 25 insertions(+), 16 deletions(-) diff --git a/include/linux/dynamic_debug.h b/include/linux/dynamic_debug.h index baf5c0853f45..85863e24ad13 100644 --- a/include/linux/dynamic_debug.h +++ b/include/linux/dynamic_debug.h @@ -10,6 +10,14 @@ =20 #define __DDEBUG_ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0])) =20 +/* + * DDEBUG_MODNAME: Subsystem/module name hook for callsites and classmaps. + * Defaults to KBUILD_MODNAME. + */ +#ifndef DDEBUG_MODNAME +#define DDEBUG_MODNAME KBUILD_MODNAME +#endif + /* * An instance of this structure is created in a special * ELF section at every dynamic debug callsite. At runtime, @@ -121,7 +129,7 @@ struct ddebug_class_param { static struct ddebug_class_map __aligned(8) __used \ __section("__dyndbg_classes") _var =3D { \ .mod =3D THIS_MODULE, \ - .mod_name =3D KBUILD_MODNAME, \ + .mod_name =3D DDEBUG_MODNAME, \ .base =3D _base, \ .map_type =3D _maptype, \ .class_names =3D _var##_classnames, \ @@ -160,7 +168,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 =3D { \ - .modname =3D KBUILD_MODNAME, \ + .modname =3D DDEBUG_MODNAME, \ .function =3D __func__, \ .filename =3D __FILE__, \ .format =3D (fmt), \ diff --git a/tools/testing/selftests/dynamic_debug/dyndbg_selftest.sh b/too= ls/testing/selftests/dynamic_debug/dyndbg_selftest.sh index 972f12c70a8e..09a8dbf239dc 100755 --- a/tools/testing/selftests/dynamic_debug/dyndbg_selftest.sh +++ b/tools/testing/selftests/dynamic_debug/dyndbg_selftest.sh @@ -267,34 +267,35 @@ function FT_grammar_errs { ddcmd =3D_ } =20 -# these queries run against the builtin module: params, and change -# flags. The control file state-of-interest is found by path, -# kernel/params.c, to avoid module keyword entirely +# these queries run against the builtin file: kernel/params.c, and change +# flags. The control file state-of-interest is found by path $f, +# perfectly binding the stimulus scope to the observation slice. function FT_basic_queries { v_echo "${GREEN}# BASIC_TESTS ${NC}" if [ $LACK_DD_BUILTIN -eq 1 ]; then - echo "SKIP - test requires params, which is a builtin module" + echo "SKIP - test requires dynamic_debug built into kernel" return fi + local f=3D'kernel/params.c' ddcmd =3D_ # zero everything =20 - ddcmd "module params +mf" 'kernel/params.c' - ddcmd "module params +l" 'kernel/params.c' - ddcmd "module params -m" 'kernel/params.c' - ddcmd "module params =3D_" 'kernel/params.c' + ddcmd "file $f +mf" "$f" + ddcmd "file $f +l" "$f" + ddcmd "file $f -m" "$f" + ddcmd "file $f =3D_" "$f" =20 # multi-query commands split on ; on a single line - ddcmd "module params +mf ; module params func parse_args +sl" 'kernel= /params.c' + ddcmd "file $f +mf ; file $f func parse_args +sl" "$f" =20 # verify multi-cmd input, newline separated, with embedded comments ddcmd =3D_ # reset before multiline query to capture full transition - ddcmd "module params =3D_ # clear params - module params +ml # set flags - module params func parse_args +fs # set other flags" \ - 'kernel/params.c' + ddcmd "file $f =3D_ # clear params + file $f +ml # set flags + file $f func parse_args +fs # set other flags" \ + "$f" =20 # clear flags and verify - ddcmd "module params =3D_" 'kernel/params.c' + ddcmd "file $f =3D_" "$f" } =20 # Built-in Feature Tests (Can run on any CONFIG_DYNAMIC_DEBUG kernel, modu= lar or monolithic) --=20 2.55.0 From nobody Fri Sep 25 04:43:44 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0039853D0A3; Wed, 16 Sep 2026 15:33:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789572785; cv=none; b=pT/lsMfEVwDFqoRr4nvbdszPhR9FpM++bW2rkAvmAzF2vi+eRECUEe4NVxQwO4GVbazBFYuS+v/E4LKswPHzI23Op0fmU6QbBi56durlTgt7aYx/l3iZbsOaZ0jWNZZsaunLXGHw8EMDrb6kpDUHfhESEONlUIEmkBK3wiwQFq4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789572785; c=relaxed/simple; bh=9cteVrpVeu+0Wz9UUDswnkAOHWsaXdHrGqz30TkA6eE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=q0DO4HtzJojXU47ZiPvPA1crtRyxZr6Mkwc/hil8IJsunZdLnP2nVie6mcph4vQuJD5RKV0F8pkubM8OXFDU7dFUSnZX+jKY/6jJjWXgB0QARnEvSNur1tliQUDPlzcDZxaviZUN0s0G0a78UD1nVGABUdEi6Mks8tp/LWWoRnk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=u+bElh3y; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="u+bElh3y" Received: by smtp.kernel.org (Postfix) with ESMTPS id F30AEC2BD05; Wed, 16 Sep 2026 15:33:00 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1789572781; bh=9cteVrpVeu+0Wz9UUDswnkAOHWsaXdHrGqz30TkA6eE=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=u+bElh3ySiIJ/IysfeiQOpkfdWTDO2WCxsRHCnHWF3UcQoOImG6NX1/FmmeSe4zSG YWRSvFesqJPGDauKKEm7gKx0dQ8WznDUhv0hD+rpLS7j2V41dBW0xw2QzMwS9vhUY0 jIqxHbfy4ccH+nla+Ya5LV2xYWYiSKAggBiZNugenDb8yx4ftlzJq8UCqQQcwmQCjP enH+KG2z/VSrb2t/5CFE4nIN6B4J3LPjcimJtrrY1UT9muGG9nfI6O/WLXALMpLdRL z6vAUmjDlDYGO5nuDae9QTX5GreFOzauvvD2FtcCZfXk1vzhF9StC02K4iWoM1OErk 54+kuZpodF1Fw== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id DCD5BC982CA; Wed, 16 Sep 2026 15:33:00 +0000 (UTC) From: Jim Cromie via B4 Relay Date: Wed, 16 Sep 2026 09:33:07 -0600 Subject: [PATCH v10 15/38] dyndbg: refactor param_set_dyndbg_classes and below Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260916-dd-cmap-part2-clean-v10-15-af4cf4767707@gmail.com> References: <20260916-dd-cmap-part2-clean-v10-0-af4cf4767707@gmail.com> In-Reply-To: <20260916-dd-cmap-part2-clean-v10-0-af4cf4767707@gmail.com> To: Jason Baron , Shuah Khan , Andrew Morton , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Arnd Bergmann , Luis Chamberlain , Petr Pavlu , Daniel Gomez , Sami Tolvanen , Aaron Tomlin , Jonathan Corbet , Greg Kroah-Hartman , Nathan Chancellor , Nicolas Schier , Shuah Khan , Randy Dunlap , "Rafael J. Wysocki" , Pavel Machek , Len Brown Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-arch@vger.kernel.org, linux-modules@vger.kernel.org, linux-doc@vger.kernel.org, linux-kbuild@vger.kernel.org, linux-pm@vger.kernel.org, Jim Cromie , Louis Chauvet X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789572777; l=6792; i=jim.cromie@gmail.com; s=20260203; h=from:subject:message-id; bh=ZsqxT/rtZBrGWYFLXmA7gUPMn97K+pyumCWiXEAO5/s=; b=m2nJ2CAkef2JrlRelPc4+vZRVUh5mMW1dHt7JS0iN1R8XAjI+KF/8c1wsQt7QocVrjplmeXH1 +frg/KxBcljBQww/3ySRV62nA7C4OqZINUKaiZqTe38Yd+LQf2jzoXT X-Developer-Key: i=jim.cromie@gmail.com; a=ed25519; pk=C6E5ODlPQo7ZBynATXH9wg7K6HxP0pIXyf4s38Qw0XE= X-Endpoint-Received: by B4 Relay for jim.cromie@gmail.com/20260203 with auth_id=958 X-Original-From: Jim Cromie Reply-To: jim.cromie@gmail.com From: Jim Cromie Refactor the 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. Signed-off-by: Jim Cromie Reviewed-by: Louis Chauvet --- v2: move RvB after SoB v8: drop kdoc on static fn, --- lib/dynamic_debug.c | 73 ++++++++++++++++++++++++++++++++++---------------= ---- 1 file changed, 47 insertions(+), 26 deletions(-) diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c index ca8e3cea504c..2b755f18344b 100644 --- a/lib/dynamic_debug.c +++ b/lib/dynamic_debug.c @@ -618,9 +618,10 @@ static int ddebug_exec_queries(char *query, const char= *modname) return nfound; } =20 -/* 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]; @@ -628,7 +629,9 @@ static int ddebug_apply_class_bitmap(const struct ddebu= g_class_param *dcp, int matches =3D 0; int bi, ct; =20 - v2pr_info("apply: 0x%lx to: 0x%lx\n", *new_bits, *old_bits); + if (*new_bits !=3D *old_bits) + v2pr_info("apply bitmap: 0x%lx to: 0x%lx for %s\n", *new_bits, + *old_bits, query_modname ?: "'*'"); =20 for (bi =3D 0; bi < map->length; bi++) { if (test_bit(bi, new_bits) =3D=3D test_bit(bi, old_bits)) @@ -637,12 +640,16 @@ static int ddebug_apply_class_bitmap(const struct dde= bug_class_param *dcp, snprintf(query, QUERY_SIZE, "class %s %c%s", map->class_names[bi], test_bit(bi, new_bits) ? '+' : '-', dcp->flags); =20 - ct =3D ddebug_exec_queries(query, NULL); + ct =3D ddebug_exec_queries(query, query_modname); matches +=3D ct; =20 v2pr_info("bit_%d: %d matches on class: %s -> 0x%lx\n", bi, ct, map->class_names[bi], *new_bits); } + if (*new_bits !=3D *old_bits) + v2pr_info("applied bitmap: 0x%lx to: 0x%lx for %s\n", *new_bits, + *old_bits, query_modname ?: "'*'"); + return matches; } =20 @@ -651,22 +658,17 @@ static int ddebug_apply_class_bitmap(const struct dde= bug_class_param *dcp, =20 #define CLASSMAP_BITMASK(width) ((1UL << (width)) - 1) =20 -/** - * 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. +/* + * param-setter helper to validate numeric input, clamp its value by + * the classmap type and size, and apply the bits. */ -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 =3D kp->arg; const struct ddebug_class_map *map =3D dcp->map; - unsigned long inrep, new_bits, old_bits; + unsigned long inrep, new_bits, old_bits, old_val; int rc, totct =3D 0; =20 rc =3D kstrtoul(instr, 0, &inrep); @@ -686,9 +688,10 @@ int param_set_dyndbg_classes(const char *instr, const = struct kernel_param *kp) KP_NAME(kp), inrep, CLASSMAP_BITMASK(map->length)); inrep &=3D CLASSMAP_BITMASK(map->length); } - v2pr_info("bits:%lx > %s\n", inrep, KP_NAME(kp)); - totct +=3D ddebug_apply_class_bitmap(dcp, &inrep, dcp->bits); - *dcp->bits =3D inrep; + old_val =3D READ_ONCE(*dcp->bits); + v2pr_info("bits:0x%lx > %s.%s\n", inrep, mod_name ?: "*", KP_NAME(kp)); + totct +=3D ddebug_apply_class_bitmap(dcp, &inrep, &old_val, mod_name); + WRITE_ONCE(*dcp->bits, inrep); break; case DD_CLASS_TYPE_LEVEL_NUM: /* input is bitpos, of highest verbosity to be enabled */ @@ -697,11 +700,12 @@ int param_set_dyndbg_classes(const char *instr, const= struct kernel_param *kp) KP_NAME(kp), inrep, map->length); inrep =3D map->length; } - old_bits =3D CLASSMAP_BITMASK(*dcp->lvl); + old_val =3D READ_ONCE(*dcp->lvl); + old_bits =3D CLASSMAP_BITMASK(old_val); new_bits =3D CLASSMAP_BITMASK(inrep); v2pr_info("lvl:%ld bits:0x%lx > %s\n", inrep, new_bits, KP_NAME(kp)); - totct +=3D ddebug_apply_class_bitmap(dcp, &new_bits, &old_bits); - *dcp->lvl =3D inrep; + totct +=3D ddebug_apply_class_bitmap(dcp, &new_bits, &old_bits, mod_name= ); + WRITE_ONCE(*dcp->lvl, inrep); break; default: pr_warn("%s: bad map type: %d\n", KP_NAME(kp), map->map_type); @@ -710,16 +714,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-based kernel parameter setter + * @instr: string value to set (numeric bitmask or level) + * @kp: kernel parameter info referencing classmap state + * + * Enable or disable all class'd pr_debug callsites in the classmap, + * independent of the module they're in. + * + * Returns: 0 on success, or a negative error code. + */ +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); =20 /** - * 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) { --=20 2.55.0 From nobody Fri Sep 25 04:43:44 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D249F5335B1; Wed, 16 Sep 2026 15:33:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789572783; cv=none; b=XH0xvcN347eq4lAgo0H8AtJNlapxJLPKdkV1O2AYN8DvaRvGOXetOp6+zd8Wg5U4P7P/OBbtLFY4hyQEdT+r/fVUspmlUND892lX+9ATE/CUdx/NdQuqHh2IlQtN09i4GEIr8smlBK5tVXvqPdD0giW6YKIbcgtgsTwz7RpFLYw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789572783; c=relaxed/simple; bh=oOYWMk2LVEaQRtvan2JCNsaxoT2Nouke3BGkUNIP4+8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=THo7UMbteoALLhNZUEiFQukGibMafHLcqBiDslqHdpt/5pbPST4SPg6MeVGdiEuZB2VNhOBUfeKA/Lw1p4oH/WMqejPedI4kieKnN8qc3OFXcwIzKVVFbNiqM3SeO3Df46L9peLYct+kqAk8SDI7If+EZnWOm/g3V/2nUMiWfi0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=VWNvqKkU; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="VWNvqKkU" Received: by smtp.kernel.org (Postfix) with ESMTPS id 18E22C32782; Wed, 16 Sep 2026 15:33:01 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1789572781; bh=oOYWMk2LVEaQRtvan2JCNsaxoT2Nouke3BGkUNIP4+8=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=VWNvqKkUSj2TPWtIQWHubh2d831P98yK/aoPD0IW1KJLc6dLCJjKr3Njmjxl37Rsg OtvlSgcrxcl0JoUVrMkhMr77ORbx9scXzGQScNN8PYrOxJD+tCIegmS3K8gQ9h9Rht XSp9V724qfOyyhOUxj2GM8PsjvLnSC0co9QuCVEx3Alp+17fkiZPAhHY6s/YcWFce4 TSWBMtpwZ4pEXW+eoDR1LSUoYTtBeJT8V6L0JVILRRpB1xJPe4xAIVSMP2Kgmr75P8 6iETRvT4f/b1OsixMOHlIC0YZ8eAjLSq+0Z/b+BeglXfjTnoc2rqLclMcwleENA3aP Bx8Gr6ZHe682Q== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 0254FC982C4; Wed, 16 Sep 2026 15:33:01 +0000 (UTC) From: Jim Cromie via B4 Relay Date: Wed, 16 Sep 2026 09:33:08 -0600 Subject: [PATCH v10 16/38] dyndbg: tighten fn-sig of ddebug_apply_class_bitmap Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260916-dd-cmap-part2-clean-v10-16-af4cf4767707@gmail.com> References: <20260916-dd-cmap-part2-clean-v10-0-af4cf4767707@gmail.com> In-Reply-To: <20260916-dd-cmap-part2-clean-v10-0-af4cf4767707@gmail.com> To: Jason Baron , Shuah Khan , Andrew Morton , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Arnd Bergmann , Luis Chamberlain , Petr Pavlu , Daniel Gomez , Sami Tolvanen , Aaron Tomlin , Jonathan Corbet , Greg Kroah-Hartman , Nathan Chancellor , Nicolas Schier , Shuah Khan , Randy Dunlap , "Rafael J. Wysocki" , Pavel Machek , Len Brown Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-arch@vger.kernel.org, linux-modules@vger.kernel.org, linux-doc@vger.kernel.org, linux-kbuild@vger.kernel.org, linux-pm@vger.kernel.org, Jim Cromie , Louis Chauvet X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789572777; l=2921; i=jim.cromie@gmail.com; s=20260203; h=from:subject:message-id; bh=41pLOEJPgdOE2+A/PK3jUZtX6lSeZIg8aahqJw9n64I=; b=Jw+nePT5RjSUaMe74vByImx17OJdtKDtFVMlC9PV7h71yIBbxPKZniSzJyF7LV4ZIU2IgLBch wh+PMWgD+jbArWApRs+32jAxYL/Z4LN+muCPmh4HO8tF8iGd25JleXi X-Developer-Key: i=jim.cromie@gmail.com; a=ed25519; pk=C6E5ODlPQo7ZBynATXH9wg7K6HxP0pIXyf4s38Qw0XE= X-Endpoint-Received: by B4 Relay for jim.cromie@gmail.com/20260203 with auth_id=958 X-Original-From: Jim Cromie Reply-To: jim.cromie@gmail.com From: 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. Signed-off-by: Jim Cromie Reviewed-by: Louis Chauvet --- v2: move RvB after SoB --- lib/dynamic_debug.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c index 2b755f18344b..9d3e3cad8056 100644 --- a/lib/dynamic_debug.c +++ b/lib/dynamic_debug.c @@ -620,7 +620,8 @@ static int ddebug_exec_queries(char *query, const char = *modname) =20 /* 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 @@ -629,12 +630,12 @@ static int ddebug_apply_class_bitmap(const struct dde= bug_class_param *dcp, int matches =3D 0; int bi, ct; =20 - if (*new_bits !=3D *old_bits) + if (*new_bits !=3D old_bits) v2pr_info("apply bitmap: 0x%lx to: 0x%lx for %s\n", *new_bits, - *old_bits, query_modname ?: "'*'"); + old_bits, query_modname ?: "'*'"); =20 for (bi =3D 0; bi < map->length; bi++) { - if (test_bit(bi, new_bits) =3D=3D test_bit(bi, old_bits)) + if (test_bit(bi, new_bits) =3D=3D test_bit(bi, &old_bits)) continue; =20 snprintf(query, QUERY_SIZE, "class %s %c%s", map->class_names[bi], @@ -646,9 +647,9 @@ static int ddebug_apply_class_bitmap(const struct ddebu= g_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 !=3D *old_bits) + if (*new_bits !=3D old_bits) v2pr_info("applied bitmap: 0x%lx to: 0x%lx for %s\n", *new_bits, - *old_bits, query_modname ?: "'*'"); + old_bits, query_modname ?: "'*'"); =20 return matches; } @@ -690,7 +691,7 @@ static int param_set_dyndbg_module_classes(const char *= instr, } old_val =3D READ_ONCE(*dcp->bits); v2pr_info("bits:0x%lx > %s.%s\n", inrep, mod_name ?: "*", KP_NAME(kp)); - totct +=3D ddebug_apply_class_bitmap(dcp, &inrep, &old_val, mod_name); + totct +=3D ddebug_apply_class_bitmap(dcp, &inrep, old_val, mod_name); WRITE_ONCE(*dcp->bits, inrep); break; case DD_CLASS_TYPE_LEVEL_NUM: @@ -704,7 +705,7 @@ static int param_set_dyndbg_module_classes(const char *= instr, old_bits =3D CLASSMAP_BITMASK(old_val); new_bits =3D CLASSMAP_BITMASK(inrep); v2pr_info("lvl:%ld bits:0x%lx > %s\n", inrep, new_bits, KP_NAME(kp)); - totct +=3D ddebug_apply_class_bitmap(dcp, &new_bits, &old_bits, mod_name= ); + totct +=3D ddebug_apply_class_bitmap(dcp, &new_bits, old_bits, mod_name); WRITE_ONCE(*dcp->lvl, inrep); break; default: --=20 2.55.0 From nobody Fri Sep 25 04:43:44 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 989DE53FD5F; Wed, 16 Sep 2026 15:33:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789572785; cv=none; b=r6/23aT/3WWesJJw7uBjemXwlxbqjwnIJQTnFr4hiioYNk8X953S0Qn9G6a3pJFuMic4thXW1R/hjpokKAnfTkSHhh9PGc40PEyyT4B/aTVpERYehpJZBF71gVMQndE14MZ/L/cEMBsiPShO7dvkRu00GnrXkIQpt+uCd66LyEc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789572785; c=relaxed/simple; bh=ufuFG0iiH0uwGCxs91FJfxbzCjh6T7uJduBJ12vONwI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=pvWT+KQFnqS76wv2oPQFs4OxEkASbx4LxRzICb+YUB705F9PxgkiFiB9UYdUQGF+HRJwLEnOdJKmSqUGhpQyz3OOvOwE/IhEPvHFTpgrQiAOjjG0GfqR5oPNu6mHgpiZtXQ4IXi79dcW1gk3T2Vf7hvrNJNtWelbqnDwChyR1WU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=GYNVUZxH; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="GYNVUZxH" Received: by smtp.kernel.org (Postfix) with ESMTPS id 365F8C4AF09; Wed, 16 Sep 2026 15:33:01 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1789572781; bh=ufuFG0iiH0uwGCxs91FJfxbzCjh6T7uJduBJ12vONwI=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=GYNVUZxHOVlL67Go5xQzuKi6qhn9aDhp0Tson+xkkl3oDITPu/+f6Z/vtNSvSzjod ujCxtvkv2gdJW1t/h9FW4A5xPfCAL//qWlXPGOj0lG2ICCC0fMy8eNMJREdktimF/y FxdXhHOpntQKFsmN6TQEpYj4/OccNniA2VcIsuaBcIN/Vrr17BDa3IwAPFJsSbXFRb kYQRd8GJqIMGV9WSQFJDngeTY99BVi69PF0+HOfeyiU7eZ51paFjbJU5dysDkAdCmF HXKHKBXeIiz53KuDb8A3mXpv+YpFMHBIPnb+RI4TZ1b3LRc/YuHODTxRc8xmMlTIpW XsBkh+EC9tBlQ== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 1E0A8C982C9; Wed, 16 Sep 2026 15:33:01 +0000 (UTC) From: Jim Cromie via B4 Relay Date: Wed, 16 Sep 2026 09:33:09 -0600 Subject: [PATCH v10 17/38] dyndbg: replace classmap list with an array-slice Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260916-dd-cmap-part2-clean-v10-17-af4cf4767707@gmail.com> References: <20260916-dd-cmap-part2-clean-v10-0-af4cf4767707@gmail.com> In-Reply-To: <20260916-dd-cmap-part2-clean-v10-0-af4cf4767707@gmail.com> To: Jason Baron , Shuah Khan , Andrew Morton , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Arnd Bergmann , Luis Chamberlain , Petr Pavlu , Daniel Gomez , Sami Tolvanen , Aaron Tomlin , Jonathan Corbet , Greg Kroah-Hartman , Nathan Chancellor , Nicolas Schier , Shuah Khan , Randy Dunlap , "Rafael J. Wysocki" , Pavel Machek , Len Brown Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-arch@vger.kernel.org, linux-modules@vger.kernel.org, linux-doc@vger.kernel.org, linux-kbuild@vger.kernel.org, linux-pm@vger.kernel.org, Jim Cromie , Louis Chauvet X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789572777; l=6080; i=jim.cromie@gmail.com; s=20260203; h=from:subject:message-id; bh=ebOnxqx5VuWa0/VzpF9spz3mGGSlrx2PW3HTN1h9Z9w=; b=L8/tSDJjcAeP8cqebes6zXTMHbLaoitoYimMV42+gXwsdZVmlwNTGjGzwKpLlaRuAbjXm3W9R vcse85vmRoECrjpNLC02b9SfK7UKpDboTU86znVzPptp6Yz9OaA4WHJ X-Developer-Key: i=jim.cromie@gmail.com; a=ed25519; pk=C6E5ODlPQo7ZBynATXH9wg7K6HxP0pIXyf4s38Qw0XE= X-Endpoint-Received: by B4 Relay for jim.cromie@gmail.com/20260203 with auth_id=958 X-Original-From: Jim Cromie Reply-To: jim.cromie@gmail.com From: 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, classmaps 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 of the classmap structs. The "select-by-modname" condition is reused to find the start,end of the subrange of classmaps belonging to the module. Signed-off-by: Jim Cromie Reviewed-by: Louis Chauvet --- v2: RvB after SoB --- include/linux/dynamic_debug.h | 1 - lib/dynamic_debug.c | 65 +++++++++++++++++++++++----------------= ---- 2 files changed, 35 insertions(+), 31 deletions(-) diff --git a/include/linux/dynamic_debug.h b/include/linux/dynamic_debug.h index 85863e24ad13..02a1abdc5b3f 100644 --- a/include/linux/dynamic_debug.h +++ b/include/linux/dynamic_debug.h @@ -84,7 +84,6 @@ enum ddebug_class_map_type { }; =20 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 9d3e3cad8056..d2d3213061d2 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[]; =20 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; }; =20 struct ddebug_query { @@ -149,12 +150,13 @@ static void v3pr_info_dq(const struct ddebug_query *q= uery, const char *msg) } =20 static struct ddebug_class_map *ddebug_find_valid_class(struct ddebug_tabl= e 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; =20 - list_for_each_entry(map, &dt->maps, link) { + for (map =3D dt->classes, i =3D 0; i < dt->num_classes; i++, map++) { idx =3D match_string(map->class_names, map->length, class_string); if (idx >=3D 0) { *class_id =3D idx + map->base; @@ -165,7 +167,6 @@ static struct ddebug_class_map *ddebug_find_valid_class= (struct ddebug_table cons return NULL; } =20 -#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 @@ -235,7 +236,7 @@ static int ddebug_change(const struct ddebug_query *que= ry, unsigned int nfound =3D 0; struct flagsbuf fbuf, nbuf; struct ddebug_class_map *map =3D NULL; - int __outvar valid_class; + int valid_class; =20 /* search for matching ddebugs */ mutex_lock(&ddebug_lock); @@ -1067,9 +1068,10 @@ static void *ddebug_proc_next(struct seq_file *m, vo= id *p, loff_t *pos) =20 static const char *ddebug_class_name(struct ddebug_iter *iter, struct _dde= bug *dp) { - struct ddebug_class_map *map; + struct ddebug_class_map *map =3D iter->table->classes; + int i, nc =3D iter->table->num_classes; =20 - list_for_each_entry(map, &iter->table->maps, link) + for (i =3D 0; i < nc; i++, map++) if (class_in_range(dp->class_id, map)) return map->class_names[dp->class_id - map->base]; =20 @@ -1153,30 +1155,34 @@ static const struct proc_ops proc_fops =3D { .proc_write =3D ddebug_proc_write }; =20 -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 =3D 0; + int i, nc =3D 0; =20 - for (cm =3D classes, i =3D 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 =3D di->classes, i =3D 0; i < di->num_classes; i++, cm++) { =20 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 =3D 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 =3D cm; + } + nc++; + } else if (nc) { + /* end of matching classmaps */ + break; } } - if (ct) - vpr_info("module:%s attached %d classes\n", dt->mod_name, ct); + if (nc) { + dt->num_classes =3D nc; + vpr_info("module:%s attached %d classes\n", dt->mod_name, nc); + } } =20 /* @@ -1208,10 +1214,9 @@ static int ddebug_add_module(struct _ddebug_info *di= , const char *modname) dt->num_ddebugs =3D di->num_descs; =20 INIT_LIST_HEAD(&dt->link); - INIT_LIST_HEAD(&dt->maps); =20 if (di->classes && di->num_classes) - ddebug_attach_module_classes(dt, di->classes, di->num_classes); + ddebug_attach_module_classes(dt, di); =20 mutex_lock(&ddebug_lock); list_add_tail(&dt->link, &ddebug_tables); @@ -1324,8 +1329,8 @@ static void ddebug_remove_all_tables(void) mutex_lock(&ddebug_lock); while (!list_empty(&ddebug_tables)) { struct ddebug_table *dt =3D list_entry(ddebug_tables.next, - struct ddebug_table, - link); + struct ddebug_table, + link); ddebug_table_free(dt); } mutex_unlock(&ddebug_lock); --=20 2.55.0 From nobody Fri Sep 25 04:43:44 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D0EDD529403; Wed, 16 Sep 2026 15:33:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789572783; cv=none; b=AYVFll4ZTSUl0019S9ErD/fIrrrQDF1JOLvhb8numQ2jFsCFizpJOFGOjjTNqLu3oyOBCqG16wy6ucHCVXobIfgI105KOiBhcnU8MX/Ig0wvsoJP6FRPeNAMjo4Yfwetnre2/aZRei/pPMzivRoSkBbDCZD/9+v5kPO3XCX1TY4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789572783; c=relaxed/simple; bh=zO3Egf0jeAb7YrKoCS3TtL+z2wOABQGcC52sZZTtfuI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=uDkG0qzeOZqTSIJ/6+YUbQRr4+BkQ+91Us9EFZ887B8FDE6DumPp5MAC6N+hAXXXWBWhDzLtOOVT1S/ps19f9IuuktPMwLPeKFZEk7lxqeT0xePJgE7WdZaOa/CW9wrBm9mc742YK8QgQOaeGVmHcLZpVMovK2Bc7ZII6b2cDNc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=US2mHeLb; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="US2mHeLb" Received: by smtp.kernel.org (Postfix) with ESMTPS id 5744FC32781; Wed, 16 Sep 2026 15:33:01 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1789572781; bh=zO3Egf0jeAb7YrKoCS3TtL+z2wOABQGcC52sZZTtfuI=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=US2mHeLbe/OgIjWE0z1+MGC7DvtSlmZ8COww4Erqoo3NQP4vjQYd4JsdjOuRHV34H DhtrFC5EJYFPLPItaZJgtHr1yUDkRBIVl9V8VnNsYFSX6C7F5hO7NA/+j/b7WX8p// lCIYUoKZxB3D8Lt7s7KYjAbxsrGEv/vewiCNrMWwl9QdsEgAxg+kq+gwliMCqoIbzt RYcducaj3Ej44btvP/7+GmAToj1wnwicMn6vRZ15zeK8Ow1AIZTlYbEBmMMZvLEB9m OuZzdB+ul3SnGZGYZZ8GcmAaHCtfWA4Na1EVNuYmDPMFT5JmT6sPuVGcGbCSqHE2vJ 3H+BHr+xEhwOw== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 3CC1DC982C5; Wed, 16 Sep 2026 15:33:01 +0000 (UTC) From: Jim Cromie via B4 Relay Date: Wed, 16 Sep 2026 09:33:10 -0600 Subject: [PATCH v10 18/38] dyndbg: macrofy a 2-index for-loop pattern Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260916-dd-cmap-part2-clean-v10-18-af4cf4767707@gmail.com> References: <20260916-dd-cmap-part2-clean-v10-0-af4cf4767707@gmail.com> In-Reply-To: <20260916-dd-cmap-part2-clean-v10-0-af4cf4767707@gmail.com> To: Jason Baron , Shuah Khan , Andrew Morton , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Arnd Bergmann , Luis Chamberlain , Petr Pavlu , Daniel Gomez , Sami Tolvanen , Aaron Tomlin , Jonathan Corbet , Greg Kroah-Hartman , Nathan Chancellor , Nicolas Schier , Shuah Khan , Randy Dunlap , "Rafael J. Wysocki" , Pavel Machek , Len Brown Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-arch@vger.kernel.org, linux-modules@vger.kernel.org, linux-doc@vger.kernel.org, linux-kbuild@vger.kernel.org, linux-pm@vger.kernel.org, Jim Cromie , Louis Chauvet X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789572777; l=2812; i=jim.cromie@gmail.com; s=20260203; h=from:subject:message-id; bh=jJY4VpZf9KDyt540yN24p5FCEf0yAU/738K4eGBzbQY=; b=MmaTEyesKlbp+rZqXapIgRmM/T8hXQcmkSU0mbEi/P/XGmjwwyC2G0YzvZLkJZLyMslgkYXNw xwSocTxNchfCj+01xF369gHvEVGa64dEK3jlwDhFFitBqizzImUm1QJ X-Developer-Key: i=jim.cromie@gmail.com; a=ed25519; pk=C6E5ODlPQo7ZBynATXH9wg7K6HxP0pIXyf4s38Qw0XE= X-Endpoint-Received: by B4 Relay for jim.cromie@gmail.com/20260203 with auth_id=958 X-Original-From: Jim Cromie Reply-To: jim.cromie@gmail.com From: 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. Signed-off-by: Jim Cromie Reviewed-by: Louis Chauvet --- v2: move RvB after SoB --- lib/dynamic_debug.c | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c index d2d3213061d2..4d5f495968d9 100644 --- a/lib/dynamic_debug.c +++ b/lib/dynamic_debug.c @@ -149,6 +149,20 @@ static void v3pr_info_dq(const struct ddebug_query *qu= ery, const char *msg) query->first_lineno, query->last_lineno, query->class_string); } =20 +/* + * 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 for_subvec(_i, _sp, _box, _vec) \ + for ((_i) =3D 0, (_sp) =3D (_box)->_vec; \ + (_i) < (_box)->num_##_vec; \ + (_i)++, (_sp)++) /* { block } */ + static struct ddebug_class_map *ddebug_find_valid_class(struct ddebug_tabl= e const *dt, const char *class_string, int *class_id) @@ -156,7 +170,7 @@ static struct ddebug_class_map *ddebug_find_valid_class= (struct ddebug_table cons struct ddebug_class_map *map; int i, idx; =20 - for (map =3D dt->classes, i =3D 0; i < dt->num_classes; i++, map++) { + for_subvec(i, map, dt, classes) { idx =3D match_string(map->class_names, map->length, class_string); if (idx >=3D 0) { *class_id =3D idx + map->base; @@ -1165,8 +1179,7 @@ static void ddebug_attach_module_classes(struct ddebu= g_table *dt, struct _ddebug * the builtin/modular classmap vector/section. Save the start * and length of the subrange at its edges. */ - for (cm =3D di->classes, i =3D 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= ", --=20 2.55.0 From nobody Fri Sep 25 04:43:45 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D4F045335BC; Wed, 16 Sep 2026 15:33:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789572783; cv=none; b=UXkzWaZl+YKlsCcYYXRqeK2iyyRuDUUMoL0rzp4ubryczNqW/TXf+cLdX3aGwzS3aOfS3OPP/JhD6eP5Bw+8OUia5ZOYyFd/68dQ7VnnB/keVlU4yk4RTSIG4hNnLX/D9/QU49D6xyMXU0l5TdOB0LnNOdF0luys7jUUXWd7kqI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789572783; c=relaxed/simple; bh=5wIY341RZO/8kpnGfoygcOPij5SPta1VXvNSyTDvloo=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=VzyEGhB496sHtNrXXwB+9qHMiCKUujEGFdt+da4gnIpum9/sxqNtPYxr/JKaBGNcS3nmqZ2b7TJ/jIRWQqJ3Z14QHrW9qdhoLrRXV4HFzYBSFi84ByRhJ5Qwcn1sAysS24niFTCIUh/v4IQs9bQZSfSd+eu/Vk8KsWbpC6QeRBc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=rWXzi4R0; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="rWXzi4R0" Received: by smtp.kernel.org (Postfix) with ESMTPS id 74445C32786; Wed, 16 Sep 2026 15:33:01 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1789572781; bh=5wIY341RZO/8kpnGfoygcOPij5SPta1VXvNSyTDvloo=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=rWXzi4R0hAAdjHDL1Yq7fRvlyi/ZE2ASLa6jO8bU4QX/EQP7/j77qf170x8Vp6Bes hGESXSzbAb+BNaOgA1ehiM9h/g0x/vFttwFtz8IOtmaQcJQMTWxhUgSaKLjhfP8XOL N8ilyRtEb9wKHMwznC7gMQ5nhZnWLjQgWS2cZYxh8R85z3Y+675s502jq8FOoxYwA8 QdEkloKLP2TyhdSa5vOGe1Ig2W5iPpf1AkZ2+ltx8aAr/mmBCdo+veTK07QemmNUwh Tps1i7xAQku1FuwUajF3w5oF2iX+3tPv6yCOSQ7sZCqXCkgiV/2z2kGtfxkWLUEka7 K846XPUVgkKPg== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 5E1F3C982C3; Wed, 16 Sep 2026 15:33:01 +0000 (UTC) From: Jim Cromie via B4 Relay Date: Wed, 16 Sep 2026 09:33:11 -0600 Subject: [PATCH v10 19/38] dyndbg: reduce class param storage to u32 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260916-dd-cmap-part2-clean-v10-19-af4cf4767707@gmail.com> References: <20260916-dd-cmap-part2-clean-v10-0-af4cf4767707@gmail.com> In-Reply-To: <20260916-dd-cmap-part2-clean-v10-0-af4cf4767707@gmail.com> To: Jason Baron , Shuah Khan , Andrew Morton , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Arnd Bergmann , Luis Chamberlain , Petr Pavlu , Daniel Gomez , Sami Tolvanen , Aaron Tomlin , Jonathan Corbet , Greg Kroah-Hartman , Nathan Chancellor , Nicolas Schier , Shuah Khan , Randy Dunlap , "Rafael J. Wysocki" , Pavel Machek , Len Brown Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-arch@vger.kernel.org, linux-modules@vger.kernel.org, linux-doc@vger.kernel.org, linux-kbuild@vger.kernel.org, linux-pm@vger.kernel.org, Jim Cromie X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789572777; l=9168; i=jim.cromie@gmail.com; s=20260203; h=from:subject:message-id; bh=zmKabooMhWV4JvaL9Gl2blvVpugNJ9hf6IHOm23U8eM=; b=CooaxEA/HCqFf5catSvgblObDOS1uULMQ0Z4N8vNS0SkKr8Kwk3V1Y5SN7Moq2WxOFlRUvgKO YwPeSU16HtxAvyIvmA8mJ2gWTFx32A9emFSYjW2rIgZHxAdJVS+ZHJT X-Developer-Key: i=jim.cromie@gmail.com; a=ed25519; pk=C6E5ODlPQo7ZBynATXH9wg7K6HxP0pIXyf4s38Qw0XE= X-Endpoint-Received: by B4 Relay for jim.cromie@gmail.com/20260203 with auth_id=958 X-Original-From: Jim Cromie Reply-To: jim.cromie@gmail.com From: Jim Cromie Currently, `struct ddebug_class_param` uses pointers to `unsigned long` values which store the state of `bits` and `lvl`, so it changes sizes depending upon the architecture. Make it always u32 for consistency. The bits field references __drm_debug, which was unsigned int, before commit f158936b60a7 ("drm: POC drm on dyndbg - use in core, 2 helpers, 3 dr= ivers.") changed it to unsigned long. This patch changes it back. That enlargement was a thinko; although modules can have up to 63 classes, and *could* have put all those classes in a single classmap, the reason for it is to support multiple classmaps (with non-overlapping class-id ranges). 32 bits is a practical limit for a class-param's usability since all classes are set together with a single write of a hex value; 16 would be a realistic limit, drm.debug has ~12 classes. #> echo 0x0fff > /sys/module/drm/parameters/debug Several followon patches add a number of compile-time validations, including a num-classes <=3D32 check. Signed-off-by: Jim Cromie --- v8: add a <32 limit to prevent undefined shifts on 32 bit number v5: u32 for all arches v4: undo change struct ddebug_class_param to _ddebug_class_param v3: fix undefd behavior when classmaps is all 64 bits. change module_param_named( type-arg from ulong to ullong) change struct ddebug_class_param to _ddebug_class_param in drivers/gpu/drm/drm_print.{c,h} api change later v2: patch was "make bits & lvl same size" but that size was unsigned long, only 32 bits on i386 etc use u64 for all bits, and %llu %llx u64-fix u64-drm-dbg --- drivers/gpu/drm/drm_print.c | 4 ++-- include/drm/drm_print.h | 2 +- include/linux/dynamic_debug.h | 4 ++-- lib/dynamic_debug.c | 37 ++++++++++++++++++++----------------- lib/test_dynamic_debug.c | 2 +- 5 files changed, 26 insertions(+), 23 deletions(-) diff --git a/drivers/gpu/drm/drm_print.c b/drivers/gpu/drm/drm_print.c index 86cef1a37678..794417c62097 100644 --- a/drivers/gpu/drm/drm_print.c +++ b/drivers/gpu/drm/drm_print.c @@ -40,7 +40,7 @@ * __drm_debug: Enable debug output. * Bitmask of DRM_UT_x. See include/drm/drm_print.h for details. */ -unsigned long __drm_debug; +u32 __drm_debug; EXPORT_SYMBOL(__drm_debug); =20 MODULE_PARM_DESC(debug, "Enable debug output, where each bit enables a deb= ug category.\n" @@ -56,7 +56,7 @@ MODULE_PARM_DESC(debug, "Enable debug output, where each = bit enables a debug cat "\t\tBit 9 (0x200) will enable DRMRES messages (managed resources code)"); =20 #if !defined(CONFIG_DRM_USE_DYNAMIC_DEBUG) -module_param_named(debug, __drm_debug, ulong, 0600); +module_param_named(debug, __drm_debug, uint, 0600); #else /* classnames must match vals of enum drm_debug_category */ DECLARE_DYNDBG_CLASSMAP(drm_debug_classes, DD_CLASS_TYPE_DISJOINT_BITS, 0, diff --git a/include/drm/drm_print.h b/include/drm/drm_print.h index 2adc5ac688e1..50b3ba0ae76d 100644 --- a/include/drm/drm_print.h +++ b/include/drm/drm_print.h @@ -39,7 +39,7 @@ struct drm_device; struct seq_file; =20 /* Do *not* use outside of drm_print.[ch]! */ -extern unsigned long __drm_debug; +extern u32 __drm_debug; =20 /** * DOC: print diff --git a/include/linux/dynamic_debug.h b/include/linux/dynamic_debug.h index 02a1abdc5b3f..27cae68552e5 100644 --- a/include/linux/dynamic_debug.h +++ b/include/linux/dynamic_debug.h @@ -102,8 +102,8 @@ struct _ddebug_info { =20 struct ddebug_class_param { union { - unsigned long *bits; - unsigned int *lvl; + u32 *bits; + u32 *lvl; }; char flags[8]; const struct ddebug_class_map *map; diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c index 4d5f495968d9..fd47ae5078e5 100644 --- a/lib/dynamic_debug.c +++ b/lib/dynamic_debug.c @@ -585,6 +585,7 @@ static int ddebug_exec_query(char *query_string, const = char *modname) pr_err("query parse failed\n"); return -EINVAL; } + /* actually go and implement the change */ nfound =3D ddebug_change(&query, &modifiers); v3pr_info_dq(&query, nfound ? "applied" : "no-match"); @@ -635,8 +636,7 @@ static int ddebug_exec_queries(char *query, const char = *modname) =20 /* apply a new class-param setting */ static int ddebug_apply_class_bitmap(const struct ddebug_class_param *dcp, - const unsigned long *new_bits, - const unsigned long old_bits, + const u32 *new_bits, const u32 old_bits, const char *query_modname) { #define QUERY_SIZE 128 @@ -646,24 +646,27 @@ static int ddebug_apply_class_bitmap(const struct dde= bug_class_param *dcp, int bi, ct; =20 if (*new_bits !=3D old_bits) - v2pr_info("apply bitmap: 0x%lx to: 0x%lx for %s\n", *new_bits, + v2pr_info("apply bitmap: 0x%x to: 0x%x for %s\n", *new_bits, old_bits, query_modname ?: "'*'"); =20 - for (bi =3D 0; bi < map->length; bi++) { - if (test_bit(bi, new_bits) =3D=3D test_bit(bi, &old_bits)) + for (bi =3D 0; bi < map->length && bi < 32; bi++) { + bool new_b =3D !!(*new_bits & BIT(bi)); + bool old_b =3D !!(old_bits & BIT(bi)); + + if (new_b =3D=3D old_b) continue; =20 snprintf(query, QUERY_SIZE, "class %s %c%s", map->class_names[bi], - test_bit(bi, new_bits) ? '+' : '-', dcp->flags); + new_b ? '+' : '-', dcp->flags); =20 ct =3D ddebug_exec_queries(query, query_modname); matches +=3D ct; =20 - v2pr_info("bit_%d: %d matches on class: %s -> 0x%lx\n", bi, + v2pr_info("bit_%d: %d matches on class: %s -> 0x%x\n", bi, ct, map->class_names[bi], *new_bits); } if (*new_bits !=3D old_bits) - v2pr_info("applied bitmap: 0x%lx to: 0x%lx for %s\n", *new_bits, + v2pr_info("applied bitmap: 0x%x to: 0x%x for %s\n", *new_bits, old_bits, query_modname ?: "'*'"); =20 return matches; @@ -672,7 +675,7 @@ static int ddebug_apply_class_bitmap(const struct ddebu= g_class_param *dcp, /* stub to later conditionally add "$module." prefix where not already don= e */ #define KP_NAME(kp) kp->name =20 -#define CLASSMAP_BITMASK(width) ((1UL << (width)) - 1) +#define CLASSMAP_BITMASK(width) ((width) >=3D 32 ? ~0U : (1U << (width)) -= 1) =20 /* * param-setter helper to validate numeric input, clamp its value by @@ -684,10 +687,10 @@ static int param_set_dyndbg_module_classes(const char= *instr, { const struct ddebug_class_param *dcp =3D kp->arg; const struct ddebug_class_map *map =3D dcp->map; - unsigned long inrep, new_bits, old_bits, old_val; + u32 inrep, new_bits, old_bits, old_val; int rc, totct =3D 0; =20 - rc =3D kstrtoul(instr, 0, &inrep); + rc =3D kstrtou32(instr, 0, &inrep); if (rc) { int len =3D strcspn(instr, "\n"); =20 @@ -700,26 +703,26 @@ static int param_set_dyndbg_module_classes(const char= *instr, case DD_CLASS_TYPE_DISJOINT_BITS: /* expect bits. mask and warn if too many */ if (inrep & ~CLASSMAP_BITMASK(map->length)) { - pr_warn("%s: input: 0x%lx exceeds mask: 0x%lx, masking\n", + pr_warn("%s: input: 0x%x exceeds mask: 0x%x, masking\n", KP_NAME(kp), inrep, CLASSMAP_BITMASK(map->length)); inrep &=3D CLASSMAP_BITMASK(map->length); } old_val =3D READ_ONCE(*dcp->bits); - v2pr_info("bits:0x%lx > %s.%s\n", inrep, mod_name ?: "*", KP_NAME(kp)); + v2pr_info("bits:0x%x > %s.%s\n", inrep, mod_name ?: "*", KP_NAME(kp)); totct +=3D ddebug_apply_class_bitmap(dcp, &inrep, old_val, mod_name); WRITE_ONCE(*dcp->bits, inrep); break; case DD_CLASS_TYPE_LEVEL_NUM: /* input is bitpos, of highest verbosity to be enabled */ if (inrep > map->length) { - pr_warn("%s: level:%ld exceeds max:%d, clamping\n", + pr_warn("%s: level:%u exceeds max:%d, clamping\n", KP_NAME(kp), inrep, map->length); inrep =3D map->length; } old_val =3D READ_ONCE(*dcp->lvl); old_bits =3D CLASSMAP_BITMASK(old_val); new_bits =3D CLASSMAP_BITMASK(inrep); - v2pr_info("lvl:%ld bits:0x%lx > %s\n", inrep, new_bits, KP_NAME(kp)); + v2pr_info("lvl:%u bits:0x%x > %s\n", inrep, new_bits, KP_NAME(kp)); totct +=3D ddebug_apply_class_bitmap(dcp, &new_bits, old_bits, mod_name); WRITE_ONCE(*dcp->lvl, inrep); break; @@ -765,9 +768,9 @@ int param_get_dyndbg_classes(char *buffer, const struct= kernel_param *kp) =20 switch (map->map_type) { case DD_CLASS_TYPE_DISJOINT_BITS: - return scnprintf(buffer, PAGE_SIZE, "0x%lx\n", *dcp->bits); + return scnprintf(buffer, PAGE_SIZE, "0x%x\n", *dcp->bits); case DD_CLASS_TYPE_LEVEL_NUM: - return scnprintf(buffer, PAGE_SIZE, "%d\n", *dcp->lvl); + return scnprintf(buffer, PAGE_SIZE, "%u\n", *dcp->lvl); default: return -1; } diff --git a/lib/test_dynamic_debug.c b/lib/test_dynamic_debug.c index 74d183ebf3e0..9e8e028461ad 100644 --- a/lib/test_dynamic_debug.c +++ b/lib/test_dynamic_debug.c @@ -40,7 +40,7 @@ module_param_cb(do_prints, ¶m_ops_do_prints, NULL, 06= 00); * - tie together sysname, mapname, bitsname, flagsname */ #define DD_SYS_WRAP(_model, _flags) \ - static unsigned long bits_##_model; \ + static u32 bits_##_model; \ static struct ddebug_class_param _flags##_model =3D { \ .bits =3D &bits_##_model, \ .flags =3D #_flags, \ --=20 2.55.0 From nobody Fri Sep 25 04:43:45 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D482D5335B6; Wed, 16 Sep 2026 15:33:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789572783; cv=none; b=QO3xaLtz3M3spZsgCznfu+bSAtbJaMT8H5JoG2QKH5JE9nOiyqH0f6co5PCNrw6/3asHdP+9VNCfVBKHtA8VwsGOaaHvn9R3xNCwWVYMzM4y4Blmu/Zk3YuC7t9S8hjZKH8QT0NSWHiTDjsUv5S/fIuwk0m2ASN122VRV0XFEVA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789572783; c=relaxed/simple; bh=WmX1kAS5hl/l1I5IkY3+K+zj5i7OxNKys2bO0oqggyI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=nMQsHogciVTcSFs/GyB8/IqcWi/e2BB08gSW6kBssbxpJA5h1IBIjWCmRhwMaqspU4CVhFc9yttSk1GF+xQZR9MUv/U7V+FJyp4R4TsnwZoE5HiMDf0Q5w0VPpc030n24uZc3Aa8dGGd1rWWlMBcQnDVYHD76Ao5GVRM9pPPxKU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=NdFHBYOo; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="NdFHBYOo" Received: by smtp.kernel.org (Postfix) with ESMTPS id 8EF0DC4AF0B; Wed, 16 Sep 2026 15:33:01 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1789572781; bh=WmX1kAS5hl/l1I5IkY3+K+zj5i7OxNKys2bO0oqggyI=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=NdFHBYOoPOQ2v6RE4PqRcACzqkjo2zG7m+Gqn89hJOG33srLAvu26Xoh/mf/VU83N /4r1kvMNyEbwhIMh7Sr/xLjKdJSe+pXIIWx3HL2iAo50hlbsQjji1bBE6CRNbW2PmA gfZxuQbzQ2U1Xh+xg7iZVQr2AUpO08ZQpstnNd7flK9NGtjZdjCIMyqtmSdmwFGzaF hEUgdQLybCMaJ3UbTX0uMhMw0GS2Sef4IPEo2YWM+WIhJ564AWL5pDrmiJP8sdZN5Z 7NSPjTezz3033eXliI7NCv0aKyuKrfrO1ZGXkioCHWpku5wf1dIRSjsQXboBVNxSR8 tGTrgHTL5B3ow== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 78E81C982C4; Wed, 16 Sep 2026 15:33:01 +0000 (UTC) From: Jim Cromie via B4 Relay Date: Wed, 16 Sep 2026 09:33:12 -0600 Subject: [PATCH v10 20/38] dyndbg,module: make proper substructs in _ddebug_info Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260916-dd-cmap-part2-clean-v10-20-af4cf4767707@gmail.com> References: <20260916-dd-cmap-part2-clean-v10-0-af4cf4767707@gmail.com> In-Reply-To: <20260916-dd-cmap-part2-clean-v10-0-af4cf4767707@gmail.com> To: Jason Baron , Shuah Khan , Andrew Morton , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Arnd Bergmann , Luis Chamberlain , Petr Pavlu , Daniel Gomez , Sami Tolvanen , Aaron Tomlin , Jonathan Corbet , Greg Kroah-Hartman , Nathan Chancellor , Nicolas Schier , Shuah Khan , Randy Dunlap , "Rafael J. Wysocki" , Pavel Machek , Len Brown Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-arch@vger.kernel.org, linux-modules@vger.kernel.org, linux-doc@vger.kernel.org, linux-kbuild@vger.kernel.org, linux-pm@vger.kernel.org, Jim Cromie , Louis Chauvet X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789572777; l=16013; i=jim.cromie@gmail.com; s=20260203; h=from:subject:message-id; bh=wsb/TwkQtKyw4yBiHKe/43VKubeYwJRjuzYB+PSb3hc=; b=se4m1PXVfCkap6rfzfyMDoOMIonDVpvCNA6FZ7bu2G/8Q84Mwwl4BCS2w3HZgv1DQLap45IU1 IWJ60tJiw++BFW80fP+zhvfM+vkcyj7PCdnr0X2btqiQZvOkhOYbXDw X-Developer-Key: i=jim.cromie@gmail.com; a=ed25519; pk=C6E5ODlPQo7ZBynATXH9wg7K6HxP0pIXyf4s38Qw0XE= X-Endpoint-Received: by B4 Relay for jim.cromie@gmail.com/20260203 with auth_id=958 X-Original-From: Jim Cromie Reply-To: jim.cromie@gmail.com From: 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 _ddebug_info's use as a cursor into relevant data for a builtin module, and access to the full _ddebug state for modules. NOTES: rename section:__dyndbg_classes to _class_maps, to better align with struct _ddebug_class_maps. names together, for more obvious name pairing. 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. Signed-off-by: Jim Cromie Reviewed-by: Louis Chauvet --- v8: set maps.len =3D nc unconditionally v3: squash in section name changes. v2: Move RvB after SoB In structs _ddebug_descs & _ddebug_class_maps, change int length to unsigne= d int No use of <0 vals is contemplated. dyndbg: improve section names change __dyndbg to __dyndbg_descs change __dyndbg_classes to __dyndbg_class_maps this sets up for adding __dyndbg_class_users fixup-drmprint --- include/asm-generic/dyndbg.lds.h | 14 +++--- include/linux/dynamic_debug.h | 34 ++++++++----- kernel/module/main.c | 12 ++--- lib/dynamic_debug.c | 101 +++++++++++++++++++----------------= ---- 4 files changed, 86 insertions(+), 75 deletions(-) diff --git a/include/asm-generic/dyndbg.lds.h b/include/asm-generic/dyndbg.= lds.h index 9d8951bef688..ec661f9f3793 100644 --- a/include/asm-generic/dyndbg.lds.h +++ b/include/asm-generic/dyndbg.lds.h @@ -3,16 +3,16 @@ #define __ASM_GENERIC_DYNDBG_LDS_H =20 #include -#define DYNDBG_SECTIONS() \ - BOUNDED_SECTION_BY(__dyndbg, ___dyndbg) \ - BOUNDED_SECTION_BY(__dyndbg_classes, ___dyndbg_classes) +#define DYNDBG_SECTIONS() \ + BOUNDED_SECTION_BY(__dyndbg_descs, ___dyndbg_descs) \ + BOUNDED_SECTION_BY(__dyndbg_class_maps, ___dyndbg_class_maps) =20 #define MOD_DYNDBG_SECTIONS() \ - __dyndbg 0 : ALIGN(8) { \ - KEEP(*(__dyndbg)) \ + __dyndbg_descs 0 : ALIGN(8) { \ + KEEP(*(__dyndbg_descs)) \ } \ - __dyndbg_classes 0 : ALIGN(8) { \ - KEEP(*(__dyndbg_classes)) \ + __dyndbg_class_maps 0 : ALIGN(8) { \ + KEEP(*(__dyndbg_class_maps)) \ } =20 #endif /* __ASM_GENERIC_DYNDBG_LDS_H */ diff --git a/include/linux/dynamic_debug.h b/include/linux/dynamic_debug.h index 27cae68552e5..ec9b2544d537 100644 --- a/include/linux/dynamic_debug.h +++ b/include/linux/dynamic_debug.h @@ -84,7 +84,7 @@ enum ddebug_class_map_type { }; =20 struct ddebug_class_map { - struct module *mod; + struct module *mod; /* NULL for builtins */ const char *mod_name; /* needed for builtins */ const char **class_names; const int length; @@ -92,12 +92,24 @@ struct ddebug_class_map { enum ddebug_class_map_type map_type; }; =20 -/* 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; + unsigned int len; +}; + +struct _ddebug_class_maps { + struct ddebug_class_map *start; + unsigned 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; }; =20 struct ddebug_class_param { @@ -118,7 +130,7 @@ struct ddebug_class_param { =20 /** * DECLARE_DYNDBG_CLASSMAP - declare classnames known by a module - * @_var: a struct _ddebug_class_map, passed to module_param_cb + * @_var: a struct ddebug_class_map, passed to module_param_cb * @_maptype: enum ddebug_class_map_type, chooses bits/verbose * @_base: offset of 1st class-name. splits .class_id space * @classes: class-names used to control class'd prdbgs @@ -126,7 +138,7 @@ struct ddebug_class_param { #define DECLARE_DYNDBG_CLASSMAP(_var, _maptype, _base, ...) \ static const char *_var##_classnames[] =3D { __VA_ARGS__ }; \ static struct ddebug_class_map __aligned(8) __used \ - __section("__dyndbg_classes") _var =3D { \ + __section("__dyndbg_class_maps") _var =3D { \ .mod =3D THIS_MODULE, \ .mod_name =3D DDEBUG_MODNAME, \ .base =3D _base, \ @@ -166,7 +178,7 @@ void __dynamic_ibdev_dbg(struct _ddebug *descriptor, =20 #define DEFINE_DYNAMIC_DEBUG_METADATA_CLS(name, cls, fmt) \ static struct _ddebug __aligned(8) \ - __section("__dyndbg") name =3D { \ + __section("__dyndbg_descs") name =3D { \ .modname =3D DDEBUG_MODNAME, \ .function =3D __func__, \ .filename =3D __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__) =20 @@ -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 c1b34dc1e89a..852cce2c5113 100644 --- a/kernel/module/main.c +++ b/kernel/module/main.c @@ -2785,12 +2785,12 @@ static int find_module_sections(struct module *mod,= struct load_info *info) pr_warn("%s: Ignoring obsolete parameters\n", mod->name); =20 #ifdef CONFIG_DYNAMIC_DEBUG_CORE - mod->dyndbg_info.descs =3D section_objs(info, "__dyndbg", - sizeof(*mod->dyndbg_info.descs), - &mod->dyndbg_info.num_descs); - mod->dyndbg_info.classes =3D section_objs(info, "__dyndbg_classes", - sizeof(*mod->dyndbg_info.classes), - &mod->dyndbg_info.num_classes); + mod->dyndbg_info.descs.start =3D section_objs(info, "__dyndbg_descs", + sizeof(*mod->dyndbg_info.descs.start), + &mod->dyndbg_info.descs.len); + mod->dyndbg_info.maps.start =3D section_objs(info, "__dyndbg_class_maps", + sizeof(*mod->dyndbg_info.maps.start), + &mod->dyndbg_info.maps.len); #endif =20 return 0; diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c index fd47ae5078e5..cc685d4a8bfe 100644 --- a/lib/dynamic_debug.c +++ b/lib/dynamic_debug.c @@ -39,17 +39,15 @@ =20 #include =20 -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[]; =20 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; }; =20 struct ddebug_query { @@ -159,18 +157,18 @@ static void v3pr_info_dq(const struct ddebug_query *q= uery, const char *msg) * @_vec: name of a member in @_box */ #define for_subvec(_i, _sp, _box, _vec) \ - for ((_i) =3D 0, (_sp) =3D (_box)->_vec; \ - (_i) < (_box)->num_##_vec; \ + for ((_i) =3D 0, (_sp) =3D (_box)->_vec.start; \ + (_i) < (_box)->_vec.len; \ (_i)++, (_sp)++) /* { block } */ =20 static struct ddebug_class_map *ddebug_find_valid_class(struct ddebug_tabl= e const *dt, - const char *class_string, - int *class_id) + const char *class_string, + int *class_id) { struct ddebug_class_map *map; int i, idx; =20 - for_subvec(i, map, dt, classes) { + for_subvec(i, map, &dt->info, maps) { idx =3D match_string(map->class_names, map->length, class_string); if (idx >=3D 0) { *class_id =3D idx + map->base; @@ -270,8 +268,8 @@ static int ddebug_change(const struct ddebug_query *que= ry, valid_class =3D _DPRINTK_CLASS_DFLT; } =20 - for (i =3D 0; i < dt->num_ddebugs; i++) { - struct _ddebug *dp =3D &dt->ddebugs[i]; + for (i =3D 0; i < dt->info.descs.len; i++) { + struct _ddebug *dp =3D &dt->info.descs.start[i]; =20 if (!ddebug_match_desc(query, dp, valid_class)) continue; @@ -1011,8 +1009,8 @@ static struct _ddebug *ddebug_iter_first(struct ddebu= g_iter *iter) } iter->table =3D list_entry(ddebug_tables.next, struct ddebug_table, link); - iter->idx =3D iter->table->num_ddebugs; - return &iter->table->ddebugs[--iter->idx]; + iter->idx =3D iter->table->info.descs.len; + return &iter->table->info.descs.start[--iter->idx]; } =20 /* @@ -1033,10 +1031,10 @@ static struct _ddebug *ddebug_iter_next(struct ddeb= ug_iter *iter) } iter->table =3D list_entry(iter->table->link.next, struct ddebug_table, link); - iter->idx =3D iter->table->num_ddebugs; + iter->idx =3D iter->table->info.descs.len; --iter->idx; } - return &iter->table->ddebugs[iter->idx]; + return &iter->table->info.descs.start[iter->idx]; } =20 /* @@ -1080,16 +1078,19 @@ static void *ddebug_proc_next(struct seq_file *m, v= oid *p, loff_t *pos) return dp; } =20 -#define class_in_range(class_id, map) \ - (class_id >=3D 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 >=3D map->base && + class_id < map->base + map->length); +} =20 -static const char *ddebug_class_name(struct ddebug_iter *iter, struct _dde= bug *dp) +static const char *ddebug_class_name(struct ddebug_table *dt, struct _ddeb= ug *dp) { - struct ddebug_class_map *map =3D iter->table->classes; - int i, nc =3D iter->table->num_classes; + struct ddebug_class_map *map; + int i; =20 - for (i =3D 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]; =20 return NULL; @@ -1122,7 +1123,7 @@ static int ddebug_proc_show(struct seq_file *m, void = *p) seq_putc(m, '"'); =20 if (dp->class_id !=3D _DPRINTK_CLASS_DFLT) { - class =3D ddebug_class_name(iter, dp); + class =3D ddebug_class_name(iter->table, dp); if (class) seq_printf(m, " class:%s", class); else @@ -1182,12 +1183,12 @@ static void ddebug_attach_module_classes(struct dde= bug_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 =3D cm; + dt->info.maps.start =3D cm; } nc++; } else if (nc) { @@ -1195,10 +1196,9 @@ static void ddebug_attach_module_classes(struct ddeb= ug_table *dt, struct _ddebug break; } } - if (nc) { - dt->num_classes =3D nc; + dt->info.maps.len =3D nc; + if (nc) vpr_info("module:%s attached %d classes\n", dt->mod_name, nc); - } } =20 /* @@ -1209,10 +1209,10 @@ static int ddebug_add_module(struct _ddebug_info *d= i, const char *modname) { struct ddebug_table *dt; =20 - if (!di->num_descs) + if (!di->descs.len) return 0; =20 - v3pr_info("add-module: %s %d sites\n", modname, di->num_descs); + v3pr_info("add-module: %s %d sites\n", modname, di->descs.len); =20 dt =3D kzalloc_obj(*dt); if (dt =3D=3D NULL) { @@ -1226,19 +1226,18 @@ static int ddebug_add_module(struct _ddebug_info *d= i, const char *modname) * this struct ddebug_table. */ dt->mod_name =3D modname; - dt->ddebugs =3D di->descs; - dt->num_ddebugs =3D di->num_descs; + dt->info =3D *di; =20 INIT_LIST_HEAD(&dt->link); =20 - if (di->classes && di->num_classes) + if (di->maps.len) ddebug_attach_module_classes(dt, di); =20 mutex_lock(&ddebug_lock); list_add_tail(&dt->link, &ddebug_tables); mutex_unlock(&ddebug_lock); =20 - 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; } =20 @@ -1385,10 +1384,10 @@ static int __init dynamic_debug_init(void) char *cmdline; =20 struct _ddebug_info di =3D { - .descs =3D __start___dyndbg, - .classes =3D __start___dyndbg_classes, - .num_descs =3D __stop___dyndbg - __start___dyndbg, - .num_classes =3D __stop___dyndbg_classes - __start___dyndbg_classes, + .descs.start =3D __start___dyndbg_descs, + .maps.start =3D __start___dyndbg_class_maps, + .descs.len =3D __stop___dyndbg_descs - __start___dyndbg_descs, + .maps.len =3D __stop___dyndbg_class_maps - __start___dyndbg_class_maps, }; =20 #ifdef CONFIG_MODULES @@ -1399,7 +1398,7 @@ static int __init dynamic_debug_init(void) } #endif /* CONFIG_MODULES */ =20 - if (&__start___dyndbg =3D=3D &__stop___dyndbg) { + if (&__start___dyndbg_descs =3D=3D &__stop___dyndbg_descs) { if (IS_ENABLED(CONFIG_DYNAMIC_DEBUG)) { pr_warn("_ddebug table is empty in a CONFIG_DYNAMIC_DEBUG build\n"); return 1; @@ -1409,14 +1408,14 @@ static int __init dynamic_debug_init(void) return 0; } =20 - iter =3D iter_mod_start =3D __start___dyndbg; + iter =3D iter_mod_start =3D __start___dyndbg_descs; modname =3D iter->modname; i =3D mod_sites =3D mod_ct =3D 0; =20 - for (; iter < __stop___dyndbg; iter++, i++, mod_sites++) { + for (; iter < __stop___dyndbg_descs; iter++, i++, mod_sites++) { if (strcmp(modname, iter->modname)) { - di.descs =3D iter_mod_start; - di.num_descs =3D mod_sites; + di.descs.len =3D mod_sites; + di.descs.start =3D iter_mod_start; ret =3D ddebug_add_module(&di, modname); if (ret) goto out_err; @@ -1429,8 +1428,8 @@ static int __init dynamic_debug_init(void) } } =20 - di.descs =3D iter_mod_start; - di.num_descs =3D mod_sites; + di.descs.len =3D mod_sites; + di.descs.start =3D iter_mod_start; ret =3D ddebug_add_module(&di, modname); if (ret) goto out_err; @@ -1438,12 +1437,12 @@ static int __init dynamic_debug_init(void) mod_ct++; =20 ddebug_init_success =3D 1; - vpr_info("%d prdebugs in %d modules, %d KiB in ddebug tables, %d kiB in _= _dyndbg section\n", + vpr_info("%d prdebugs in %d modules, %d KiB in ddebug tables, %d kiB in _= _dyndbg_descs section\n", i, mod_ct, (int)((mod_ct * sizeof(struct ddebug_table)) >> 10), (int)((i * sizeof(struct _ddebug)) >> 10)); =20 - 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); =20 /* now that ddebug tables are loaded, process all boot args * again to find and activate queries given in dyndbg params. --=20 2.55.0 From nobody Fri Sep 25 04:43:45 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9885753FD5A; Wed, 16 Sep 2026 15:33:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789572785; cv=none; b=OQfVde6rp2yMkmu1oGGOMbco+HUl0XFfM8QygpsbCv3ZJfKmVR35z9KLxxrJDf+VBo+Cz4+EpqZEzDFpT76sX/7BbabW21a/2EJTqErzABlGxW47o4fkxllCO18AKgub81bG0J9x50Wb2SGdI/J5IFC3yFLgzwU9h/UTdmsJQQ0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789572785; c=relaxed/simple; bh=PYm+5X4sXMSZ0BCGf8DR7JplIKT/UD5Enw2UHUdb8/M=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=j7YUbra8OHfqwhJnCVd2FdJ5WI6c1v9PL0t7AgavCkfFS0ClOqh9y0TyolSSVPuhn0c1S4qe9jYp85D5rbcyiip/7s+HOqt7Et80NAqXgAiVqab1LlH9lYEb7IdgPM5j2enRLBPJN3eDYhy6EOnZJfsCWXzrona9q/tlebQ87rY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=sCVbcvk7; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="sCVbcvk7" Received: by smtp.kernel.org (Postfix) with ESMTPS id AA760C4AF0E; Wed, 16 Sep 2026 15:33:01 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1789572781; bh=PYm+5X4sXMSZ0BCGf8DR7JplIKT/UD5Enw2UHUdb8/M=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=sCVbcvk7FVBQgx2hZBHiqdQOQnOYhLzdEdtCwq9syfqQPMZxtbCt1WYaCLH36OnbC WOqjdvDG2hXJ9kpCi5jGIjwaXNiT0X0lFG0cRU342+Wru0GNt/GmEP4FETE+SEzHy8 TbiOp3rYTNUV4oRBDRwEq34rcLoeLxXWW3ZdKzJajWeO14Q0ohX3lDElseFumYIflJ B96ltUZgaz5uQGT8vbTEOMC+o5hPFLrQwxBQTQsg8qYeoxWPy5C9gUGIHBuP/27MgJ UkjHjn0ASy70Dt7MmwHZBpx4Dwaafo/pxpLU1NibdO31iyyLsNJvv7aF+uHj76eDas Cl6Apk2C59MZg== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 92DDEC982C9; Wed, 16 Sep 2026 15:33:01 +0000 (UTC) From: Jim Cromie via B4 Relay Date: Wed, 16 Sep 2026 09:33:13 -0600 Subject: [PATCH v10 21/38] dyndbg: move mod_name down from struct ddebug_table to _ddebug_info Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260916-dd-cmap-part2-clean-v10-21-af4cf4767707@gmail.com> References: <20260916-dd-cmap-part2-clean-v10-0-af4cf4767707@gmail.com> In-Reply-To: <20260916-dd-cmap-part2-clean-v10-0-af4cf4767707@gmail.com> To: Jason Baron , Shuah Khan , Andrew Morton , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Arnd Bergmann , Luis Chamberlain , Petr Pavlu , Daniel Gomez , Sami Tolvanen , Aaron Tomlin , Jonathan Corbet , Greg Kroah-Hartman , Nathan Chancellor , Nicolas Schier , Shuah Khan , Randy Dunlap , "Rafael J. Wysocki" , Pavel Machek , Len Brown Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-arch@vger.kernel.org, linux-modules@vger.kernel.org, linux-doc@vger.kernel.org, linux-kbuild@vger.kernel.org, linux-pm@vger.kernel.org, Jim Cromie , Louis Chauvet X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789572777; l=7681; i=jim.cromie@gmail.com; s=20260203; h=from:subject:message-id; bh=NOnh/2IbtKQJ9B2L2I6AwuYdRWo9IZfGyiCqpeyE2yA=; b=AIPfMdNPYMgcsOuWKEpnL4vTry2ZO5Z6dzmrXm0+1Nnzl63U9/oH/1s+PXeCCIsCZsVFf7+L+ s5t1IDpDif8AQOTR5z0DVzo7lwFVX0yuF8/4yA1VGHFNt/jSe+5fESA X-Developer-Key: i=jim.cromie@gmail.com; a=ed25519; pk=C6E5ODlPQo7ZBynATXH9wg7K6HxP0pIXyf4s38Qw0XE= X-Endpoint-Received: by B4 Relay for jim.cromie@gmail.com/20260203 with auth_id=958 X-Original-From: Jim Cromie Reply-To: jim.cromie@gmail.com From: Jim Cromie struct _ddebug_info already has most of dyndbg's info for a module; push debug_table.mod_name down into it, finishing the encapsulation. This allows refactoring several callchains, passing &_ddebug_info instead of &ddebug_table, and hoisting the "&dt->info" deref up instead of repeating it thru the callchans ddebug_table contains a _ddebug_info member, so code with a ptr to a ddebug_table still have access to mod_name, just now with "->info." added in. In static ddebug_add_module(&di), reinforce the cursor-model by dropping the modname arg, and setting di->mod_name at each caller. Signed-off-by: Jim Cromie Reviewed-by: Louis Chauvet --- v2: move RvB after SoB old-v12 . moved up 1 position in series, ahead of hoist... --- include/linux/dynamic_debug.h | 1 + lib/dynamic_debug.c | 50 ++++++++++++++++++++++-----------------= ---- 2 files changed, 27 insertions(+), 24 deletions(-) diff --git a/include/linux/dynamic_debug.h b/include/linux/dynamic_debug.h index ec9b2544d537..bf6039191fa7 100644 --- a/include/linux/dynamic_debug.h +++ b/include/linux/dynamic_debug.h @@ -108,6 +108,7 @@ struct _ddebug_class_maps { }; =20 struct _ddebug_info { + const char *mod_name; struct _ddebug_descs descs; struct _ddebug_class_maps maps; }; diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c index cc685d4a8bfe..2d507f9fc2fd 100644 --- a/lib/dynamic_debug.c +++ b/lib/dynamic_debug.c @@ -46,7 +46,6 @@ extern struct ddebug_class_map __stop___dyndbg_class_maps= []; =20 struct ddebug_table { struct list_head link; - const char *mod_name; struct _ddebug_info info; }; =20 @@ -253,10 +252,11 @@ static int ddebug_change(const struct ddebug_query *q= uery, /* search for matching ddebugs */ mutex_lock(&ddebug_lock); list_for_each_entry(dt, &ddebug_tables, link) { + struct _ddebug_info *di =3D &dt->info; =20 /* match against the module name */ if (query->module && - !match_wildcard(query->module, dt->mod_name)) + !match_wildcard(query->module, di->mod_name)) continue; =20 if (query->class_string) { @@ -268,8 +268,8 @@ static int ddebug_change(const struct ddebug_query *que= ry, valid_class =3D _DPRINTK_CLASS_DFLT; } =20 - for (i =3D 0; i < dt->info.descs.len; i++) { - struct _ddebug *dp =3D &dt->info.descs.start[i]; + for (i =3D 0; i < di->descs.len; i++) { + struct _ddebug *dp =3D &di->descs.start[i]; =20 if (!ddebug_match_desc(query, dp, valid_class)) continue; @@ -289,7 +289,7 @@ static int ddebug_change(const struct ddebug_query *que= ry, #endif v4pr_info("changed %s:%d [%s]%s %s =3D> %s\n", trim_prefix(dp->filename), dp->lineno, - dt->mod_name, dp->function, + di->mod_name, dp->function, ddebug_describe_flags(dp->flags, &fbuf), ddebug_describe_flags(newflags, &nbuf)); dp->flags =3D newflags; @@ -1084,12 +1084,12 @@ static bool ddebug_class_in_range(const int class_i= d, const struct ddebug_class_ class_id < map->base + map->length); } =20 -static const char *ddebug_class_name(struct ddebug_table *dt, struct _ddeb= ug *dp) +static const char *ddebug_class_name(struct _ddebug_info *di, struct _ddeb= ug *dp) { struct ddebug_class_map *map; int i; =20 - for_subvec(i, map, &dt->info, maps) + for_subvec(i, map, di, maps) if (ddebug_class_in_range(dp->class_id, map)) return map->class_names[dp->class_id - map->base]; =20 @@ -1117,13 +1117,13 @@ static int ddebug_proc_show(struct seq_file *m, voi= d *p) =20 seq_printf(m, "%s:%u [%s]%s =3D%s \"", trim_prefix(dp->filename), dp->lineno, - iter->table->mod_name, dp->function, + iter->table->info.mod_name, dp->function, ddebug_describe_flags(dp->flags, &flags)); seq_escape_str(m, dp->format, ESCAPE_SPACE, "\t\r\n\""); seq_putc(m, '"'); =20 if (dp->class_id !=3D _DPRINTK_CLASS_DFLT) { - class =3D ddebug_class_name(iter->table, dp); + class =3D ddebug_class_name(&iter->table->info, dp); if (class) seq_printf(m, " class:%s", class); else @@ -1184,7 +1184,7 @@ static void ddebug_attach_module_classes(struct ddebu= g_table *dt, struct _ddebug * and length of the subrange at its edges. */ for_subvec(i, cm, di, maps) { - if (!strcmp(cm->mod_name, dt->mod_name)) { + if (!strcmp(cm->mod_name, dt->info.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); @@ -1198,34 +1198,33 @@ static void ddebug_attach_module_classes(struct dde= bug_table *dt, struct _ddebug } dt->info.maps.len =3D nc; if (nc) - vpr_info("module:%s attached %d classes\n", dt->mod_name, nc); + vpr_info("module:%s attached %d classes\n", dt->info.mod_name, nc); } =20 /* * Allocate a new ddebug_table for the given module * and add it to the global list. */ -static int ddebug_add_module(struct _ddebug_info *di, const char *modname) +static int ddebug_add_module(struct _ddebug_info *di) { struct ddebug_table *dt; =20 if (!di->descs.len) return 0; =20 - v3pr_info("add-module: %s %d sites\n", modname, di->descs.len); + v3pr_info("add-module: %s %d sites\n", di->mod_name, di->descs.len); =20 dt =3D kzalloc_obj(*dt); if (dt =3D=3D NULL) { - pr_err("error adding module: %s\n", modname); + pr_err("error adding module: %s\n", di->mod_name); return -ENOMEM; } /* - * For built-in modules, name lives in .rodata and is - * immortal. For loaded modules, name points at the name[] - * member of struct module, which lives at least as long as - * this struct ddebug_table. + * For built-in modules, name (as supplied in di by its + * callers) lives in .rodata and is immortal. For loaded + * modules, name points at the name[] member of struct module, + * which lives at least as long as this struct ddebug_table. */ - dt->mod_name =3D modname; dt->info =3D *di; =20 INIT_LIST_HEAD(&dt->link); @@ -1237,7 +1236,7 @@ static int ddebug_add_module(struct _ddebug_info *di,= const char *modname) list_add_tail(&dt->link, &ddebug_tables); mutex_unlock(&ddebug_lock); =20 - vpr_info("%3u debug prints in module %s\n", di->descs.len, modname); + vpr_info("%3u debug prints in module %s\n", di->descs.len, di->mod_name); return 0; } =20 @@ -1300,7 +1299,7 @@ static int ddebug_remove_module(const char *mod_name) =20 mutex_lock(&ddebug_lock); list_for_each_entry_safe(dt, nextdt, &ddebug_tables, link) { - if (dt->mod_name =3D=3D mod_name) { + if (dt->info.mod_name =3D=3D mod_name) { ddebug_table_free(dt); ret =3D 0; break; @@ -1320,7 +1319,8 @@ static int ddebug_module_notify(struct notifier_block= *self, unsigned long val, =20 switch (val) { case MODULE_STATE_COMING: - ret =3D ddebug_add_module(&mod->dyndbg_info, mod->name); + mod->dyndbg_info.mod_name =3D mod->name; + ret =3D ddebug_add_module(&mod->dyndbg_info); if (ret) WARN(1, "Failed to allocate memory: dyndbg may not work properly.\n"); break; @@ -1416,7 +1416,8 @@ static int __init dynamic_debug_init(void) if (strcmp(modname, iter->modname)) { di.descs.len =3D mod_sites; di.descs.start =3D iter_mod_start; - ret =3D ddebug_add_module(&di, modname); + di.mod_name =3D modname; + ret =3D ddebug_add_module(&di); if (ret) goto out_err; =20 @@ -1430,7 +1431,8 @@ static int __init dynamic_debug_init(void) =20 di.descs.len =3D mod_sites; di.descs.start =3D iter_mod_start; - ret =3D ddebug_add_module(&di, modname); + di.mod_name =3D modname; + ret =3D ddebug_add_module(&di); if (ret) goto out_err; =20 --=20 2.55.0 From nobody Fri Sep 25 04:43:45 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7636A3AD531; Wed, 16 Sep 2026 15:33:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789572785; cv=none; b=ThxXvUlsS9uxkJi9KQ8qSx9lwJk9x0hFeMJMwGbZ3f+7LiPGiJ9/Uncy6BJekx63ilQ846cmraKCXTRlQitrw9hHEyYnZ9IT/HMUnAB3axWRfEu/QYrPcMhAJ1Ku01mYbP97/1Von16vyFa9mJiywqh4KqVrXMtwkuF5p/AX+Pc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789572785; c=relaxed/simple; bh=0YO372m4O5eGJdMqN95MO+y9CrgYXjAwBpyWBPYy/PM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=eaLvzcLRYFUq7a8bCIkV8ywlJMuWAI24CYMh4d+uGfOb9/d01Pb3xZmMZUhp5YBFgDzFHXIawVIzuFKWRyZqVnoDvHa3Z7IzYIeI8as/EQJLhaJEJeLiLCT3yyf5KwB2IiwBEH/o+V2XOt+qp04gyiWQWny3U8fv3nggpINYosA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Z3AgfSso; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="Z3AgfSso" Received: by smtp.kernel.org (Postfix) with ESMTPS id C0D63C4AF0D; Wed, 16 Sep 2026 15:33:01 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1789572781; bh=0YO372m4O5eGJdMqN95MO+y9CrgYXjAwBpyWBPYy/PM=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=Z3AgfSso80bFaH2lIK3ISEKWMDW7j9HfKwQSJ+lovMIuX+BsnmLeTlTYKD1TCcxzu S7kL/GhmYOY+O99XRWJdeRTl32bf2vHBc7gvDcbaeqCAOd1VRceVyZWQnrAiMwsWhF sfWex2fUeQsWgPyH9NWZtD0rRo1SW3RL+KpTV7vLPR6FA8PPLY0yIWTwrzRGMwoBG8 3QVzbvVzhCcOKjNY7BcjPV10flPXEe6SYKx/gKQbyygvuTF0ReRE6SXFu1aVMaGP+0 fVzQZvIx4dKdP1EIib9Td/UOVN172Kxq1SSgL5JeACJVjQrnWiOiyHhyx53hAnpkEJ 7eIZuUDdzNKPg== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id ABF68C982C4; Wed, 16 Sep 2026 15:33:01 +0000 (UTC) From: Jim Cromie via B4 Relay Date: Wed, 16 Sep 2026 09:33:14 -0600 Subject: [PATCH v10 22/38] dyndbg: hoist classmap-filter-by-modname up to ddebug_add_module Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260916-dd-cmap-part2-clean-v10-22-af4cf4767707@gmail.com> References: <20260916-dd-cmap-part2-clean-v10-0-af4cf4767707@gmail.com> In-Reply-To: <20260916-dd-cmap-part2-clean-v10-0-af4cf4767707@gmail.com> To: Jason Baron , Shuah Khan , Andrew Morton , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Arnd Bergmann , Luis Chamberlain , Petr Pavlu , Daniel Gomez , Sami Tolvanen , Aaron Tomlin , Jonathan Corbet , Greg Kroah-Hartman , Nathan Chancellor , Nicolas Schier , Shuah Khan , Randy Dunlap , "Rafael J. Wysocki" , Pavel Machek , Len Brown Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-arch@vger.kernel.org, linux-modules@vger.kernel.org, linux-doc@vger.kernel.org, linux-kbuild@vger.kernel.org, linux-pm@vger.kernel.org, Jim Cromie , Louis Chauvet X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789572777; l=5946; i=jim.cromie@gmail.com; s=20260203; h=from:subject:message-id; bh=eKuZxtCbmvfC8EvHzmuHa3LixD/cWlKY/tevl45Berg=; b=yb+7kknlJS2vbyOdJ2yVY9nsOPUaXhwwh1W2M/ahddijhwc+Vwm3K+cJvl5KMmox5o494C3h2 N6pXQLTkS9ZCUX7V2+vfEyv9AAXNjOCR2T5jOyoKe8mxev5GmfyrTOm X-Developer-Key: i=jim.cromie@gmail.com; a=ed25519; pk=C6E5ODlPQo7ZBynATXH9wg7K6HxP0pIXyf4s38Qw0XE= X-Endpoint-Received: by B4 Relay for jim.cromie@gmail.com/20260203 with auth_id=958 X-Original-From: Jim Cromie Reply-To: jim.cromie@gmail.com From: Jim Cromie The body of ddebug_attach_module_classes() is just a code-block that finds the contiguous subrange of classmaps matching on modname, and saves it into the ddebug_table's info record. Implement this block in a macro to accommodate different component vectors in the "box" (as named in the for_subvec macro). We will reuse this macro shortly. And hoist its invocation out of ddebug_attach_module_classes() up into ddebug_add_module(). This moves the filtering step up closer to dynamic_debug_init(), which already segments the builtin pr_debug descriptors on their mod_name boundaries. Signed-off-by: Jim Cromie Reviewed-by: Louis Chauvet --- v8: set maps.len =3D nc unconditionally v3: expand block-comment in ddebug_add_module v2: move RvB after SoB finish hoist - drop old fn - ddebug_attach_module_classes the v1 rev left the old ddebug_attach_module_classes in place, but it is completely redundant now, since it already lost the list-linking job it was doing. It was being cut out later in the patchset (in the unsent API adaptation phase), but for cleaner review, lets excise it now. OLD all-in-1-series (pre split into reviewable chunks) v10?- reordered params to match kdoc v12- refactor/rename: s/dd_mark_vector_subrange/dd_set_module_subrange/ 1. Renamed the macro from dd_mark_vector_subrange to dd_set_module_subrange to better reflect its purpose of narrowing a vector to a module-specific subrange. 2. Simplified the arguments by removing the redundant _dst, as the _di pointer already provides access to the target _ddebug_info struct. 3. Refactored for Clarity: Instead of overwriting the struct's start pointer while the for_subvec loop is using it to iterate, I introduced a temporary __start variable. This avoids the "subtle" side effect and makes the logic easier to follow. 4. Updated Documentation: Improved the comment block to explicitly state that the macro scans for the first match and counts contiguous elements. fiuxp --- lib/dynamic_debug.c | 79 +++++++++++++++++++++++++++++--------------------= ---- 1 file changed, 43 insertions(+), 36 deletions(-) diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c index 2d507f9fc2fd..03dc35af4faa 100644 --- a/lib/dynamic_debug.c +++ b/lib/dynamic_debug.c @@ -1173,33 +1173,34 @@ static const struct proc_ops proc_fops =3D { .proc_write =3D ddebug_proc_write }; =20 -static void ddebug_attach_module_classes(struct ddebug_table *dt, struct _= ddebug_info *di) -{ - struct ddebug_class_map *cm; - int i, nc =3D 0; - - /* - * 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_subvec(i, cm, di, maps) { - if (!strcmp(cm->mod_name, dt->info.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->info.maps.start =3D cm; - } - nc++; - } else if (nc) { - /* end of matching classmaps */ - break; - } - } - dt->info.maps.len =3D nc; - if (nc) - vpr_info("module:%s attached %d classes\n", dt->info.mod_name, nc); -} +/* + * dd_set_module_subrange - find matching subrange of classmaps + * @_i: caller-provided index var + * @_sp: cursor into @_vec + * @_di: pointer to the struct _ddebug_info to be narrowed + * @_vec: name of the vector member (must have .start and .len) + * + * Narrow a _ddebug_info's vector (@_vec) of classmaps to the + * contiguous subrange of elements where ->mod_name matches + * @__di->mod_name. This is primarily for builtins, loadable modules + * have only their classmaps, and dont need this sub-selection. + */ +#define dd_set_module_subrange(_i, _sp, _di, _vec) ({ \ + struct _ddebug_info *__di =3D (_di); \ + typeof(__di->_vec.start) __start =3D NULL; \ + int __nc =3D 0; \ + for_subvec(_i, _sp, __di, _vec) { \ + if (!strcmp((_sp)->mod_name, __di->mod_name)) { \ + if (!__nc++) \ + __start =3D (_sp); \ + } else if (__nc) { \ + break; /* end of consecutive matches */ \ + } \ + } \ + __di->_vec.len =3D __nc; \ + if (__nc) \ + __di->_vec.start =3D __start; \ +}) =20 /* * Allocate a new ddebug_table for the given module @@ -1208,6 +1209,8 @@ static void ddebug_attach_module_classes(struct ddebu= g_table *dt, struct _ddebug static int ddebug_add_module(struct _ddebug_info *di) { struct ddebug_table *dt; + struct ddebug_class_map *cm; + int i; =20 if (!di->descs.len) return 0; @@ -1220,17 +1223,21 @@ static int ddebug_add_module(struct _ddebug_info *d= i) return -ENOMEM; } /* - * For built-in modules, name (as supplied in di by its - * callers) lives in .rodata and is immortal. For loaded - * modules, name points at the name[] member of struct module, - * which lives at least as long as this struct ddebug_table. + * For built-in modules, di is a partial cursor into the + * builtin dyndbg data; the descriptors are the subrange + * matching the modname, but the classmaps are the full set. + * We find and set the relevant subrange of classmaps here. + * + * The modname string is in .rodata, the descriptors and + * classmaps are in writable .data. All are immortal. + * + * For loaded modules, mod_name points at the name[] member + * of struct module, and the descriptors and classmaps point + * at the module's ELF sections; all have lifetimes matching + * the module's presence. */ dt->info =3D *di; - - INIT_LIST_HEAD(&dt->link); - - if (di->maps.len) - ddebug_attach_module_classes(dt, di); + dd_set_module_subrange(i, cm, &dt->info, maps); =20 mutex_lock(&ddebug_lock); list_add_tail(&dt->link, &ddebug_tables); --=20 2.55.0 From nobody Fri Sep 25 04:43:45 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D53135335BE; Wed, 16 Sep 2026 15:33:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789572783; cv=none; b=LZK6ZuyFXnW7v7t5EKUxPyrhFMpwk0mVYE3uLSjyyVXqK9poZ21JJrh7IpfoCcxRjtewuEImdYA5Cy7AHmqpzrgwigxtVuCVsQ1p7YZGEUA/wixJ8AK/yTNgjmfRgNK27/pQPWlxW/2z+GduKrNMfcLn1RNRSn4KegnOXFPsC+w= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789572783; c=relaxed/simple; bh=RRDh6CZwRTyfZYMXWT0yB6RPMb2AV+la5fnGWbVDsFY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=lklsennHUZ0KeGR4l14CG8z0lX1rDovYJ8xjRzbXtf8sm+Ac2D5cY3Uso0vkUaOE3KU82jzMUWUhXyTnegWZqkxPiA+uLE9BK0CpPqQwJou2whoVwGV4MAVfLf018YriMzmGAAPabWck1Zdj0jcbnMFpNMUI8EKQuMNEJ1DYCP8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Z/OuvT8s; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="Z/OuvT8s" Received: by smtp.kernel.org (Postfix) with ESMTPS id DDCB2C4AF10; Wed, 16 Sep 2026 15:33:01 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1789572782; bh=RRDh6CZwRTyfZYMXWT0yB6RPMb2AV+la5fnGWbVDsFY=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=Z/OuvT8sW6cmY6B7z/q58WGfP6akOC8RxJ75qYHkHuL8JIdpUyWmPH5X0HoBZyfKm /r1yFWa+vsfLUuqA5w/BLSllbJufu1VbG5ON1hKqs4JVV3HeY+eNTLYG2mS22on0D+ Hp5cjZMKLSVch8cScGTdM/xTRXU6jggGt43yOhVRNumbleyf5Q+JQc7Z77xNbDH0KC cFOwKQ1CdgoEJtoW1w6XhVlh5xyYW34ukTdyt9+kIXvmOkMlAC3aaoMuIkBElnbmyw AnSdWEX0Za53fXgc7PdbaSiU2bOfr2OZ//iYcsz/Q+lZ8urhryaDUULlP+bls0s779 S2Z1ZMbcnjnyA== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id CADF2C982C3; Wed, 16 Sep 2026 15:33:01 +0000 (UTC) From: Jim Cromie via B4 Relay Date: Wed, 16 Sep 2026 09:33:15 -0600 Subject: [PATCH v10 23/38] dyndbg-API: replace DECLARE_DYNDBG_CLASSMAP Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260916-dd-cmap-part2-clean-v10-23-af4cf4767707@gmail.com> References: <20260916-dd-cmap-part2-clean-v10-0-af4cf4767707@gmail.com> In-Reply-To: <20260916-dd-cmap-part2-clean-v10-0-af4cf4767707@gmail.com> To: Jason Baron , Shuah Khan , Andrew Morton , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Arnd Bergmann , Luis Chamberlain , Petr Pavlu , Daniel Gomez , Sami Tolvanen , Aaron Tomlin , Jonathan Corbet , Greg Kroah-Hartman , Nathan Chancellor , Nicolas Schier , Shuah Khan , Randy Dunlap , "Rafael J. Wysocki" , Pavel Machek , Len Brown Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-arch@vger.kernel.org, linux-modules@vger.kernel.org, linux-doc@vger.kernel.org, linux-kbuild@vger.kernel.org, linux-pm@vger.kernel.org, Jim Cromie , Louis Chauvet X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789572777; l=31711; i=jim.cromie@gmail.com; s=20260203; h=from:subject:message-id; bh=b5KQQzVEJeZpr+XNPNMeg5WGuqsXvU81mK8T6Nr48L4=; b=IRC/XNLZvGnwC31ZiMBeCusuXMWQgJ+BVIqVxETxi0Gjaw15gxOMF6t416k3eh9kz/hqaE1tR o4G8sDXdV5cDf2S+P4o3qjEgWsZTEPrvchZXWWhj13LlAunfE8TPOD0 X-Developer-Key: i=jim.cromie@gmail.com; a=ed25519; pk=C6E5ODlPQo7ZBynATXH9wg7K6HxP0pIXyf4s38Qw0XE= X-Endpoint-Received: by B4 Relay for jim.cromie@gmail.com/20260203 with auth_id=958 X-Original-From: Jim Cromie Reply-To: jim.cromie@gmail.com From: Jim Cromie DECLARE_DYNDBG_CLASSMAP had a flaw: multiple invocations across both core and driver modules broke the K&R "define once, refer afterwards" principle, causing boot-time parameter propagation failures. Replace it with an explicit client-server model: - DYNAMIC_DEBUG_CLASSMAP_DEFINE: invoked once in the core module, creating and exporting the classmap. - DYNAMIC_DEBUG_CLASSMAP_USE: invoked across driver/helper modules, placing a reference record into the __dyndbg_class_users section. At module load time, dyndbg scans __dyndbg_class_users, resolves the reference to the parent classmap, finds the associated controlling kernel parameter, and automatically applies the initial bitmap to the loading module. Fixes: aad0214f3026 ("dyndbg: add DECLARE_DYNDBG_CLASSMAP macro") Cc: linux-doc@vger.kernel.org Reviewed-by: Louis Chauvet Signed-off-by: Jim Cromie --- v10: . pass init_bits computed from (_DPRINTK_FLAGS_DEFAULT & _DPRINTK_FLAGS_PRI= NT) in ddebug_sync_classbits() to properly disable -DDEBUG callsites. --- include/asm-generic/dyndbg.lds.h | 6 +- include/linux/dynamic_debug.h | 164 ++++++++++++++++++++++++++++---- kernel/module/main.c | 3 + lib/Kconfig.debug | 24 ++++- lib/Makefile | 3 + lib/dynamic_debug.c | 197 +++++++++++++++++++++++++++++++++++= ++-- lib/test_dynamic_debug.c | 131 ++++++++++++++++++++------ lib/test_dynamic_debug_submod.c | 14 +++ 8 files changed, 485 insertions(+), 57 deletions(-) diff --git a/include/asm-generic/dyndbg.lds.h b/include/asm-generic/dyndbg.= lds.h index ec661f9f3793..0ffc9cde4377 100644 --- a/include/asm-generic/dyndbg.lds.h +++ b/include/asm-generic/dyndbg.lds.h @@ -5,7 +5,8 @@ #include #define DYNDBG_SECTIONS() \ BOUNDED_SECTION_BY(__dyndbg_descs, ___dyndbg_descs) \ - BOUNDED_SECTION_BY(__dyndbg_class_maps, ___dyndbg_class_maps) + BOUNDED_SECTION_BY(__dyndbg_class_maps, ___dyndbg_class_maps) \ + BOUNDED_SECTION_BY(__dyndbg_class_users, ___dyndbg_class_users) =20 #define MOD_DYNDBG_SECTIONS() \ __dyndbg_descs 0 : ALIGN(8) { \ @@ -13,6 +14,9 @@ } \ __dyndbg_class_maps 0 : ALIGN(8) { \ KEEP(*(__dyndbg_class_maps)) \ + } \ + __dyndbg_class_users 0 : ALIGN(8) { \ + KEEP(*(__dyndbg_class_users)) \ } =20 #endif /* __ASM_GENERIC_DYNDBG_LDS_H */ diff --git a/include/linux/dynamic_debug.h b/include/linux/dynamic_debug.h index bf6039191fa7..61f9fd4aa7af 100644 --- a/include/linux/dynamic_debug.h +++ b/include/linux/dynamic_debug.h @@ -83,19 +83,30 @@ enum ddebug_class_map_type { */ }; =20 +/* + * map @class_names 0..N to consecutive constants starting at @base. + */ struct ddebug_class_map { - struct module *mod; /* NULL for builtins */ - const char *mod_name; /* needed for builtins */ + const struct module *mod; /* NULL for builtins */ + const char *mod_name; /* needed for builtins */ const char **class_names; const int length; const int base; /* index of 1st .class_id, allows split/shared space */ enum ddebug_class_map_type map_type; -}; +} __aligned(8); + +struct ddebug_class_user { + const char *mod_name; + struct ddebug_class_map *map; + const int offset; /* offset from map->base */ +} __aligned(8); =20 /* - * @_ddebug_info: gathers module/builtin dyndbg_* __sections together. + * @_ddebug_info: gathers module/builtin __dyndbg_ __sections + * together, each is a vec_: a struct { struct T start[], int len }. + * * For builtins, it is used as a cursor, with the inner structs - * marking sub-vectors of the builtin __sections in DATA. + * marking sub-vectors of the builtin __sections in DATA_DATA */ struct _ddebug_descs { struct _ddebug *start; @@ -107,10 +118,16 @@ struct _ddebug_class_maps { unsigned int len; }; =20 +struct _ddebug_class_users { + struct ddebug_class_user *start; + int len; +}; + struct _ddebug_info { const char *mod_name; struct _ddebug_descs descs; struct _ddebug_class_maps maps; + struct _ddebug_class_users users; }; =20 struct ddebug_class_param { @@ -129,17 +146,86 @@ struct ddebug_class_param { #if defined(CONFIG_DYNAMIC_DEBUG) || \ (defined(CONFIG_DYNAMIC_DEBUG_CORE) && defined(DYNAMIC_DEBUG_MODULE)) =20 +/* + * dyndbg classmaps is modelled closely upon drm.debug: + * + * 1. run-time control via sysfs node (api/abi) + * 2. each bit 0..N controls a single "category" + * 3. a pr_debug can have only 1 category, not several. + * 4. "kind" is a compile-time constant: 0..N or BIT() thereof + * 5. macro impls - give compile-time resolution or fail. + * + * dyndbg classmaps design axioms/constraints: + * + * . optimizing compilers use 1-5 above, so preserve them. + * . classmaps.class_id *is* the category. + * . classmap definers/users are modules. + * . every user wants 0..N + * . 0..N exposes as ABI + * . no 1 use-case wants N > 32, 16 is more usable + * . N <=3D 64 in *all* cases + * . modules/subsystems make category/classmap decisions + * . ie an enum: DRM has DRM_UT_CORE..DRM_UT_DRMRES + * . some categories are exposed to user: ABI + * . making modules change their numbering is bogus, avoid if possible + * + * We can solve for all these at once: + * A: map class-names to a .class_id range at compile-time + * B: allow only "class NAME" changes to class'd callsites at run-time + * C: users/modules must manage 0..62 hardcoded .class_id range limit. + * D: existing pr_debugs get CLASS_DFLT=3D63 + * + * By mapping class-names at >control to class-ids underneath, and + * responding only to class-names DEFINEd or USEd by the module, we + * can private-ize the class-id, and adjust class'd pr_debugs only by + * their names. + * + * This give us: + * E: class_ids without classnames are unreachable + * F: user modules opt-in by DEFINEing a classmap and/or USEing another + * + * Multi-classmap modules/groups are supported, if the classmaps share + * the class_id space [0..62] without overlap/conflict. + * + * NOTE: Due to the integer class_id, this api cannot disallow these: + * __pr_debug_cls(0, "fake CORE msg"); works only if a classmap maps 0. + * __pr_debug_cls(22, "no such class"); compiles but is not reachable + */ + /** - * DECLARE_DYNDBG_CLASSMAP - declare classnames known by a module - * @_var: a struct ddebug_class_map, passed to module_param_cb - * @_maptype: enum ddebug_class_map_type, chooses bits/verbose - * @_base: offset of 1st class-name. splits .class_id space - * @classes: class-names used to control class'd prdbgs + * DYNAMIC_DEBUG_CLASSMAP_DEFINE - define debug classes used by a module. + * @_var: name of the classmap, exported for other modules coordinated u= se. + * @_mapty: enum ddebug_class_map_type: 0:DISJOINT - independent, 1:LEVEL = - v2>v1 + * @_base: reserve N classids starting at _base, to split 0..62 classid s= pace + * @classes: names of the N classes. + * + * This tells dyndbg what class_ids the module is using: _base..+N, by + * mapping names onto them. This qualifies "class NAME" >controls on + * the defining module, ignoring unknown names. + */ +#define DYNAMIC_DEBUG_CLASSMAP_DEFINE(_var, _mapty, _base, ...) \ + static const char *_var##_classnames[] =3D { __VA_ARGS__ }; \ + extern struct ddebug_class_map _var; \ + struct ddebug_class_map __aligned(8) __used \ + __section("__dyndbg_class_maps") _var =3D { \ + .mod =3D THIS_MODULE, \ + .mod_name =3D DDEBUG_MODNAME, \ + .base =3D (_base), \ + .map_type =3D (_mapty), \ + .length =3D ARRAY_SIZE(_var##_classnames), \ + .class_names =3D _var##_classnames, \ + }; \ + EXPORT_SYMBOL(_var) + +/* + * XXX: keep this until DRM adapts to use the DEFINE/USE api, it + * differs from DYNAMIC_DEBUG_CLASSMAP_DEFINE by the lack of the + * extern/EXPORT on the struct init, and cascading thinkos. */ #define DECLARE_DYNDBG_CLASSMAP(_var, _maptype, _base, ...) \ static const char *_var##_classnames[] =3D { __VA_ARGS__ }; \ static struct ddebug_class_map __aligned(8) __used \ - __section("__dyndbg_class_maps") _var =3D { \ + __section("__dyndbg_class_maps") _var =3D { \ .mod =3D THIS_MODULE, \ .mod_name =3D DDEBUG_MODNAME, \ .base =3D _base, \ @@ -148,6 +234,44 @@ struct ddebug_class_param { .length =3D __DDEBUG_ARRAY_SIZE(_var##_classnames), \ } =20 +/** + * DYNAMIC_DEBUG_CLASSMAP_USE - refer to a classmap, DEFINEd elsewhere. + * @_var: name of the exported classmap var + * + * This tells dyndbg that the module has prdbgs with classids defined + * in the named classmap. This qualifies "class NAME" >controls on + * the user module, and ignores unknown names. This is a wrapper for + * DYNAMIC_DEBUG_CLASSMAP_USE_() with a base offset of 0. + */ +#define DYNAMIC_DEBUG_CLASSMAP_USE(_var) \ + DYNAMIC_DEBUG_CLASSMAP_USE_(_var, 0) + +/** + * DYNAMIC_DEBUG_CLASSMAP_USE_ - refer to a classmap with a manual offset. + * @_var: name of the exported classmap var to use. + * @_offset: an integer offset to add to the class IDs of the used map. + * + * This is an extended version of DYNAMIC_DEBUG_CLASSMAP_USE(). It should + * only be used to resolve class ID conflicts when a module uses multiple + * classmaps that have overlapping ID ranges. + * + * The final class IDs for the used map will be calculated as: + * original_map_base + class_index + @_offset. + */ +#define DYNAMIC_DEBUG_CLASSMAP_USE_(_var, _offset) \ + extern struct ddebug_class_map _var; \ + static_assert((_offset) >=3D 0 && (_offset) < _DPRINTK_CLASS_DFLT, \ + "classmap use offset must be in 0..62"); \ + extern struct ddebug_class_user __aligned(8) \ + __PASTE(_var ## _, __KBUILD_MODNAME); \ + struct ddebug_class_user __aligned(8) __used \ + __section("__dyndbg_class_users") \ + __PASTE(_var ## _, __KBUILD_MODNAME) =3D { \ + .mod_name =3D DDEBUG_MODNAME, \ + .map =3D &(_var), \ + .offset =3D _offset \ + } + extern __printf(2, 3) void __dynamic_pr_debug(struct _ddebug *descriptor, const char *fmt, ...); =20 @@ -309,12 +433,18 @@ void __dynamic_ibdev_dbg(struct _ddebug *descriptor, KERN_DEBUG, prefix_str, prefix_type, \ rowsize, groupsize, buf, len, ascii) =20 -/* for test only, generally expect drm.debug style macro wrappers */ -#define __pr_debug_cls(cls, fmt, ...) do { \ +/* + * This is the "model" class variant of pr_debug. It is not really + * intended for direct use; I'd encourage DRM-style drm_dbg_ + * macros for the interface, along with an enum for the + * + * __printf(2, 3) would apply. + */ +#define __pr_debug_cls(cls, fmt, ...) ({ \ BUILD_BUG_ON_MSG(!__builtin_constant_p(cls), \ "expecting constant class int/enum"); \ dynamic_pr_debug_cls(cls, fmt, ##__VA_ARGS__); \ - } while (0) +}) =20 #else /* !(CONFIG_DYNAMIC_DEBUG || (CONFIG_DYNAMIC_DEBUG_CORE && DYNAMIC_D= EBUG_MODULE)) */ =20 @@ -322,6 +452,9 @@ void __dynamic_ibdev_dbg(struct _ddebug *descriptor, #include #include =20 +#define DYNAMIC_DEBUG_CLASSMAP_DEFINE(_var, _mapty, _base, ...) +#define DYNAMIC_DEBUG_CLASSMAP_USE(_var) +#define DYNAMIC_DEBUG_CLASSMAP_USE_(_var, _offset) #define DEFINE_DYNAMIC_DEBUG_METADATA(name, fmt) #define DYNAMIC_DEBUG_BRANCH(descriptor) false #define DECLARE_DYNDBG_CLASSMAP(...) @@ -368,8 +501,7 @@ static inline int param_set_dyndbg_classes(const char *= instr, const struct kerne static inline int param_get_dyndbg_classes(char *buffer, const struct kern= el_param *kp) { return 0; } =20 -#endif - +#endif /* !CONFIG_DYNAMIC_DEBUG_CORE */ =20 extern const struct kernel_param_ops param_ops_dyndbg_classes; =20 diff --git a/kernel/module/main.c b/kernel/module/main.c index 852cce2c5113..abf0c6991f66 100644 --- a/kernel/module/main.c +++ b/kernel/module/main.c @@ -2791,6 +2791,9 @@ static int find_module_sections(struct module *mod, s= truct load_info *info) mod->dyndbg_info.maps.start =3D section_objs(info, "__dyndbg_class_maps", sizeof(*mod->dyndbg_info.maps.start), &mod->dyndbg_info.maps.len); + mod->dyndbg_info.users.start =3D section_objs(info, "__dyndbg_class_users= ", + sizeof(*mod->dyndbg_info.users.start), + &mod->dyndbg_info.users.len); #endif =20 return 0; diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug index c3f448f3b8f1..2abf28d6d063 100644 --- a/lib/Kconfig.debug +++ b/lib/Kconfig.debug @@ -3138,12 +3138,26 @@ config TEST_STATIC_KEYS If unsure, say N. =20 config TEST_DYNAMIC_DEBUG - tristate "Test DYNAMIC_DEBUG" - depends on DYNAMIC_DEBUG + tristate "Build test-dynamic-debug module" + depends on DYNAMIC_DEBUG || DYNAMIC_DEBUG_CORE help - This module registers a tracer callback to count enabled - pr_debugs in a 'do_debugging' function, then alters their - enablements, calls the function, and compares counts. + This module exercises/demonstrates dyndbg's classmap API, by + creating 2 classes: a DISJOINT classmap (supporting DRM.debug) + and a LEVELS/VERBOSE classmap (like verbose2 > verbose1). + + If unsure, say N. + +config TEST_DYNAMIC_DEBUG_SUBMOD + tristate "Build test-dynamic-debug submodule" + default m + depends on DYNAMIC_DEBUG || DYNAMIC_DEBUG_CORE + depends on TEST_DYNAMIC_DEBUG + help + This sub-module uses a classmap defined and exported by the + parent module, recapitulating drm & driver's shared use of + drm.debug to control enabled debug-categories. + It is tristate, independent of parent, to allow testing all + proper combinations of parent=3Dy/m submod=3Dy/m. =20 If unsure, say N. =20 diff --git a/lib/Makefile b/lib/Makefile index dfab958327c5..9cdf0a430f5f 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -85,6 +85,7 @@ obj-$(CONFIG_TEST_RHASHTABLE) +=3D test_rhashtable.o obj-$(CONFIG_TEST_STATIC_KEYS) +=3D test_static_keys.o obj-$(CONFIG_TEST_STATIC_KEYS) +=3D test_static_key_base.o obj-$(CONFIG_TEST_DYNAMIC_DEBUG) +=3D test_dynamic_debug.o +obj-$(CONFIG_TEST_DYNAMIC_DEBUG_SUBMOD) +=3D test_dynamic_debug_submod.o =20 obj-$(CONFIG_TEST_BITMAP) +=3D test_bitmap.o ifeq ($(CONFIG_CC_IS_CLANG)$(CONFIG_KASAN),yy) @@ -206,6 +207,8 @@ obj-$(CONFIG_ARCH_NEED_CMPXCHG_1_EMU) +=3D cmpxchg-emu.o obj-$(CONFIG_DYNAMIC_DEBUG_CORE) +=3D dynamic_debug.o #ensure exported functions have prototypes CFLAGS_dynamic_debug.o :=3D -DDYNAMIC_DEBUG_MODULE +CFLAGS_test_dynamic_debug.o :=3D -DDYNAMIC_DEBUG_MODULE +CFLAGS_test_dynamic_debug_submod.o :=3D -DDYNAMIC_DEBUG_MODULE =20 obj-$(CONFIG_SYMBOLIC_ERRNAME) +=3D errname.o =20 diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c index 03dc35af4faa..566c3860d7bf 100644 --- a/lib/dynamic_debug.c +++ b/lib/dynamic_debug.c @@ -29,6 +29,7 @@ #include #include #include + #include #include #include @@ -43,6 +44,8 @@ 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[]; +extern struct ddebug_class_user __start___dyndbg_class_users[]; +extern struct ddebug_class_user __stop___dyndbg_class_users[]; =20 struct ddebug_table { struct list_head link; @@ -160,20 +163,39 @@ static void v3pr_info_dq(const struct ddebug_query *q= uery, const char *msg) (_i) < (_box)->_vec.len; \ (_i)++, (_sp)++) /* { block } */ =20 -static struct ddebug_class_map *ddebug_find_valid_class(struct ddebug_tabl= e const *dt, - const char *class_string, +#define v2pr_di_info(di_p, msg_p, ...) \ +({ \ + struct _ddebug_info const *_di =3D di_p; \ + v2pr_info(msg_p "module:%s nd:%d nc:%d nu:%d\n", ##__VA_ARGS__, \ + _di->mod_name, _di->descs.len, _di->maps.len, \ + _di->users.len); \ +}) + +static struct ddebug_class_map *ddebug_find_valid_class(struct _ddebug_inf= o const *di, + const char *query_class, int *class_id) { struct ddebug_class_map *map; + struct ddebug_class_user *cli; int i, idx; =20 - for_subvec(i, map, &dt->info, maps) { - idx =3D match_string(map->class_names, map->length, class_string); + for_subvec(i, map, di, maps) { + idx =3D match_string(map->class_names, map->length, query_class); if (idx >=3D 0) { + v2pr_di_info(di, "good-class: %s.%s ", map->mod_name, query_class); *class_id =3D idx + map->base; return map; } } + for_subvec(i, cli, di, users) { + idx =3D match_string(cli->map->class_names, cli->map->length, query_clas= s); + if (idx >=3D 0) { + v2pr_di_info(di, "class-ref: %s -> %s.%s ", + cli->mod_name, cli->map->mod_name, query_class); + *class_id =3D idx + cli->map->base + cli->offset; + return cli->map; + } + } *class_id =3D -ENOENT; return NULL; } @@ -238,8 +260,7 @@ static bool ddebug_match_desc(const struct ddebug_query= *query, return true; } =20 -static int ddebug_change(const struct ddebug_query *query, - struct flag_settings *modifiers) +static int ddebug_change(const struct ddebug_query *query, struct flag_set= tings *modifiers) { int i; struct ddebug_table *dt; @@ -260,7 +281,8 @@ static int ddebug_change(const struct ddebug_query *que= ry, continue; =20 if (query->class_string) { - map =3D ddebug_find_valid_class(dt, query->class_string, &valid_class); + map =3D ddebug_find_valid_class(&dt->info, query->class_string, + &valid_class); if (!map) continue; } else { @@ -593,7 +615,7 @@ static int ddebug_exec_query(char *query_string, const = char *modname) =20 /* handle multiple queries in query string, continue on error, return last error or number of matching callsites. Module name is either - in param (for boot arg) or perhaps in query string. + in the modname arg (for boot args) or perhaps in query string. */ static int ddebug_exec_queries(char *query, const char *modname) { @@ -772,6 +794,7 @@ int param_get_dyndbg_classes(char *buffer, const struct= kernel_param *kp) default: return -1; } + return 0; } EXPORT_SYMBOL(param_get_dyndbg_classes); =20 @@ -1084,15 +1107,28 @@ static bool ddebug_class_in_range(const int class_i= d, const struct ddebug_class_ class_id < map->base + map->length); } =20 +static bool ddebug_user_class_in_range(const int class_id, const struct dd= ebug_class_user *cli) +{ + if (!cli || !cli->map) + return false; + int base =3D cli->map->base + cli->offset; + return (class_id >=3D base && class_id < base + cli->map->length); +} + static const char *ddebug_class_name(struct _ddebug_info *di, struct _ddeb= ug *dp) { struct ddebug_class_map *map; + struct ddebug_class_user *cli; int i; =20 for_subvec(i, map, di, maps) if (ddebug_class_in_range(dp->class_id, map)) return map->class_names[dp->class_id - map->base]; =20 + for_subvec(i, cli, di, users) + if (ddebug_user_class_in_range(dp->class_id, cli)) + return cli->map->class_names[dp->class_id - cli->map->base - cli->offse= t]; + return NULL; } =20 @@ -1173,6 +1209,140 @@ static const struct proc_ops proc_fops =3D { .proc_write =3D ddebug_proc_write }; =20 +#define vpr_cm_info(cm_p, msg_fmt, ...) ({ \ + struct ddebug_class_map const *_cm =3D cm_p; \ + v2pr_info(msg_fmt "%s [%d..%d] %s..%s\n", ##__VA_ARGS__, \ + _cm->mod_name, _cm->base, _cm->base + _cm->length, \ + _cm->class_names[0], _cm->class_names[_cm->length - 1]); \ + }) + +/* + * Modules which define classmaps get them initialized by + * param-callback via module.c:parse_one. Modules which use other's + * classmaps must be initialized explicitly. + */ +static inline u32 ddebug_class_param_to_bits(const struct ddebug_class_par= am *dcp) +{ + const struct ddebug_class_map *map =3D dcp->map; + + switch (map->map_type) { + case DD_CLASS_TYPE_DISJOINT_BITS: + return *dcp->bits & CLASSMAP_BITMASK(map->length); + case DD_CLASS_TYPE_LEVEL_NUM: + return CLASSMAP_BITMASK(min_t(u32, *dcp->lvl, map->length)); + default: + return 0; + } +} + +static void __maybe_unused ddebug_class_param_clamp_input(u32 *inrep, cons= t struct kernel_param *kp) +{ + const struct ddebug_class_param *dcp =3D kp->arg; + const struct ddebug_class_map *map =3D dcp->map; + + switch (map->map_type) { + case DD_CLASS_TYPE_DISJOINT_BITS: + /* expect bits. mask and warn if too many */ + if (*inrep & ~CLASSMAP_BITMASK(map->length)) { + pr_warn("%s: input: 0x%x exceeds mask: 0x%x, masking\n", + KP_NAME(kp), *inrep, CLASSMAP_BITMASK(map->length)); + *inrep &=3D CLASSMAP_BITMASK(map->length); + } + break; + case DD_CLASS_TYPE_LEVEL_NUM: + /* input is bitpos, of highest verbosity to be enabled */ + if (*inrep > map->length) { + pr_warn("%s: level:%d exceeds max:%d, clamping\n", + KP_NAME(kp), *inrep, map->length); + *inrep =3D map->length; + } + break; + } +} + +/* called for class-users only, parse_one does this for definer modules */ +static void ddebug_sync_classbits(const struct kernel_param *kp, const cha= r *modname) +{ + const struct ddebug_class_param *dcp =3D kp->arg; + u32 val, new_bits, init_bits; + + if (!dcp || !dcp->map) + return; + + init_bits =3D (_DPRINTK_FLAGS_DEFAULT & _DPRINTK_FLAGS_PRINT) ? + CLASSMAP_BITMASK(dcp->map->length) : 0; + + switch (dcp->map->map_type) { + case DD_CLASS_TYPE_DISJOINT_BITS: + val =3D READ_ONCE(*dcp->bits); + new_bits =3D val; + v2pr_info(" %s: classbits: 0x%x\n", KP_NAME(kp), new_bits); + ddebug_apply_class_bitmap(dcp, &new_bits, init_bits, modname); + break; + case DD_CLASS_TYPE_LEVEL_NUM: + val =3D READ_ONCE(*dcp->lvl); + new_bits =3D CLASSMAP_BITMASK(val); + v2pr_info(" %s: lvl:%d bits:0x%x\n", KP_NAME(kp), val, new_bits); + ddebug_apply_class_bitmap(dcp, &new_bits, init_bits, modname); + break; + default: + pr_err("bad map type %d\n", dcp->map->map_type); + return; + } +} + +static void ddebug_match_apply_kparam(const struct kernel_param *kp, + const struct ddebug_class_map *map, + const char *mod_name) +{ + struct ddebug_class_param *dcp; + + if (kp->ops !=3D ¶m_ops_dyndbg_classes) + return; + + dcp =3D (struct ddebug_class_param *)kp->arg; + + if (dcp && dcp->map =3D=3D map) { + v2pr_info(" kp:%s.%s =3D0x%x", mod_name, kp->name, *dcp->bits); + vpr_cm_info(map, " %s maps ", mod_name); + ddebug_sync_classbits(kp, mod_name); + } +} + +static void ddebug_apply_params(const struct ddebug_class_map *cm, const c= har *mod_name) +{ + const struct kernel_param *kp; + + if (!cm) + return; +#if IS_ENABLED(CONFIG_MODULES) + int i; + + if (cm->mod) { + vpr_cm_info(cm, "loaded classmap: %s ", mod_name); + /* ifdef protects the cm->mod->kp deref */ + for (i =3D 0, kp =3D cm->mod->kp; i < cm->mod->num_kp; i++, kp++) + ddebug_match_apply_kparam(kp, cm, mod_name); + } +#endif + if (!cm->mod) { + vpr_cm_info(cm, "builtin classmap: %s ", mod_name); + for (kp =3D __start___param; kp < __stop___param; kp++) + ddebug_match_apply_kparam(kp, cm, mod_name); + } +} + +static void ddebug_apply_class_users(const struct _ddebug_info *di) +{ + struct ddebug_class_user *cli; + int i; + + for_subvec(i, cli, di, users) + ddebug_apply_params(cli->map, cli->mod_name); + + v2pr_di_info(di, "attached %d class-users to ", i); +} + /* * dd_set_module_subrange - find matching subrange of classmaps * @_i: caller-provided index var @@ -1210,6 +1380,7 @@ static int ddebug_add_module(struct _ddebug_info *di) { struct ddebug_table *dt; struct ddebug_class_map *cm; + struct ddebug_class_user *cli; int i; =20 if (!di->descs.len) @@ -1222,6 +1393,7 @@ static int ddebug_add_module(struct _ddebug_info *di) pr_err("error adding module: %s\n", di->mod_name); return -ENOMEM; } + INIT_LIST_HEAD(&dt->link); /* * For built-in modules, di is a partial cursor into the * builtin dyndbg data; the descriptors are the subrange @@ -1238,12 +1410,17 @@ static int ddebug_add_module(struct _ddebug_info *d= i) */ dt->info =3D *di; dd_set_module_subrange(i, cm, &dt->info, maps); + dd_set_module_subrange(i, cli, &dt->info, users); =20 mutex_lock(&ddebug_lock); list_add_tail(&dt->link, &ddebug_tables); mutex_unlock(&ddebug_lock); =20 - vpr_info("%3u debug prints in module %s\n", di->descs.len, di->mod_name); + if (dt->info.users.len) + ddebug_apply_class_users(&dt->info); + + vpr_info("%3u debug prints in module %s\n", + dt->info.descs.len, dt->info.mod_name); return 0; } =20 @@ -1393,8 +1570,10 @@ static int __init dynamic_debug_init(void) struct _ddebug_info di =3D { .descs.start =3D __start___dyndbg_descs, .maps.start =3D __start___dyndbg_class_maps, + .users.start =3D __start___dyndbg_class_users, .descs.len =3D __stop___dyndbg_descs - __start___dyndbg_descs, .maps.len =3D __stop___dyndbg_class_maps - __start___dyndbg_class_maps, + .users.len =3D __stop___dyndbg_class_users - __start___dyndbg_class_user= s, }; =20 #ifdef CONFIG_MODULES diff --git a/lib/test_dynamic_debug.c b/lib/test_dynamic_debug.c index 9e8e028461ad..34e51996aa20 100644 --- a/lib/test_dynamic_debug.c +++ b/lib/test_dynamic_debug.c @@ -6,11 +6,30 @@ * Jim Cromie */ =20 -#define pr_fmt(fmt) "test_dd: " fmt +/* + * This file is built 2x, also making test_dynamic_debug_submod.ko, + * whose 2-line src file #includes this file. This gives us a _submod + * clone with identical pr_debugs, without further maintenance. + * + * If things are working properly, they should operate identically + * when printed or adjusted by >control. This eases visual perusal of + * the logs, and simplifies testing, by easing the proper accounting + * of expectations. + * + * It also puts both halves of the subsystem _DEFINE & _USE use case + * together, and integrates the common ENUM providing both class_ids + * and class-names to both _DEFINErs and _USERs. I think this makes + * the usage clearer. + */ +#if defined(TEST_DYNAMIC_DEBUG_SUBMOD) + #define pr_fmt(fmt) "test_dd_submod: " fmt +#else + #define pr_fmt(fmt) "test_dd: " fmt +#endif =20 #include =20 -/* run tests by reading or writing sysfs node: do_prints */ +/* re-gen output by reading or writing sysfs node: do_prints */ =20 static void do_prints(void); /* device under test */ static int param_set_do_prints(const char *instr, const struct kernel_para= m *kp) @@ -39,14 +58,36 @@ module_param_cb(do_prints, ¶m_ops_do_prints, NULL, = 0600); * Additionally, here: * - tie together sysname, mapname, bitsname, flagsname */ -#define DD_SYS_WRAP(_model, _flags) \ - static u32 bits_##_model; \ - static struct ddebug_class_param _flags##_model =3D { \ +#define DYNAMIC_DEBUG_CLASSMAP_PARAM_(_model, _flags, _init) \ + static u32 bits_##_model =3D _init; \ + static struct ddebug_class_param _flags##_##_model =3D { \ .bits =3D &bits_##_model, \ .flags =3D #_flags, \ .map =3D &map_##_model, \ }; \ - module_param_cb(_flags##_##_model, ¶m_ops_dyndbg_classes, &_flags##_m= odel, 0600) + module_param_cb(_flags##_##_model, ¶m_ops_dyndbg_classes, \ + &_flags##_##_model, 0600) +#ifdef DEBUG +#define DYNAMIC_DEBUG_CLASSMAP_PARAM(_model, _flags) \ + DYNAMIC_DEBUG_CLASSMAP_PARAM_(_model, _flags, ~0) +#else +#define DYNAMIC_DEBUG_CLASSMAP_PARAM(_model, _flags) \ + DYNAMIC_DEBUG_CLASSMAP_PARAM_(_model, _flags, 0) +#endif + +/* + * Demonstrate/test DISJOINT & LEVEL typed classmaps with a sys-param. + * + * To comport with DRM debug-category (an int), classmaps map names to + * ids (also an int). So a classmap starts with an enum; DRM has enum + * debug_category: with DRM_UT_. We use the enum + * values as class-ids, and stringified enum-symbols as classnames. + * + * Modules with multiple CLASSMAPS must have enums with distinct + * value-ranges, as arranged below with explicit enum_sym =3D X inits. + * To clarify this sharing, declare the 2 enums now, for the 2 + * different classmap types + */ =20 /* numeric input, independent bits */ enum cat_disjoint_bits { @@ -60,26 +101,53 @@ enum cat_disjoint_bits { D2_LEASE, D2_DP, D2_DRMRES }; -DECLARE_DYNDBG_CLASSMAP(map_disjoint_bits, DD_CLASS_TYPE_DISJOINT_BITS, 0, - "D2_CORE", - "D2_DRIVER", - "D2_KMS", - "D2_PRIME", - "D2_ATOMIC", - "D2_VBL", - "D2_STATE", - "D2_LEASE", - "D2_DP", - "D2_DRMRES"); -DD_SYS_WRAP(disjoint_bits, p); -DD_SYS_WRAP(disjoint_bits, T); - -/* numeric verbosity, V2 > V1 related */ -enum cat_level_num { V0 =3D 14, V1, V2, V3, V4, V5, V6, V7 }; -DECLARE_DYNDBG_CLASSMAP(map_level_num, DD_CLASS_TYPE_LEVEL_NUM, 14, - "V0", "V1", "V2", "V3", "V4", "V5", "V6", "V7"); -DD_SYS_WRAP(level_num, p); -DD_SYS_WRAP(level_num, T); + +/* numeric verbosity, V2 > V1 related. V1 is > D2_DRMRES */ +enum cat_level_num { V1 =3D 16, V2, V3, V4, V5, V6, V7 }; + +/* recapitulate DRM's multi-classmap setup */ +#if !defined(TEST_DYNAMIC_DEBUG_SUBMOD) +/* + * In single user, or parent / coordinator (drm.ko) modules, define + * classmaps on the client enums above, and then declares the PARAMS + * ref'g the classmaps. Each is exported. + */ +DYNAMIC_DEBUG_CLASSMAP_DEFINE(map_disjoint_bits, DD_CLASS_TYPE_DISJOINT_BI= TS, + D2_CORE, + "D2_CORE", + "D2_DRIVER", + "D2_KMS", + "D2_PRIME", + "D2_ATOMIC", + "D2_VBL", + "D2_STATE", + "D2_LEASE", + "D2_DP", + "D2_DRMRES"); + +DYNAMIC_DEBUG_CLASSMAP_DEFINE(map_level_num, DD_CLASS_TYPE_LEVEL_NUM, + V1, "V1", "V2", "V3", "V4", "V5", "V6", "V7"); + +#else /* TEST_DYNAMIC_DEBUG_SUBMOD */ + +/* + * in submod/drm-drivers, use the classmaps defined in top/parent + * module above. + */ + +DYNAMIC_DEBUG_CLASSMAP_USE(map_disjoint_bits); +DYNAMIC_DEBUG_CLASSMAP_USE_(map_level_num, 7); + +enum cat_level_offset { Vu1 =3D V1 + 7, Vu2, Vu3, Vu4, Vu5, Vu6, Vu7 }; + +#endif + +/* + * now add the sysfs-params + */ + +DYNAMIC_DEBUG_CLASSMAP_PARAM(disjoint_bits, p); +DYNAMIC_DEBUG_CLASSMAP_PARAM(level_num, p); =20 /* stand-in for all pr_debug etc */ #define prdbg(SYM) __pr_debug_cls(SYM, #SYM " msg\n") @@ -104,6 +172,7 @@ static void do_levels(void) { pr_debug("doing levels\n"); =20 +#if !defined(TEST_DYNAMIC_DEBUG_SUBMOD) prdbg(V1); prdbg(V2); prdbg(V3); @@ -111,10 +180,20 @@ static void do_levels(void) prdbg(V5); prdbg(V6); prdbg(V7); +#else + prdbg(Vu1); + prdbg(Vu2); + prdbg(Vu3); + prdbg(Vu4); + prdbg(Vu5); + prdbg(Vu6); + prdbg(Vu7); +#endif } =20 static void do_prints(void) { + pr_debug("do_prints:\n"); do_cats(); do_levels(); } diff --git a/lib/test_dynamic_debug_submod.c b/lib/test_dynamic_debug_submo= d.c new file mode 100644 index 000000000000..672aabf40160 --- /dev/null +++ b/lib/test_dynamic_debug_submod.c @@ -0,0 +1,14 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Kernel module for testing dynamic_debug + * + * Authors: + * Jim Cromie + */ + +/* + * clone the parent, inherit all the properties, for consistency and + * simpler accounting in test expectations. + */ +#define TEST_DYNAMIC_DEBUG_SUBMOD +#include "test_dynamic_debug.c" --=20 2.55.0 From nobody Fri Sep 25 04:43:45 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D9EAB534448; Wed, 16 Sep 2026 15:33:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789572784; cv=none; b=jjl+nHKxN0q1TnXT49e+pVXK+B3oxmSMBhbtaqaFLBdqI7ViqhK+qEdbTVFl2R4CoCIQye+1U+vb6KpMxXxkS8xrLhID/RHVRD/EP75RYIa8RBD/QLp/URE2zXSxGeFpmRrKgHfqsgpTviag1zGSW6NkcbaxA/MjNtPQl7aFqTg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789572784; c=relaxed/simple; bh=NON11zdwLh1jBYgUrUe50YBgyTAFscgK+5XuaYRqhl0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=F6VOybkOctRyVQ8doQ1UA5NQnk8JwKmuTek2CmlCzsx1LKywo172axINWxEIu/fiqbD/xDTnU7rfQUUzwhPehE0AMVjs2eJ6xIvkw5dUdAIiEEEsQZRvIB/PjNxZE3M7N9n9dPesENdX9mdtD0xFAkoweB3qrDIQnvhn8qWT7L4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=my9IdKUD; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="my9IdKUD" Received: by smtp.kernel.org (Postfix) with ESMTPS id 01295C4AF0C; Wed, 16 Sep 2026 15:33:02 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1789572782; bh=NON11zdwLh1jBYgUrUe50YBgyTAFscgK+5XuaYRqhl0=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=my9IdKUDGj1w5i1oZkUs2p828k4i4K80ouPR/WZmohj7t0uS/8nymRdj7sIMOiZ/U aomirwRW4fBd8fBVJRVYayrhenIWlxw6EUZy0900XB6lzkrCeZ1h2AOGuxq+IVEOIs ajnyxQO7ROI6ADPNKWsy7cohAxI7fJR0gOHHpGcKhLc8GNctWz9aN53SO0Oa2q0cUd 0RIQOuXMR89KjsryomLz2w6oz5dGd2zvkulFOgkhJMZ1IM4P3Za7VjyD/sKt8AMmF9 ybA2ZWMxXsUx3h7b1IIRhi0w13ScdzrBztAwZ4aomY4h/0L06ItJwtfpijq4EJlAG3 fITRwln4oPHAQ== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id E25F9C982C9; Wed, 16 Sep 2026 15:33:01 +0000 (UTC) From: Jim Cromie via B4 Relay Date: Wed, 16 Sep 2026 09:33:16 -0600 Subject: [PATCH v10 24/38] selftests/dyndbg: Enable FT_classmap_inheritance Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260916-dd-cmap-part2-clean-v10-24-af4cf4767707@gmail.com> References: <20260916-dd-cmap-part2-clean-v10-0-af4cf4767707@gmail.com> In-Reply-To: <20260916-dd-cmap-part2-clean-v10-0-af4cf4767707@gmail.com> To: Jason Baron , Shuah Khan , Andrew Morton , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Arnd Bergmann , Luis Chamberlain , Petr Pavlu , Daniel Gomez , Sami Tolvanen , Aaron Tomlin , Jonathan Corbet , Greg Kroah-Hartman , Nathan Chancellor , Nicolas Schier , Shuah Khan , Randy Dunlap , "Rafael J. Wysocki" , Pavel Machek , Len Brown Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-arch@vger.kernel.org, linux-modules@vger.kernel.org, linux-doc@vger.kernel.org, linux-kbuild@vger.kernel.org, linux-pm@vger.kernel.org, Jim Cromie X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789572777; l=5931; i=jim.cromie@gmail.com; s=20260203; h=from:subject:message-id; bh=6OJ9UW17PHmqcN0g3YruYiGL+oiRmIXie0aYgidVUu0=; b=++kI8qArwuxEzMKHq4StXWqdWptUzDszSvpOM/3L/YkwYo86t5hk2xEofy93NPwpHpVKRXFdf X2f9LpeYqQ9DBFrgIBH9nWtjL96clDN6XT1DKf0Sis6HdYVx9uOW20e X-Developer-Key: i=jim.cromie@gmail.com; a=ed25519; pk=C6E5ODlPQo7ZBynATXH9wg7K6HxP0pIXyf4s38Qw0XE= X-Endpoint-Received: by B4 Relay for jim.cromie@gmail.com/20260203 with auth_id=958 X-Original-From: Jim Cromie Reply-To: jim.cromie@gmail.com From: Jim Cromie Exercise classmap state inheritance between supermod and submod, verifying that class settings and controlling parameter states propagate from parent classmap definitions to dependent class users upon module load and during runtime reconfiguration. Add FT_classmap_inheritance to exercise classmap parameter propagation across test_dynamic_debug and test_dynamic_debug_submod. Enable it under modular_tests and register its 8 golden record checksums. Signed-off-by: Jim Cromie --- .../selftests/dynamic_debug/dyndbg_selftest.sh | 84 ++++++++++++++++++= +++- 1 file changed, 83 insertions(+), 1 deletion(-) diff --git a/tools/testing/selftests/dynamic_debug/dyndbg_selftest.sh b/too= ls/testing/selftests/dynamic_debug/dyndbg_selftest.sh index 09a8dbf239dc..51338ebc74bf 100755 --- a/tools/testing/selftests/dynamic_debug/dyndbg_selftest.sh +++ b/tools/testing/selftests/dynamic_debug/dyndbg_selftest.sh @@ -64,6 +64,7 @@ function ifrmmod { } =20 # Clean up any leftover loaded test modules at initialization +ifrmmod test_dynamic_debug_submod ifrmmod test_dynamic_debug =20 # =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D @@ -196,7 +197,7 @@ function FT_grammar_ok { =20 # use 4 keywords (max 9 words inc flags) ddcmd "module foo file bar.c func buz class D2_CORE +_" # 4 keywords - #ddcmd "module foo file bar.c func buz class D2 line 100 +_" # 5 keywo= rds + ddcmd "module foo file bar.c func buz class D2 line 100 +_" # 5 keywor= ds =20 # 3. Dedicated lineno range grammar assertions (side-effect-free proof= s) ddcmd "line 42 +_" # test exact line syntax @@ -298,6 +299,78 @@ function FT_basic_queries { ddcmd "file $f =3D_" "$f" } =20 +function FT_classmap_inheritance { + v_echo "${GREEN}# TEST_MOD_SUBMOD ${NC}" + + ifrmmod test_dynamic_debug_submod + ifrmmod test_dynamic_debug + + # modprobe with plain-old +p & 3 class enablements + my_modprobe test_dynamic_debug \ + "dyndbg=3D+p;class D2_CORE +pf;class D2_KMS +pt;class D2_ATOMIC +pm" + verify_control_slice '\[test_dynamic_debug\]' + + set_param 5 /sys/module/test_dynamic_debug/parameters/p_level_num + verify_control_slice '\[test_dynamic_debug\]' + + my_modprobe test_dynamic_debug_submod + verify_control_slice 'test_dynamic_debug_submod' + + # fresh start, to clear all above flags (test-fn limits) + ifrmmod test_dynamic_debug_submod + ifrmmod test_dynamic_debug + + # load submod, which loads supermod + my_modprobe test_dynamic_debug_submod \ + "dyndbg=3D+p;class D2_CORE +pfs;class D2_KMS +pts;class D2_ATOMIC +pmf" + verify_control_slice 'test_dynamic_debug' + + # runtime changes to both + set_param 0x57 /sys/module/test_dynamic_debug/parameters/p_disjoint_bi= ts + set_param 4 /sys/module/test_dynamic_debug/parameters/p_level_num + verify_control_slice 'test_dynamic_debug' + + ifrmmod test_dynamic_debug_submod + ifrmmod test_dynamic_debug + + # set super-mod params at load-time + my_modprobe test_dynamic_debug p_disjoint_bits=3D0x16 p_level_num=3D5 + verify_control_slice '\[test_dynamic_debug\]' + + # see them picked up by submod + my_modprobe test_dynamic_debug_submod + verify_control_slice 'test_dynamic_debug' + + # Real-time mathematical proof that load-time (modprobe) parameter par= sing + # and runtime (sysfs write) parameter configurations are perfectly equ= ivalent! + local hash_modprobe=3D$(slice_and_hash_ddctrl '\[test_dynamic_debug\]') + + # Fresh load with default parameters, then configure them dynamically = at runtime + ifrmmod test_dynamic_debug_submod + ifrmmod test_dynamic_debug + my_modprobe test_dynamic_debug + my_modprobe test_dynamic_debug_submod + echo 0x16 > /sys/module/test_dynamic_debug/parameters/p_disjoint_bits + echo 5 > /sys/module/test_dynamic_debug/parameters/p_level_num + + local hash_sysfs=3D$(slice_and_hash_ddctrl '\[test_dynamic_debug\]') + if [ "$hash_modprobe" !=3D "$hash_sysfs" ]; then + echo -e "${RED}: Load-time vs runtime parameter equivalence check = failed!${NC}" + exit $ksft_fail + else + v_echo "${GREEN}: Proven: parameter load-time (modprobe) " \ + "and runtime (sysfs write) are equivalent!${NC}" + fi + # --- Live Content Fingerprinting Phase --- + log_start + echo 1 > /sys/module/test_dynamic_debug/parameters/do_prints + echo 1 > /sys/module/test_dynamic_debug_submod/parameters/do_prints + log_stop + + ifrmmod test_dynamic_debug_submod + ifrmmod test_dynamic_debug +} + # Built-in Feature Tests (Can run on any CONFIG_DYNAMIC_DEBUG kernel, modu= lar or monolithic) builtin_tests=3D( FT_grammar_ok @@ -307,6 +380,7 @@ builtin_tests=3D( =20 # Modular Feature Tests (Require CONFIG_MODULES=3Dy and test_dynamic_debug= *.ko available) modular_tests=3D( + FT_classmap_inheritance ) =20 # =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D @@ -390,6 +464,14 @@ function GOLDEN_RECORDS { #K=3D 02e4fd94602e108cb89bfc70d47a5dad FT_basic_queries.5 #K=3D f03a7ca7316e8db4c0e16523dc41e75d FT_basic_queries.6 #K=3D c518a50ba30ba8099d0dc874a27ecf16 FT_basic_queries.7 +#K=3D fb294f02a4207b28b2a874524ef07afd FT_classmap_inheritance.1 +#K=3D 7a0b87016fdc237077dfe96bbbb3661b FT_classmap_inheritance.2 +#K=3D 2784d60f5056fc5cc03b3ceb854293f5 FT_classmap_inheritance.3 +#K=3D bf66aaf8ff612272c0cda29778ed2131 FT_classmap_inheritance.4 +#K=3D 49fdd29d91a4c1d16f8b59bb431e741b FT_classmap_inheritance.5 +#K=3D a8aa244285d048b5ebe33061fa99c424 FT_classmap_inheritance.6 +#K=3D 3060b86a0f553dd5a826bb7023284925 FT_classmap_inheritance.7 +#K=3D f43e0aff8a4b38435b73d90ed8100d1b FT_classmap_inheritance.8 EOF # Read the K-recs and skip those for tests that can't run while read -r line; do --=20 2.55.0 From nobody Fri Sep 25 04:43:45 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E0496534451; Wed, 16 Sep 2026 15:33:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789572784; cv=none; b=eBJCbkAnF6NbYGz3n+65RjSToWwT4Gq1FE8fGiMEA+OVcbLyTbdIutpUWjOcJUjL9TQAotd4wZ9twPoNkBi5jFNjpSZqsu3lw+FJnQmB2EGkDf6X0GJUcqO6tYyJtMw/NWMR5VOhI6ixWkD18UxlXoggdWqkNC+ESI83Ggm9TGI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789572784; c=relaxed/simple; bh=771JC9SaugQiOViBqH/Lc/59cdvMbbALFxi9YUaZ6CY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=TJf7XsWAXfUdVIOv5Ktiv5f+EgwuwGoWA3GpO9li1OUf127f82pKW9iW4LHhjXtySzoe7E96gBzxRXcDaPYRwbAVlzjGgIQdcScxKlmfYC/9H/EZoCPWxhxiH3lOK0dcE+JgXx7tB6Ho546VIAB8pMH+mALbTv+99Fu9jp5e2Qs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=rlfQKsjE; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="rlfQKsjE" Received: by smtp.kernel.org (Postfix) with ESMTPS id 27BD2C4AF11; Wed, 16 Sep 2026 15:33:02 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1789572782; bh=771JC9SaugQiOViBqH/Lc/59cdvMbbALFxi9YUaZ6CY=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=rlfQKsjE+9FxfiI9+L/6Rp9mAh/TnfckzZRDZ/zJ7Ab0MlQVnZeBDA11XGmoB6SMn ddvdWjMHWl/PazJP58XunuxnxnwRIC7U5RbmIRW4slh1y/8viK9wP30Pr90lMndfOM nSJRd2HvPE5A4qroQasnn3ryUKk5ekxsLLiNeZ5O9gMQZYQwx4QHhZuj2YF5K6yRl9 50TGtQGI9IwzC3BbOQu5qdN8z/f7Ir1We+wX1sIsXgbaa9O5BHOaZUm1H3ISkNxBlR +BCQphcbaPTEmEH1pXeesCFSNYFVuEJow7A3HkZZYGns66ztUkf6nUfKZX0zQDDM2O Nqsgqhc40B4vQ== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 09EEEC982CD; Wed, 16 Sep 2026 15:33:02 +0000 (UTC) From: Jim Cromie via B4 Relay Date: Wed, 16 Sep 2026 09:33:17 -0600 Subject: [PATCH v10 25/38] dyndbg: detect class_id reservation conflicts Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260916-dd-cmap-part2-clean-v10-25-af4cf4767707@gmail.com> References: <20260916-dd-cmap-part2-clean-v10-0-af4cf4767707@gmail.com> In-Reply-To: <20260916-dd-cmap-part2-clean-v10-0-af4cf4767707@gmail.com> To: Jason Baron , Shuah Khan , Andrew Morton , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Arnd Bergmann , Luis Chamberlain , Petr Pavlu , Daniel Gomez , Sami Tolvanen , Aaron Tomlin , Jonathan Corbet , Greg Kroah-Hartman , Nathan Chancellor , Nicolas Schier , Shuah Khan , Randy Dunlap , "Rafael J. Wysocki" , Pavel Machek , Len Brown Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-arch@vger.kernel.org, linux-modules@vger.kernel.org, linux-doc@vger.kernel.org, linux-kbuild@vger.kernel.org, linux-pm@vger.kernel.org, Jim Cromie , Louis Chauvet X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789572777; l=7209; i=jim.cromie@gmail.com; s=20260203; h=from:subject:message-id; bh=xxABDWJkgFABEIsF2TNys/tSi7oHKA9H1Gdoz5kwLhQ=; b=wEv99KyebWPbXPtoKYkvDQRhuVj7Mt81+U6MteOlt7sHUF/VtvIq5aiQyQcflmm4sYIie+gWS xgA+6iDy1G6ARtZLgUx6SiBx4+hJUUUTnXqys6kFicc59gpWuPIymy0 X-Developer-Key: i=jim.cromie@gmail.com; a=ed25519; pk=C6E5ODlPQo7ZBynATXH9wg7K6HxP0pIXyf4s38Qw0XE= X-Endpoint-Received: by B4 Relay for jim.cromie@gmail.com/20260203 with auth_id=958 X-Original-From: Jim Cromie Reply-To: jim.cromie@gmail.com From: Jim Cromie If a module _DEFINEs 2 or more classmaps, it must devise them to share the per-module 0..62 class-id space; ie their respective base,+length reservations cannot overlap. To detect conflicts at modprobe, add ddebug_class_range_overlap(), call it from ddebug_add_module(), and WARN and return -EINVAL when they're detected. This insures that class_id -> classname lookup has just 1 answer, so the 1st-found search in find-class-name works properly. test_dynamic_debug.c: If built with -DFORCE_CLASSID_CONFLICT, the test-modules invoke 2 conflicting DYNAMIC_DEBUG_CLASSMAP_DEFINE() declarations, into parent and the _submod. These conflict with one of the good ones in the parent (D2_CORE..etc), causing the modprobe(s) to WARN and fail. Signed-off-by: Jim Cromie Reviewed-by: Louis Chauvet --- v9: . make ddebug_add_module() failure non-fatal during dynamic_debug_init(), logging warning and continuing instead of tearing down all tables kernel-= wide. v2: RvB after SoB old-v9 - fix WARN() by adding new 1st arg 1. old-v12 - drop maybe_unused on range-overlap fn --- lib/dynamic_debug.c | 64 +++++++++++++++++++++++++++-----------------= ---- lib/test_dynamic_debug.c | 8 ++++++ 2 files changed, 44 insertions(+), 28 deletions(-) diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c index 566c3860d7bf..7736fb3d3b79 100644 --- a/lib/dynamic_debug.c +++ b/lib/dynamic_debug.c @@ -1101,18 +1101,19 @@ static void *ddebug_proc_next(struct seq_file *m, v= oid *p, loff_t *pos) return dp; } =20 -static bool ddebug_class_in_range(const int class_id, const struct ddebug_= class_map *map) +static bool ddebug_class_map_in_range(const int class_id, const struct dde= bug_class_map *map) { + if (!map) + return false; return (class_id >=3D map->base && class_id < map->base + map->length); } =20 -static bool ddebug_user_class_in_range(const int class_id, const struct dd= ebug_class_user *cli) +static bool ddebug_class_user_in_range(const int class_id, const struct dd= ebug_class_user *user) { - if (!cli || !cli->map) + if (!user) return false; - int base =3D cli->map->base + cli->offset; - return (class_id >=3D base && class_id < base + cli->map->length); + return ddebug_class_map_in_range(class_id - user->offset, user->map); } =20 static const char *ddebug_class_name(struct _ddebug_info *di, struct _ddeb= ug *dp) @@ -1122,11 +1123,11 @@ static const char *ddebug_class_name(struct _ddebug= _info *di, struct _ddebug *dp int i; =20 for_subvec(i, map, di, maps) - if (ddebug_class_in_range(dp->class_id, map)) + if (ddebug_class_map_in_range(dp->class_id, map)) return map->class_names[dp->class_id - map->base]; =20 for_subvec(i, cli, di, users) - if (ddebug_user_class_in_range(dp->class_id, cli)) + if (ddebug_class_user_in_range(dp->class_id, cli)) return cli->map->class_names[dp->class_id - cli->map->base - cli->offse= t]; =20 return NULL; @@ -1372,6 +1373,20 @@ static void ddebug_apply_class_users(const struct _d= debug_info *di) __di->_vec.start =3D __start; \ }) =20 +static int ddebug_class_range_overlap(struct ddebug_class_map *cm, u64 *re= served_ids) +{ + u64 range =3D (((1ULL << cm->length) - 1) << cm->base); + + if (range & *reserved_ids) { + pr_err("[%d..%d] on %s conflicts with %llx\n", cm->base, + cm->base + cm->length - 1, cm->class_names[0], + *reserved_ids); + return -EINVAL; + } + *reserved_ids |=3D range; + return 0; +} + /* * Allocate a new ddebug_table for the given module * and add it to the global list. @@ -1381,6 +1396,7 @@ static int ddebug_add_module(struct _ddebug_info *di) struct ddebug_table *dt; struct ddebug_class_map *cm; struct ddebug_class_user *cli; + u64 reserved_ids =3D 0; int i; =20 if (!di->descs.len) @@ -1412,16 +1428,24 @@ static int ddebug_add_module(struct _ddebug_info *d= i) dd_set_module_subrange(i, cm, &dt->info, maps); dd_set_module_subrange(i, cli, &dt->info, users); =20 + /* insure 2+ classmaps share the per-module 0..62 class_id space */ + for_subvec(i, cm, &dt->info, maps) + if (ddebug_class_range_overlap(cm, &reserved_ids)) + goto cleanup; + mutex_lock(&ddebug_lock); list_add_tail(&dt->link, &ddebug_tables); mutex_unlock(&ddebug_lock); - if (dt->info.users.len) ddebug_apply_class_users(&dt->info); =20 vpr_info("%3u debug prints in module %s\n", dt->info.descs.len, dt->info.mod_name); return 0; +cleanup: + WARN_ONCE(1, "dyndbg multi-classmap conflict in %s\n", di->mod_name); + kfree(dt); + return -EINVAL; } =20 /* helper for ddebug_dyndbg_(boot|module)_param_cb */ @@ -1464,14 +1488,14 @@ int ddebug_dyndbg_module_param_cb(char *param, char= *val, const char *module) return ddebug_dyndbg_param_cb(param, val, module, -ENOENT); } =20 +#ifdef CONFIG_MODULES + static void ddebug_table_free(struct ddebug_table *dt) { list_del_init(&dt->link); kfree(dt); } =20 -#ifdef CONFIG_MODULES - /* * Called in response to a module being unloaded. Removes * any ddebug_table's which point at the module. @@ -1523,18 +1547,6 @@ static struct notifier_block ddebug_module_nb =3D { =20 #endif /* CONFIG_MODULES */ =20 -static void ddebug_remove_all_tables(void) -{ - mutex_lock(&ddebug_lock); - while (!list_empty(&ddebug_tables)) { - struct ddebug_table *dt =3D list_entry(ddebug_tables.next, - struct ddebug_table, - link); - ddebug_table_free(dt); - } - mutex_unlock(&ddebug_lock); -} - static __initdata int ddebug_init_success; =20 static int __init dynamic_debug_init_control(void) @@ -1605,7 +1617,7 @@ static int __init dynamic_debug_init(void) di.mod_name =3D modname; ret =3D ddebug_add_module(&di); if (ret) - goto out_err; + pr_warn("failed to add built-in module %s: %d\n", modname, ret); =20 mod_ct++; =20 @@ -1620,7 +1632,7 @@ static int __init dynamic_debug_init(void) di.mod_name =3D modname; ret =3D ddebug_add_module(&di); if (ret) - goto out_err; + pr_warn("failed to add built-in module %s: %d\n", modname, ret); =20 mod_ct++; =20 @@ -1645,10 +1657,6 @@ static int __init dynamic_debug_init(void) 0, 0, 0, NULL, &ddebug_dyndbg_boot_param_cb); kfree(cmdline); return 0; - -out_err: - ddebug_remove_all_tables(); - return 0; } /* Allow early initialization for boot messages via boot param */ early_initcall(dynamic_debug_init); diff --git a/lib/test_dynamic_debug.c b/lib/test_dynamic_debug.c index 34e51996aa20..3a69cc3cae6d 100644 --- a/lib/test_dynamic_debug.c +++ b/lib/test_dynamic_debug.c @@ -128,6 +128,14 @@ DYNAMIC_DEBUG_CLASSMAP_DEFINE(map_disjoint_bits, DD_CL= ASS_TYPE_DISJOINT_BITS, DYNAMIC_DEBUG_CLASSMAP_DEFINE(map_level_num, DD_CLASS_TYPE_LEVEL_NUM, V1, "V1", "V2", "V3", "V4", "V5", "V6", "V7"); =20 +#ifdef FORCE_CLASSID_CONFLICT +/* + * Enable with -Dflag on compile to test overlapping class-id range + * detection. This should warn on modprobes. + */ +DYNAMIC_DEBUG_CLASSMAP_DEFINE(classid_range_conflict, 0, D2_CORE + 1, "D3_= CORE"); +#endif + #else /* TEST_DYNAMIC_DEBUG_SUBMOD */ =20 /* --=20 2.55.0 From nobody Fri Sep 25 04:43:45 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DD147534449; Wed, 16 Sep 2026 15:33:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789572784; cv=none; b=q+sm3NIPn5Z1jRVwBTrmF0PFQg6/vW87knyZlTHUQ6JU0shD/1JfXzxsvp7LbLw9QZotlMq9u3SkdwEOPR3GsREMkApu+GotyLwCgE8VmPUgG4cdJ6gxWlXKh4KsvrNZsJ98ANBkhDdIyqC5mI9nHoGGkIO5LbleGFbqi1lzzXM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789572784; c=relaxed/simple; bh=yUVcpDmB6+kTKEo8Dli0OJ27l/UM+bAfsLyP2Q3Atvk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=oLHBRoit4C++7Csuej6AeHPCJupIoNgT+cJHMvcj/j9nAwEMSioOxLrRJDrAUXhKGUmXGzD6WYvd1oIx7PqoTnpdRcXpohCejTQfMxiEF5BVfA4EDRyNEEX0RgTzwK2akuHrKM+b4/SjZvXahfZ8pO++Cz90eUfNqxDtJfILvPU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=EF03wsDg; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="EF03wsDg" Received: by smtp.kernel.org (Postfix) with ESMTPS id 47A65C4AF14; Wed, 16 Sep 2026 15:33:02 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1789572782; bh=yUVcpDmB6+kTKEo8Dli0OJ27l/UM+bAfsLyP2Q3Atvk=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=EF03wsDgroxMUu7UD9wFa33nmLmgM4gVWqRfZwqjTedSUuNGGMZXcj9OYkV9DzOAS pXyJTzKlKTw2x26jjvasgR4VnRHOYdrYtw6XDEhBVjusAjT9tGsdFwnPkkdLhqEzt1 /5MRfLptao4LBtAxPM25Xan6cxb+qllHmNa0ReePpAdutHSfVzvdF7DkjzYoS1Eeo3 9mty3VcKVr77TtUMzA3tl2Yi9zwf8nmsoWd56k2K4J/rp35zDOEiymd5+BufYdBjat LZhv+xFnQdKAKN9XV+NWM1UqSsIEnoKRdZXdv75cwc1WDNYPxeHoCMaevSkon3diio Xx9IrB2oraw+Q== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 34CC5C982CB; Wed, 16 Sep 2026 15:33:02 +0000 (UTC) From: Jim Cromie via B4 Relay Date: Wed, 16 Sep 2026 09:33:18 -0600 Subject: [PATCH v10 26/38] dyndbg: check DYNAMIC_DEBUG_CLASSMAP_{DEFINE,USE_} args at compile-time Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260916-dd-cmap-part2-clean-v10-26-af4cf4767707@gmail.com> References: <20260916-dd-cmap-part2-clean-v10-0-af4cf4767707@gmail.com> In-Reply-To: <20260916-dd-cmap-part2-clean-v10-0-af4cf4767707@gmail.com> To: Jason Baron , Shuah Khan , Andrew Morton , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Arnd Bergmann , Luis Chamberlain , Petr Pavlu , Daniel Gomez , Sami Tolvanen , Aaron Tomlin , Jonathan Corbet , Greg Kroah-Hartman , Nathan Chancellor , Nicolas Schier , Shuah Khan , Randy Dunlap , "Rafael J. Wysocki" , Pavel Machek , Len Brown Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-arch@vger.kernel.org, linux-modules@vger.kernel.org, linux-doc@vger.kernel.org, linux-kbuild@vger.kernel.org, linux-pm@vger.kernel.org, Jim Cromie X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789572777; l=3976; i=jim.cromie@gmail.com; s=20260203; h=from:subject:message-id; bh=XlwJxsMLoOEmQpSddsPPKLnRgIC9ISIuuOLCD/BSHY0=; b=BJr8CpULcJX1A8Qx4t1eafWfy+4PhoqBNoWO2v1IG49RvkLroAgbSb0ByXoxkHdLwxZ3Km6yo JX7UJG9NVbeC8pnw7+EHIAoAbiruWnmM8GlR131+Dr/Jgnq55HB2zwt X-Developer-Key: i=jim.cromie@gmail.com; a=ed25519; pk=C6E5ODlPQo7ZBynATXH9wg7K6HxP0pIXyf4s38Qw0XE= X-Endpoint-Received: by B4 Relay for jim.cromie@gmail.com/20260203 with auth_id=958 X-Original-From: Jim Cromie Reply-To: jim.cromie@gmail.com From: Jim Cromie Add __DYNAMIC_DEBUG_CLASSMAP_CHECK to implement the following arg-checks at compile-time: 0 <=3D _base < 63 class_names is not empty class_names[0] is a string class_names.length <=3D 32 (class_names.length + _base) < 63 dd-map-type is known value These compile-time checks will prevent several simple misuses, issuing obvious errors if violated. Several bad examples are ifdef DD_MACRO_ARGCHECK qualified in test_dynamic_debug_submod.c and will fail compilation if enabled. Signed-off-by: Jim Cromie --- include/linux/dynamic_debug.h | 16 +++++++++++++++- lib/test_dynamic_debug.c | 20 +++++++++++++++++--- 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/include/linux/dynamic_debug.h b/include/linux/dynamic_debug.h index 61f9fd4aa7af..26c858588eb1 100644 --- a/include/linux/dynamic_debug.h +++ b/include/linux/dynamic_debug.h @@ -192,6 +192,19 @@ struct ddebug_class_param { * __pr_debug_cls(22, "no such class"); compiles but is not reachable */ =20 +#define __DYNAMIC_DEBUG_CLASSMAP_CHECK(_clnames, _base, _mapty) \ + static_assert(((_base) >=3D 0 && (_base) < _DPRINTK_CLASS_DFLT), \ + "_base must be in 0..62"); \ + static_assert(__DDEBUG_ARRAY_SIZE(_clnames) > 0, \ + "classnames array size must be > 0"); \ + static_assert(__DDEBUG_ARRAY_SIZE(_clnames) <=3D 32, \ + "classnames array size must be <=3D 32"); \ + static_assert((__DDEBUG_ARRAY_SIZE(_clnames) + (_base)) <=3D _DPRINTK_CLA= SS_DFLT, \ + "_base + classnames.length must be <=3D 63"); \ + static_assert(((_mapty) >=3D DD_CLASS_TYPE_DISJOINT_BITS) && \ + ((_mapty) <=3D DD_CLASS_TYPE_LEVEL_NUM), \ + "unknown class_map_type") + /** * DYNAMIC_DEBUG_CLASSMAP_DEFINE - define debug classes used by a module. * @_var: name of the classmap, exported for other modules coordinated u= se. @@ -205,6 +218,7 @@ struct ddebug_class_param { */ #define DYNAMIC_DEBUG_CLASSMAP_DEFINE(_var, _mapty, _base, ...) \ static const char *_var##_classnames[] =3D { __VA_ARGS__ }; \ + __DYNAMIC_DEBUG_CLASSMAP_CHECK(_var##_classnames, (_base), (_mapty)); \ extern struct ddebug_class_map _var; \ struct ddebug_class_map __aligned(8) __used \ __section("__dyndbg_class_maps") _var =3D { \ @@ -212,7 +226,7 @@ struct ddebug_class_param { .mod_name =3D DDEBUG_MODNAME, \ .base =3D (_base), \ .map_type =3D (_mapty), \ - .length =3D ARRAY_SIZE(_var##_classnames), \ + .length =3D __DDEBUG_ARRAY_SIZE(_var##_classnames), \ .class_names =3D _var##_classnames, \ }; \ EXPORT_SYMBOL(_var) diff --git a/lib/test_dynamic_debug.c b/lib/test_dynamic_debug.c index 3a69cc3cae6d..01ce07001d4c 100644 --- a/lib/test_dynamic_debug.c +++ b/lib/test_dynamic_debug.c @@ -148,12 +148,26 @@ DYNAMIC_DEBUG_CLASSMAP_USE_(map_level_num, 7); =20 enum cat_level_offset { Vu1 =3D V1 + 7, Vu2, Vu3, Vu4, Vu5, Vu6, Vu7 }; =20 -#endif - +#if defined(DD_MACRO_ARGCHECK) /* - * now add the sysfs-params + * Exersize compile-time arg-checks in DYNAMIC_DEBUG_CLASSMAP_DEFINE. + * These will break compilation. */ +DYNAMIC_DEBUG_CLASSMAP_DEFINE(fail_base_neg, 0, -1, "NEGATIVE_BASE_ARG"); +DYNAMIC_DEBUG_CLASSMAP_DEFINE(fail_base_big, 0, 100, "TOOBIG_BASE_ARG"); +DYNAMIC_DEBUG_CLASSMAP_DEFINE(fail_str_type, 0, 0, 1 /* not a string */); +DYNAMIC_DEBUG_CLASSMAP_DEFINE(fail_emptyclass, 0, 0 /* ,empty */); +DYNAMIC_DEBUG_CLASSMAP_DEFINE(fail_maptype, 3, 10, "no such type"); +DYNAMIC_DEBUG_CLASSMAP_DEFINE(fail_base_len, 0, 60, + "base", "plus", "classes", "length", "too-big"); +DYNAMIC_DEBUG_CLASSMAP_USE_(fail_offset_big, 100); +#endif /* DD_MACRO_ARGCHECK */ + +#endif /* TEST_DYNAMIC_DEBUG_SUBMOD */ =20 +/* + * now add the sysfs-params to both sub/super-mods + */ DYNAMIC_DEBUG_CLASSMAP_PARAM(disjoint_bits, p); DYNAMIC_DEBUG_CLASSMAP_PARAM(level_num, p); =20 --=20 2.55.0 From nobody Fri Sep 25 04:43:45 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 98B005427E5; Wed, 16 Sep 2026 15:33:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789572785; cv=none; b=YpWxwPiVxdHbJv45IDuhCwatabjcxWueLFbr8GaVQCEOtGA5jxFcMmT9QOnP7Bt3qGrO7a/m+p+h3JQI+lg1W8x7xh9VsgxKI5ISHMTHJdrBBNmKY7vRAS4RPhFGIhhMuCrDMH1RfXWUsIpP3dWGlaCdY18A9IBQYj5mI9CY9LQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789572785; c=relaxed/simple; bh=InUpA9KoBY0bhpx2TOEoWaN4CLQK6wvunpEV/1SXZJE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ZXmI26YtPoogP9Fnq1+eR9Ao+7LlYhCDfHWfzRgkRSDxAnN3dEAFUSXUbfDGkUIVXHa7roSRaxBM/LScTBiu7tJ/0q93pGvkrgPD8avRcHANRA3GLstZi2XPVq/bTJIcsI+idG8MjFPvwe+vYuYRGBec1DqNP/of1VBeqTWETyo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=aBNrvRq3; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="aBNrvRq3" Received: by smtp.kernel.org (Postfix) with ESMTPS id 64370C4AF17; Wed, 16 Sep 2026 15:33:02 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1789572782; bh=InUpA9KoBY0bhpx2TOEoWaN4CLQK6wvunpEV/1SXZJE=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=aBNrvRq3ZuZX9jXJTzLNQ8xUpcVLQJXdO8WqiAHlAJ6FKMWjxsyQWZb9Ru+Apla+G ESzvhTG7HR0QIhSF0Rxk2/RP392UI4kfRJbGEO0wFeTJayDS2OIuwBjiPF4uZTPt8g vf865hefl4ekCnpb5Ni3MgWwakJ1KfYr/ukI2ibdX2+swW0ozL4aNu3irAl7dO0cx9 q8BWeVc1zVZph9oYOA9A7atZsFW4lcyWGbBV/lang2Cxd1cOAs5S9M82fVr5FHFWhx m6Y/+sdss69cdt9j/gsl8o2b/00bvJ9iudgNBJd56vhyuj51DmADguFbmhcCCRwpcL ltDynn6YjBAbQ== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 4DF82C982C9; Wed, 16 Sep 2026 15:33:02 +0000 (UTC) From: Jim Cromie via B4 Relay Date: Wed, 16 Sep 2026 09:33:19 -0600 Subject: [PATCH v10 27/38] dyndbg-test: add do_bulk testpoint, rename do_prints to do_classes Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260916-dd-cmap-part2-clean-v10-27-af4cf4767707@gmail.com> References: <20260916-dd-cmap-part2-clean-v10-0-af4cf4767707@gmail.com> In-Reply-To: <20260916-dd-cmap-part2-clean-v10-0-af4cf4767707@gmail.com> To: Jason Baron , Shuah Khan , Andrew Morton , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Arnd Bergmann , Luis Chamberlain , Petr Pavlu , Daniel Gomez , Sami Tolvanen , Aaron Tomlin , Jonathan Corbet , Greg Kroah-Hartman , Nathan Chancellor , Nicolas Schier , Shuah Khan , Randy Dunlap , "Rafael J. Wysocki" , Pavel Machek , Len Brown Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-arch@vger.kernel.org, linux-modules@vger.kernel.org, linux-doc@vger.kernel.org, linux-kbuild@vger.kernel.org, linux-pm@vger.kernel.org, Jim Cromie X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789572777; l=18048; i=jim.cromie@gmail.com; s=20260203; h=from:subject:message-id; bh=BbVWO2CUWoqwRkFpvSv00hF1NF3LUkYxIrEl0SeQGrw=; b=WBvq6N+TjydOXXp0+TusA7T9jHiu18/56aFNnmP+XcQvbgluFS8p0YQLzkVbeRj+pzqf5NUQ6 vSBtDQ1OpA/CMYQ/wUY1QpnVfrOJ3WKz/QRtSQ8nfTW97WzNhP0X20C X-Developer-Key: i=jim.cromie@gmail.com; a=ed25519; pk=C6E5ODlPQo7ZBynATXH9wg7K6HxP0pIXyf4s38Qw0XE= X-Endpoint-Received: by B4 Relay for jim.cromie@gmail.com/20260203 with auth_id=958 X-Original-From: Jim Cromie Reply-To: jim.cromie@gmail.com From: Jim Cromie test_dynamic_debug.ko currently has the do_prints sysnode to support testing of the classmaps feature, it calls ~16 class'd pr_debug()s, *once* for each class defined in the module. Improve the versatility of this support by: 1. changing do_prints() to do_classes() to better align with its actual purpose 2. new parameters/do_bulk & do_bulk(N): loops over 10 pr_debugs, N times creates idempotent non-repetetive (ie 1..N lines) output meant for creating high-volume workloads 3. using common param-ops for both (no reason not to) ie: do_classes(N) now accepts work-count. So now we can generate significant workloads with a single write. modprobe test_dynamic_debug dyndbg=3D+p echo 100 > /sys/module/test_dynamic_debug/parameters/do_classes echo 2000 > /sys/module/test_dynamic_debug/parameters/do_bulk TODO: enable do_bulk() callsites by default, since the modprobe is an explicit act, the user intends to use it, lets turn it on. Signed-off-by: Jim Cromie --- v9: . use unsigned int for loop index in do_bulk() to prevent wrapping lockups = on UINT_MAX. . add cond_resched() to do_classes() and do_bulk() loops. v8: fix a test which had commas, from the future, adjust KRECs --- lib/test_dynamic_debug.c | 111 ++++++++++---- .../selftests/dynamic_debug/dyndbg_selftest.sh | 170 +++++++++++++++++= ---- 2 files changed, 224 insertions(+), 57 deletions(-) diff --git a/lib/test_dynamic_debug.c b/lib/test_dynamic_debug.c index 01ce07001d4c..560e23f14ac8 100644 --- a/lib/test_dynamic_debug.c +++ b/lib/test_dynamic_debug.c @@ -28,25 +28,45 @@ #endif =20 #include +#include =20 -/* re-gen output by reading or writing sysfs node: do_prints */ +/* re-trigger debug output by reading or writing sysfs nodes: do_classes o= r do_bulk */ +static void do_classes(unsigned int); /* device under test */ +static void do_bulk(unsigned int); /* device under test */ =20 -static void do_prints(void); /* device under test */ -static int param_set_do_prints(const char *instr, const struct kernel_para= m *kp) +static int param_set_do_repeats(const char *instr, const struct kernel_par= am *kp) { - do_prints(); + int rc; + unsigned int ct; + void (*repeat_fn)(unsigned int) =3D kp->arg; + + rc =3D kstrtouint(instr, 0, &ct); + if (rc) { + pr_err("expecting numeric input, using 1 instead\n"); + ct =3D 1; + } + + repeat_fn(ct); + return 0; } -static int param_get_do_prints(char *buffer, const struct kernel_param *kp) + +static int param_get_do_repeats(char *buffer, const struct kernel_param *k= p) { - do_prints(); - return scnprintf(buffer, PAGE_SIZE, "did do_prints\n"); + void (*repeat_fn)(unsigned int) =3D kp->arg; + + repeat_fn(1); + + return scnprintf(buffer, PAGE_SIZE, "did 1 %s\n", kp->name); } -static const struct kernel_param_ops param_ops_do_prints =3D { - .set =3D param_set_do_prints, - .get =3D param_get_do_prints, + +static const struct kernel_param_ops param_ops_do_repeats =3D { + .set =3D param_set_do_repeats, + .get =3D param_get_do_repeats, }; -module_param_cb(do_prints, ¶m_ops_do_prints, NULL, 0600); + +module_param_cb(do_classes, ¶m_ops_do_repeats, do_classes, 0600); +module_param_cb(do_bulk, ¶m_ops_do_repeats, do_bulk, 0600); =20 /* * Using the CLASSMAP api: @@ -103,7 +123,10 @@ enum cat_disjoint_bits { D2_DRMRES }; =20 /* numeric verbosity, V2 > V1 related. V1 is > D2_DRMRES */ -enum cat_level_num { V1 =3D 16, V2, V3, V4, V5, V6, V7 }; +enum cat_level_num { V1 =3D 16, V2, V3, V4, V5, V6, V7, V8 }; + +/* test _USE_ w offset */ +enum cat_level_offset { Vu1 =3D V1 + 8, Vu2, Vu3, Vu4, Vu5, Vu6, Vu7, Vu8 = }; =20 /* recapitulate DRM's multi-classmap setup */ #if !defined(TEST_DYNAMIC_DEBUG_SUBMOD) @@ -126,7 +149,7 @@ DYNAMIC_DEBUG_CLASSMAP_DEFINE(map_disjoint_bits, DD_CLA= SS_TYPE_DISJOINT_BITS, "D2_DRMRES"); =20 DYNAMIC_DEBUG_CLASSMAP_DEFINE(map_level_num, DD_CLASS_TYPE_LEVEL_NUM, - V1, "V1", "V2", "V3", "V4", "V5", "V6", "V7"); + V1, "V1", "V2", "V3", "V4", "V5", "V6", "V7", "V8"); =20 #ifdef FORCE_CLASSID_CONFLICT /* @@ -136,18 +159,6 @@ DYNAMIC_DEBUG_CLASSMAP_DEFINE(map_level_num, DD_CLASS_= TYPE_LEVEL_NUM, DYNAMIC_DEBUG_CLASSMAP_DEFINE(classid_range_conflict, 0, D2_CORE + 1, "D3_= CORE"); #endif =20 -#else /* TEST_DYNAMIC_DEBUG_SUBMOD */ - -/* - * in submod/drm-drivers, use the classmaps defined in top/parent - * module above. - */ - -DYNAMIC_DEBUG_CLASSMAP_USE(map_disjoint_bits); -DYNAMIC_DEBUG_CLASSMAP_USE_(map_level_num, 7); - -enum cat_level_offset { Vu1 =3D V1 + 7, Vu2, Vu3, Vu4, Vu5, Vu6, Vu7 }; - #if defined(DD_MACRO_ARGCHECK) /* * Exersize compile-time arg-checks in DYNAMIC_DEBUG_CLASSMAP_DEFINE. @@ -160,6 +171,19 @@ DYNAMIC_DEBUG_CLASSMAP_DEFINE(fail_emptyclass, 0, 0 /*= ,empty */); DYNAMIC_DEBUG_CLASSMAP_DEFINE(fail_maptype, 3, 10, "no such type"); DYNAMIC_DEBUG_CLASSMAP_DEFINE(fail_base_len, 0, 60, "base", "plus", "classes", "length", "too-big"); +#endif + +#else /* TEST_DYNAMIC_DEBUG_SUBMOD */ + +/* + * in submod/drm-drivers, use the classmaps defined in top/parent + * module above. + */ + +DYNAMIC_DEBUG_CLASSMAP_USE(map_disjoint_bits); +DYNAMIC_DEBUG_CLASSMAP_USE_(map_level_num, 7); + +#if defined(DD_MACRO_ARGCHECK) DYNAMIC_DEBUG_CLASSMAP_USE_(fail_offset_big, 100); #endif /* DD_MACRO_ARGCHECK */ =20 @@ -202,6 +226,7 @@ static void do_levels(void) prdbg(V5); prdbg(V6); prdbg(V7); + prdbg(V8); #else prdbg(Vu1); prdbg(Vu2); @@ -210,20 +235,46 @@ static void do_levels(void) prdbg(Vu5); prdbg(Vu6); prdbg(Vu7); + prdbg(Vu8); #endif } =20 -static void do_prints(void) +static void do_classes(unsigned int ct) { - pr_debug("do_prints:\n"); - do_cats(); - do_levels(); + /* maybe clamp this */ + pr_debug("do_classes %u times:\n", ct); + for (; ct; ct--) { + do_cats(); + do_levels(); + cond_resched(); + } +} + +static void do_bulk(unsigned int ct) +{ + unsigned int i; + + pr_debug("do_bulk %u times:\n", ct); + for (i =3D 0; i < ct; i++) { + pr_debug("bulk msg %u.0\n", i + 1); + pr_debug("bulk msg %u.1\n", i + 1); + pr_debug("bulk msg %u.2\n", i + 1); + pr_debug("bulk msg %u.3\n", i + 1); + pr_debug("bulk msg %u.4\n", i + 1); + pr_debug("bulk msg %u.5\n", i + 1); + pr_debug("bulk msg %u.6\n", i + 1); + pr_debug("bulk msg %u.7\n", i + 1); + pr_debug("bulk msg %u.8\n", i + 1); + pr_debug("bulk msg %u.9\n", i + 1); + cond_resched(); + } } =20 static int __init test_dynamic_debug_init(void) { pr_debug("init start\n"); - do_prints(); + do_classes(1); + do_bulk(1); pr_debug("init done\n"); return 0; } diff --git a/tools/testing/selftests/dynamic_debug/dyndbg_selftest.sh b/too= ls/testing/selftests/dynamic_debug/dyndbg_selftest.sh index 51338ebc74bf..1bea45507352 100755 --- a/tools/testing/selftests/dynamic_debug/dyndbg_selftest.sh +++ b/tools/testing/selftests/dynamic_debug/dyndbg_selftest.sh @@ -185,6 +185,54 @@ function slice_and_hash_ddctrl { echo "$slice" | tr -d '\r' | md5sum | cut -d' ' -f1 } =20 +# =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D + +function verify_modprobe_param_logging { + # $1 - parameter name (e.g. do_prints) + # $2 - parameter value (e.g. 1) + local param=3D"$1" + local val=3D"$2" + + # Make sure both modules are completely unloaded to trigger a fresh lo= ad + ifrmmod test_dynamic_debug_submod + ifrmmod test_dynamic_debug + + # Capture and verify the load-time (modprobe) dmesg logs + log_start + my_modprobe test_dynamic_debug "${param}=3D${val}" + my_modprobe test_dynamic_debug_submod + + # If it is a state-controlling parameter, trigger the + # print-workload 'do_prints=3D1' inside the same syslog dmesg + # capture bookends to verify their actual pr_debug logging! + + if [ "$param" =3D "p_disjoint_bits" ] || [ "$param" =3D "p_level_num" = ]; then + set_param 1 /sys/module/test_dynamic_debug/parameters/do_classes + fi + + log_stop + + # Verify param write by direct readback + if [ "$param" =3D "p_disjoint_bits" ] || [ "$param" =3D "p_level_num" = ]; then + local readback=3D$(cat "/sys/module/test_dynamic_debug/parameters/= ${param}") + if (( readback !=3D val )); then + echo -e "${RED}: param readback failed: ${param} ${val} !=3D $= {readback}${NC}" + exit $ksft_fail + else + [ "$V" -ge 1 ] && \ + echo -e "${GREEN}=E2=9C=94 Parameter Readback Verified: ${param}=3D${rea= dback}${NC}" + fi + fi + + # verify runtime unsetting + if [ "$param" =3D "p_disjoint_bits" ] || [ "$param" =3D "p_level_num" = ]; then + + set_param 0 "/sys/module/test_dynamic_debug/parameters/${param}" + verify_control_slice '\[test_dynamic_debug\]' + + fi +} + # =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D # FEATURE TESTS (FT_*) # @@ -299,33 +347,38 @@ function FT_basic_queries { ddcmd "file $f =3D_" "$f" } =20 -function FT_classmap_inheritance { - v_echo "${GREEN}# TEST_MOD_SUBMOD ${NC}" +# testing classmap-based query enablers and class configurations +function FT_test_classes { + v_echo "${GREEN}# TEST_CLASSES - classmap-based query enablers and cla= ss configs ${NC}" =20 ifrmmod test_dynamic_debug_submod ifrmmod test_dynamic_debug + ddcmd =3D_ =20 - # modprobe with plain-old +p & 3 class enablements + # 1. Verify initial multi-query enablement state via file slice my_modprobe test_dynamic_debug \ - "dyndbg=3D+p;class D2_CORE +pf;class D2_KMS +pt;class D2_ATOMIC +pm" + dyndbg=3D"class D2_CORE,+pf;class D2_KMS,+ps;class D2_ATOMIC +pm" verify_control_slice '\[test_dynamic_debug\]' =20 - set_param 5 /sys/module/test_dynamic_debug/parameters/p_level_num - verify_control_slice '\[test_dynamic_debug\]' + # 2. Verify state transition and live-printing end-to-end via ddcmd_lo= ad! + ddcmd_load "class D2_CORE +pmf;class D2_KMS +pls;class D2_ATOMIC +pml"= \ + '\[test_dynamic_debug\]' \ + "/sys/module/test_dynamic_debug/parameters/do_classes" "1" =20 - my_modprobe test_dynamic_debug_submod - verify_control_slice 'test_dynamic_debug_submod' + ifrmmod test_dynamic_debug +} +function FT_classmap_inheritance { + v_echo "${GREEN}# TEST_MOD_SUBMOD - Classmap state inheritance between= supermod and submod ${NC}" =20 - # fresh start, to clear all above flags (test-fn limits) ifrmmod test_dynamic_debug_submod ifrmmod test_dynamic_debug =20 - # load submod, which loads supermod + # 1. Load submod directly (which auto-loads supermod with default para= meters) my_modprobe test_dynamic_debug_submod \ "dyndbg=3D+p;class D2_CORE +pfs;class D2_KMS +pts;class D2_ATOMIC +pmf" verify_control_slice 'test_dynamic_debug' =20 - # runtime changes to both + # 2. Runtime parameter changes to supermod propagate to submod descrip= tors set_param 0x57 /sys/module/test_dynamic_debug/parameters/p_disjoint_bi= ts set_param 4 /sys/module/test_dynamic_debug/parameters/p_level_num verify_control_slice 'test_dynamic_debug' @@ -333,19 +386,17 @@ function FT_classmap_inheritance { ifrmmod test_dynamic_debug_submod ifrmmod test_dynamic_debug =20 - # set super-mod params at load-time + # 3. Pre-initialize supermod parameter state at load-time my_modprobe test_dynamic_debug p_disjoint_bits=3D0x16 p_level_num=3D5 verify_control_slice '\[test_dynamic_debug\]' =20 - # see them picked up by submod + # 4. Verify submod inherits pre-initialized supermod classmap paramete= r state upon load my_modprobe test_dynamic_debug_submod verify_control_slice 'test_dynamic_debug' =20 - # Real-time mathematical proof that load-time (modprobe) parameter par= sing - # and runtime (sysfs write) parameter configurations are perfectly equ= ivalent! + # 5. Prove load-time (modprobe) and runtime (sysfs write) parameter eq= uivalence local hash_modprobe=3D$(slice_and_hash_ddctrl '\[test_dynamic_debug\]') =20 - # Fresh load with default parameters, then configure them dynamically = at runtime ifrmmod test_dynamic_debug_submod ifrmmod test_dynamic_debug my_modprobe test_dynamic_debug @@ -361,16 +412,43 @@ function FT_classmap_inheritance { v_echo "${GREEN}: Proven: parameter load-time (modprobe) " \ "and runtime (sysfs write) are equivalent!${NC}" fi - # --- Live Content Fingerprinting Phase --- + # 6. End-to-end syslog content logging verification log_start - echo 1 > /sys/module/test_dynamic_debug/parameters/do_prints - echo 1 > /sys/module/test_dynamic_debug_submod/parameters/do_prints + echo 1 > /sys/module/test_dynamic_debug/parameters/do_classes + echo 1 > /sys/module/test_dynamic_debug_submod/parameters/do_classes log_stop =20 ifrmmod test_dynamic_debug_submod ifrmmod test_dynamic_debug } =20 +function FT_modprobe_w_param { + v_echo "${GREEN}# TEST_MODPROBES ${NC}" + local verbose + + ifrmmod test_dynamic_debug_submod + ifrmmod test_dynamic_debug + + for verbose in 1 2; do # 3 4 0; do + echo $verbose > /sys/module/dynamic_debug/parameters/verbose + + # Verify each parameter load sequence with 100% DRY modularity + verify_modprobe_param_logging "do_classes" "1" + verify_modprobe_param_logging "do_bulk" "1" + + # Sequence composite bitmasks to verify disjoint bit transitions + for mask in "0x05" "0x12" "0x1f" "0x00"; do + verify_modprobe_param_logging "p_disjoint_bits" "$mask" + done + + # Sequence levels to verify both growing and shrinking verbose transitions + for lvl in "3" "5" "4" "0"; do + verify_modprobe_param_logging "p_level_num" "$lvl" + done + done + ddcmd =3D_ +} + # Built-in Feature Tests (Can run on any CONFIG_DYNAMIC_DEBUG kernel, modu= lar or monolithic) builtin_tests=3D( FT_grammar_ok @@ -380,7 +458,9 @@ builtin_tests=3D( =20 # Modular Feature Tests (Require CONFIG_MODULES=3Dy and test_dynamic_debug= *.ko available) modular_tests=3D( + FT_test_classes FT_classmap_inheritance + FT_modprobe_w_param ) =20 # =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D @@ -464,14 +544,50 @@ function GOLDEN_RECORDS { #K=3D 02e4fd94602e108cb89bfc70d47a5dad FT_basic_queries.5 #K=3D f03a7ca7316e8db4c0e16523dc41e75d FT_basic_queries.6 #K=3D c518a50ba30ba8099d0dc874a27ecf16 FT_basic_queries.7 -#K=3D fb294f02a4207b28b2a874524ef07afd FT_classmap_inheritance.1 -#K=3D 7a0b87016fdc237077dfe96bbbb3661b FT_classmap_inheritance.2 -#K=3D 2784d60f5056fc5cc03b3ceb854293f5 FT_classmap_inheritance.3 -#K=3D bf66aaf8ff612272c0cda29778ed2131 FT_classmap_inheritance.4 -#K=3D 49fdd29d91a4c1d16f8b59bb431e741b FT_classmap_inheritance.5 -#K=3D a8aa244285d048b5ebe33061fa99c424 FT_classmap_inheritance.6 -#K=3D 3060b86a0f553dd5a826bb7023284925 FT_classmap_inheritance.7 -#K=3D f43e0aff8a4b38435b73d90ed8100d1b FT_classmap_inheritance.8 +#K=3D 69f1958beef98211d4181f9ded9787c4 FT_test_classes.1 +#K=3D 5516e3d13cba7ea4197a7fb6c033887a FT_test_classes.2 +#K=3D 22213a7bf431c3e0efd3edbfcba69677 FT_test_classes.3 +#K=3D 934d8677872fe26bd636a6c3d6416aa2 FT_classmap_inheritance.1 +#K=3D cd1389958807063baa1ea4b06c61fa02 FT_classmap_inheritance.2 +#K=3D 0708a283f0f1959135c797e36119e4af FT_classmap_inheritance.3 +#K=3D 05f6efb80299d24cde65174f64d97308 FT_classmap_inheritance.4 +#K=3D 7e92245008439ee79fe2460aeaa16a9b FT_classmap_inheritance.5 +#K=3D 53d1b6875b65c79cfd759e209ae50b11 FT_modprobe_w_param.1 +#K=3D 53d1b6875b65c79cfd759e209ae50b11 FT_modprobe_w_param.2 +#K=3D 79d912e2aeb04dea70f9c7e701333f0a FT_modprobe_w_param.3 +#K=3D 6a320774e2b535ceb89d6cdde6f5d0fb FT_modprobe_w_param.4 +#K=3D 7cd75277388a6e7cf9c849442388f4af FT_modprobe_w_param.5 +#K=3D 6a320774e2b535ceb89d6cdde6f5d0fb FT_modprobe_w_param.6 +#K=3D 9196c43693f5e6059f3512e4d87e7347 FT_modprobe_w_param.7 +#K=3D 6a320774e2b535ceb89d6cdde6f5d0fb FT_modprobe_w_param.8 +#K=3D f9cee4512e5604603e0262fba4bea223 FT_modprobe_w_param.9 +#K=3D 6a320774e2b535ceb89d6cdde6f5d0fb FT_modprobe_w_param.10 +#K=3D b6a62433165f6423b81417f782551ab9 FT_modprobe_w_param.11 +#K=3D 6a320774e2b535ceb89d6cdde6f5d0fb FT_modprobe_w_param.12 +#K=3D de89753b843449d11da14240c4da4cad FT_modprobe_w_param.13 +#K=3D 6a320774e2b535ceb89d6cdde6f5d0fb FT_modprobe_w_param.14 +#K=3D 1d966d0cae735457791c93a86e9e1650 FT_modprobe_w_param.15 +#K=3D 6a320774e2b535ceb89d6cdde6f5d0fb FT_modprobe_w_param.16 +#K=3D 1aacb7c196a8354c46c60c73d78c6bf2 FT_modprobe_w_param.17 +#K=3D 6a320774e2b535ceb89d6cdde6f5d0fb FT_modprobe_w_param.18 +#K=3D e62014acf5ab6a76dfbfbcf67b2ca0e8 FT_modprobe_w_param.19 +#K=3D e62014acf5ab6a76dfbfbcf67b2ca0e8 FT_modprobe_w_param.20 +#K=3D 58c009cb287fa5df3f8c1c72c832cb42 FT_modprobe_w_param.21 +#K=3D 6a320774e2b535ceb89d6cdde6f5d0fb FT_modprobe_w_param.22 +#K=3D e7831be2aac4a82daba43966b9d31e19 FT_modprobe_w_param.23 +#K=3D 6a320774e2b535ceb89d6cdde6f5d0fb FT_modprobe_w_param.24 +#K=3D 4df2fbc0cae329debb14bedb5e7d86c0 FT_modprobe_w_param.25 +#K=3D 6a320774e2b535ceb89d6cdde6f5d0fb FT_modprobe_w_param.26 +#K=3D 7fa4c84490c42c750986614c3539d56a FT_modprobe_w_param.27 +#K=3D 6a320774e2b535ceb89d6cdde6f5d0fb FT_modprobe_w_param.28 +#K=3D 1eb866a813551061cd73178ba7833543 FT_modprobe_w_param.29 +#K=3D 6a320774e2b535ceb89d6cdde6f5d0fb FT_modprobe_w_param.30 +#K=3D a9e7424ed7b02696b5e12108971792dd FT_modprobe_w_param.31 +#K=3D 6a320774e2b535ceb89d6cdde6f5d0fb FT_modprobe_w_param.32 +#K=3D 5323d7746d983cdcfda4866255cd5123 FT_modprobe_w_param.33 +#K=3D 6a320774e2b535ceb89d6cdde6f5d0fb FT_modprobe_w_param.34 +#K=3D 7f961a7d3facd89bdd4b9d8e7b5541e9 FT_modprobe_w_param.35 +#K=3D 6a320774e2b535ceb89d6cdde6f5d0fb FT_modprobe_w_param.36 EOF # Read the K-recs and skip those for tests that can't run while read -r line; do --=20 2.55.0 From nobody Fri Sep 25 04:43:45 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A2707525A77; Wed, 16 Sep 2026 15:33:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789572785; cv=none; b=h/0XkIRtzb6HWsQE1QerJILC+PDZoEPz2NnRbRlpXq4i7feEaC/OmX6gn2hY5OEF5S0OBsxzmLLoJnGak7v8309tri/lDNSI7eZd1ya1f1yjhJ9Te0geGpJAT28mPQOkn1KhvGvNCcxcjXOY1TXFKH9dgKdki8beVPScQZOzwWU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789572785; c=relaxed/simple; bh=9g0voY1WpZwJrJcVSXBymdpQKXKsZyQJHLmkfL5AT1A=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=d8MYvjp7Dku8vJmmp/tMb5+M9SyNT2tSh4PJ2k0mZehT6uesR8r2mZkoZLbowSU4IOxJYHmVzctqTxq/vt0aoL4HuBCQUXlOYVNwSIxAgxig6CzWNe5u/SduUGv2sme57weveNm7OV6GAqEFD+pIrpkVsopJYZ5a6R2lQkZb1Es= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=IzVE0vMX; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="IzVE0vMX" Received: by smtp.kernel.org (Postfix) with ESMTPS id 81398C4AF12; Wed, 16 Sep 2026 15:33:02 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1789572782; bh=9g0voY1WpZwJrJcVSXBymdpQKXKsZyQJHLmkfL5AT1A=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=IzVE0vMXMoXCsjt9DuOwuyAUozmZ4ktLinDUuL+st/gYVsl2/QY8vQ5oWs35qQ79m vRKfORPFln2kRP6sm4hzn+tB938K3JSBQa0E4AD5mwSUOX015w3+HfGLVBTLNh2kJx YmfLoNYI7fcKz/5CyICZuV50M0uAG7U51xzhwR38WTm1UNX9jJgGi4+XgIdPdI8bIL i3dJtySPR1NPNH0SiwVnrNoBDU959w6Rx9i0zMORZjHJoGQ694gqNqCTAe7nZ7vYZl X0tDBjen5QkT93i+OU25CrIXyrUM98wsao04Ha24RwRr1itkHFNaNipfgyfa2wL0BI 4eRD5NofWVwMw== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 6C9FAC982C3; Wed, 16 Sep 2026 15:33:02 +0000 (UTC) From: Jim Cromie via B4 Relay Date: Wed, 16 Sep 2026 09:33:20 -0600 Subject: [PATCH v10 28/38] dyndbg-API: promote DYNAMIC_DEBUG_CLASSMAP_PARAM to API Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260916-dd-cmap-part2-clean-v10-28-af4cf4767707@gmail.com> References: <20260916-dd-cmap-part2-clean-v10-0-af4cf4767707@gmail.com> In-Reply-To: <20260916-dd-cmap-part2-clean-v10-0-af4cf4767707@gmail.com> To: Jason Baron , Shuah Khan , Andrew Morton , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Arnd Bergmann , Luis Chamberlain , Petr Pavlu , Daniel Gomez , Sami Tolvanen , Aaron Tomlin , Jonathan Corbet , Greg Kroah-Hartman , Nathan Chancellor , Nicolas Schier , Shuah Khan , Randy Dunlap , "Rafael J. Wysocki" , Pavel Machek , Len Brown Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-arch@vger.kernel.org, linux-modules@vger.kernel.org, linux-doc@vger.kernel.org, linux-kbuild@vger.kernel.org, linux-pm@vger.kernel.org, Jim Cromie , Louis Chauvet X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789572777; l=15336; i=jim.cromie@gmail.com; s=20260203; h=from:subject:message-id; bh=HeXIsZix2F/mOCg1sqddVl9Q55ZdM/0ngfkTnOZFN/0=; b=qCciUY2UpzGYTtl0f/nnyEqLb2pe7bcDXbs+ERk+VNZ83zaVuMI3jl9oyop5oVaeg2h02ydun 1d08JQm3JFWBXHl/jTdz0OibS+B4w4RqEEMrIwPvrbOX/2HfoLfX/J5 X-Developer-Key: i=jim.cromie@gmail.com; a=ed25519; pk=C6E5ODlPQo7ZBynATXH9wg7K6HxP0pIXyf4s38Qw0XE= X-Endpoint-Received: by B4 Relay for jim.cromie@gmail.com/20260203 with auth_id=958 X-Original-From: Jim Cromie Reply-To: jim.cromie@gmail.com From: Jim Cromie move the DYNAMIC_DEBUG_CLASSMAP_PARAM macro from test-dynamic-debug.c into the header, and refine it, by distinguishing the 2 use cases: 1.DYNAMIC_DEBUG_CLASSMAP_PARAM_REF for DRM, to pass in extern __drm_debug by name. dyndbg keeps bits in it, so drm can still use it as before 2.DYNAMIC_DEBUG_CLASSMAP_PARAM new user (test_dynamic_debug) doesn't need to share state, declares a u32 to store the bitvec. __DYNAMIC_DEBUG_CLASSMAP_PARAM bottom layer - allocate,init a ddebug-class-param, module-param-cb. Also add stub macros, clean up and improve comments in test-code, and add MODULE_DESCRIPTIONs. cc: linux-doc@vger.kernel.org Signed-off-by: Jim Cromie Reviewed-by: Louis Chauvet --- v10: . define _DPRINTK_CLASSBITS_INIT and initialize static state bitvector. . add module_param_named fallback for DYNAMIC_DEBUG_CLASSMAP_PARAM* in !CON= FIG_DYNAMIC_DEBUG. v9: . fix 4-argument signature for DYNAMIC_DEBUG_CLASSMAP_PARAM_REF fallback ma= cro stub. . update format specifier from %d to %u for inrep in ddebug_class_param_cla= mp_input(). . drop duplicate v2pr_info() line in param_set_dyndbg_module_classes(). . drop unused CLASSMAP_BITMASK(width, base) define in test_dynamic_debug.c. --- include/linux/dynamic_debug.h | 51 ++++++++++++++ lib/dynamic_debug.c | 77 +++++++++++-------= ---- lib/test_dynamic_debug.c | 55 ++++++---------- lib/test_dynamic_debug_submod.c | 9 ++- .../selftests/dynamic_debug/dyndbg_selftest.sh | 2 +- 5 files changed, 118 insertions(+), 76 deletions(-) diff --git a/include/linux/dynamic_debug.h b/include/linux/dynamic_debug.h index 26c858588eb1..3114f4f28be4 100644 --- a/include/linux/dynamic_debug.h +++ b/include/linux/dynamic_debug.h @@ -60,6 +60,8 @@ struct _ddebug { #else #define _DPRINTK_FLAGS_DEFAULT 0 #endif +#define _DPRINTK_CLASSBITS_INIT ((_DPRINTK_FLAGS_DEFAULT & _DPRINTK_FLAGS_= PRINT) ? ~0U : 0U) + unsigned int flags:8; #ifdef CONFIG_JUMP_LABEL union { @@ -286,6 +288,44 @@ struct ddebug_class_param { .offset =3D _offset \ } =20 +/** + * DYNAMIC_DEBUG_CLASSMAP_PARAM - control a ddebug-classmap from a sys-par= am + * @_name: sysfs node name + * @_var: name of the classmap var defining the controlled classes/bits + * @_flags: flags to be toggled, typically just 'p' + * + * Creates a sysfs-param to control the classes defined by the + * exported classmap, with bits 0..N-1 mapped to the classes named. + * This version keeps class-state in a private long int. + */ +#define DYNAMIC_DEBUG_CLASSMAP_PARAM(_name, _var, _flags) \ + static u32 _name##_bvec =3D _DPRINTK_CLASSBITS_INIT; \ + __DYNAMIC_DEBUG_CLASSMAP_PARAM(_name, _name##_bvec, _var, _flags) + +/** + * DYNAMIC_DEBUG_CLASSMAP_PARAM_REF - wrap a classmap with a controlling s= ys-param + * @_name: sysfs node name + * @_bits: name of the module's u32 bit-vector, ex: __drm_debug + * @_var: name of the (exported) classmap var defining the classes/bits + * @_flags: flags to be toggled, typically just 'p' + * + * Creates a sysfs-param to control the classes defined by the + * exported clasmap, with bits 0..N-1 mapped to the classes named. + * This version keeps class-state in user @_bits. This lets drm check + * __drm_debug elsewhere too. + */ +#define DYNAMIC_DEBUG_CLASSMAP_PARAM_REF(_name, _bits, _var, _flags) \ + __DYNAMIC_DEBUG_CLASSMAP_PARAM(_name, _bits, _var, _flags) + +#define __DYNAMIC_DEBUG_CLASSMAP_PARAM(_name, _bits, _var, _flags) \ + static struct ddebug_class_param _name##_##_flags =3D { \ + .bits =3D &(_bits), \ + .flags =3D #_flags, \ + .map =3D &(_var), \ + }; \ + module_param_cb(_name, ¶m_ops_dyndbg_classes, \ + &_name##_##_flags, 0600) + extern __printf(2, 3) void __dynamic_pr_debug(struct _ddebug *descriptor, const char *fmt, ...); =20 @@ -466,9 +506,20 @@ void __dynamic_ibdev_dbg(struct _ddebug *descriptor, #include #include =20 +#if defined(DEBUG) +#define _DPRINTK_CLASSBITS_INIT ~0U +#else +#define _DPRINTK_CLASSBITS_INIT 0U +#endif + #define DYNAMIC_DEBUG_CLASSMAP_DEFINE(_var, _mapty, _base, ...) #define DYNAMIC_DEBUG_CLASSMAP_USE(_var) #define DYNAMIC_DEBUG_CLASSMAP_USE_(_var, _offset) +#define DYNAMIC_DEBUG_CLASSMAP_PARAM(_name, _var, _flags) \ + static u32 _name##_bvec =3D _DPRINTK_CLASSBITS_INIT; \ + module_param_named(_name, _name##_bvec, uint, 0600) +#define DYNAMIC_DEBUG_CLASSMAP_PARAM_REF(_name, _bits, _var, _flags) \ + module_param_named(_name, _bits, uint, 0600) #define DEFINE_DYNAMIC_DEBUG_METADATA(name, fmt) #define DYNAMIC_DEBUG_BRANCH(descriptor) false #define DECLARE_DYNDBG_CLASSMAP(...) diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c index 7736fb3d3b79..2347d13e1d30 100644 --- a/lib/dynamic_debug.c +++ b/lib/dynamic_debug.c @@ -697,9 +697,42 @@ static int ddebug_apply_class_bitmap(const struct ddeb= ug_class_param *dcp, =20 #define CLASSMAP_BITMASK(width) ((width) >=3D 32 ? ~0U : (1U << (width)) -= 1) =20 -/* - * param-setter helper to validate numeric input, clamp its value by - * the classmap type and size, and apply the bits. +static void __maybe_unused ddebug_class_param_clamp_input(u32 *inrep, cons= t struct kernel_param *kp) +{ + const struct ddebug_class_param *dcp =3D kp->arg; + const struct ddebug_class_map *map =3D dcp->map; + + switch (map->map_type) { + case DD_CLASS_TYPE_DISJOINT_BITS: + /* expect bits. mask and warn if too many */ + if (*inrep & ~CLASSMAP_BITMASK(map->length)) { + pr_warn("%s: input: 0x%x exceeds mask: 0x%x, masking\n", + KP_NAME(kp), *inrep, CLASSMAP_BITMASK(map->length)); + *inrep &=3D CLASSMAP_BITMASK(map->length); + } + break; + case DD_CLASS_TYPE_LEVEL_NUM: + /* input is bitpos, of highest verbosity to be enabled */ + if (*inrep > map->length) { + pr_warn("%s: level:%u exceeds max:%d, clamping\n", + KP_NAME(kp), *inrep, map->length); + *inrep =3D map->length; + } + break; + } +} + +/** + * 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 + * @mod_name: module name or null for all modules with the classes + * + * 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. */ static int param_set_dyndbg_module_classes(const char *instr, const struct kernel_param *kp, @@ -718,27 +751,16 @@ static int param_set_dyndbg_module_classes(const char= *instr, len, instr, KP_NAME(kp)); return -EINVAL; } + ddebug_class_param_clamp_input(&inrep, kp); =20 switch (map->map_type) { case DD_CLASS_TYPE_DISJOINT_BITS: - /* expect bits. mask and warn if too many */ - if (inrep & ~CLASSMAP_BITMASK(map->length)) { - pr_warn("%s: input: 0x%x exceeds mask: 0x%x, masking\n", - KP_NAME(kp), inrep, CLASSMAP_BITMASK(map->length)); - inrep &=3D CLASSMAP_BITMASK(map->length); - } old_val =3D READ_ONCE(*dcp->bits); v2pr_info("bits:0x%x > %s.%s\n", inrep, mod_name ?: "*", KP_NAME(kp)); totct +=3D ddebug_apply_class_bitmap(dcp, &inrep, old_val, mod_name); WRITE_ONCE(*dcp->bits, inrep); break; case DD_CLASS_TYPE_LEVEL_NUM: - /* input is bitpos, of highest verbosity to be enabled */ - if (inrep > map->length) { - pr_warn("%s: level:%u exceeds max:%d, clamping\n", - KP_NAME(kp), inrep, map->length); - inrep =3D map->length; - } old_val =3D READ_ONCE(*dcp->lvl); old_bits =3D CLASSMAP_BITMASK(old_val); new_bits =3D CLASSMAP_BITMASK(inrep); @@ -1236,30 +1258,7 @@ static inline u32 ddebug_class_param_to_bits(const s= truct ddebug_class_param *dc } } =20 -static void __maybe_unused ddebug_class_param_clamp_input(u32 *inrep, cons= t struct kernel_param *kp) -{ - const struct ddebug_class_param *dcp =3D kp->arg; - const struct ddebug_class_map *map =3D dcp->map; =20 - switch (map->map_type) { - case DD_CLASS_TYPE_DISJOINT_BITS: - /* expect bits. mask and warn if too many */ - if (*inrep & ~CLASSMAP_BITMASK(map->length)) { - pr_warn("%s: input: 0x%x exceeds mask: 0x%x, masking\n", - KP_NAME(kp), *inrep, CLASSMAP_BITMASK(map->length)); - *inrep &=3D CLASSMAP_BITMASK(map->length); - } - break; - case DD_CLASS_TYPE_LEVEL_NUM: - /* input is bitpos, of highest verbosity to be enabled */ - if (*inrep > map->length) { - pr_warn("%s: level:%d exceeds max:%d, clamping\n", - KP_NAME(kp), *inrep, map->length); - *inrep =3D map->length; - } - break; - } -} =20 /* called for class-users only, parse_one does this for definer modules */ static void ddebug_sync_classbits(const struct kernel_param *kp, const cha= r *modname) @@ -1270,7 +1269,7 @@ static void ddebug_sync_classbits(const struct kernel= _param *kp, const char *mod if (!dcp || !dcp->map) return; =20 - init_bits =3D (_DPRINTK_FLAGS_DEFAULT & _DPRINTK_FLAGS_PRINT) ? + init_bits =3D _DPRINTK_CLASSBITS_INIT ? CLASSMAP_BITMASK(dcp->map->length) : 0; =20 switch (dcp->map->map_type) { diff --git a/lib/test_dynamic_debug.c b/lib/test_dynamic_debug.c index 560e23f14ac8..7c10a1ddc630 100644 --- a/lib/test_dynamic_debug.c +++ b/lib/test_dynamic_debug.c @@ -1,6 +1,7 @@ // SPDX-License-Identifier: GPL-2.0-only /* - * Kernel module for testing dynamic_debug + * Kernel module to test/demonstrate dynamic_debug features, + * particularly classmaps and their support for subsystems like DRM. * * Authors: * Jim Cromie @@ -68,33 +69,6 @@ static const struct kernel_param_ops param_ops_do_repeat= s =3D { module_param_cb(do_classes, ¶m_ops_do_repeats, do_classes, 0600); module_param_cb(do_bulk, ¶m_ops_do_repeats, do_bulk, 0600); =20 -/* - * Using the CLASSMAP api: - * - classmaps must have corresponding enum - * - enum symbols must match/correlate with class-name strings in the map. - * - base must equal enum's 1st value - * - multiple maps must set their base to share the 0-30 class_id space !! - * (build-bug-on tips welcome) - * Additionally, here: - * - tie together sysname, mapname, bitsname, flagsname - */ -#define DYNAMIC_DEBUG_CLASSMAP_PARAM_(_model, _flags, _init) \ - static u32 bits_##_model =3D _init; \ - static struct ddebug_class_param _flags##_##_model =3D { \ - .bits =3D &bits_##_model, \ - .flags =3D #_flags, \ - .map =3D &map_##_model, \ - }; \ - module_param_cb(_flags##_##_model, ¶m_ops_dyndbg_classes, \ - &_flags##_##_model, 0600) -#ifdef DEBUG -#define DYNAMIC_DEBUG_CLASSMAP_PARAM(_model, _flags) \ - DYNAMIC_DEBUG_CLASSMAP_PARAM_(_model, _flags, ~0) -#else -#define DYNAMIC_DEBUG_CLASSMAP_PARAM(_model, _flags) \ - DYNAMIC_DEBUG_CLASSMAP_PARAM_(_model, _flags, 0) -#endif - /* * Demonstrate/test DISJOINT & LEVEL typed classmaps with a sys-param. * @@ -128,12 +102,15 @@ enum cat_level_num { V1 =3D 16, V2, V3, V4, V5, V6, V= 7, V8 }; /* test _USE_ w offset */ enum cat_level_offset { Vu1 =3D V1 + 8, Vu2, Vu3, Vu4, Vu5, Vu6, Vu7, Vu8 = }; =20 -/* recapitulate DRM's multi-classmap setup */ +/* + * use/demonstrate multi-module-group classmaps, as for DRM + */ #if !defined(TEST_DYNAMIC_DEBUG_SUBMOD) /* - * In single user, or parent / coordinator (drm.ko) modules, define - * classmaps on the client enums above, and then declares the PARAMS - * ref'g the classmaps. Each is exported. + * For module-groups of 1+, define classmaps with names (stringified + * enum-symbols) copied from above. 1-to-1 mapping is recommended. + * The classmap is exported, so that other modules in the group can + * link to it and control their prdbgs. */ DYNAMIC_DEBUG_CLASSMAP_DEFINE(map_disjoint_bits, DD_CLASS_TYPE_DISJOINT_BI= TS, D2_CORE, @@ -151,6 +128,15 @@ DYNAMIC_DEBUG_CLASSMAP_DEFINE(map_disjoint_bits, DD_CL= ASS_TYPE_DISJOINT_BITS, DYNAMIC_DEBUG_CLASSMAP_DEFINE(map_level_num, DD_CLASS_TYPE_LEVEL_NUM, V1, "V1", "V2", "V3", "V4", "V5", "V6", "V7", "V8"); =20 +/* + * for use-cases that want it, provide a sysfs-param to set the + * classes in the classmap. It is at this interface where the + * "v3>v2" property is applied to DD_CLASS_TYPE_LEVEL_NUM inputs. + */ + +DYNAMIC_DEBUG_CLASSMAP_PARAM(p_disjoint_bits, map_disjoint_bits, p); +DYNAMIC_DEBUG_CLASSMAP_PARAM(p_level_num, map_level_num, p); + #ifdef FORCE_CLASSID_CONFLICT /* * Enable with -Dflag on compile to test overlapping class-id range @@ -159,6 +145,7 @@ DYNAMIC_DEBUG_CLASSMAP_DEFINE(map_level_num, DD_CLASS_T= YPE_LEVEL_NUM, DYNAMIC_DEBUG_CLASSMAP_DEFINE(classid_range_conflict, 0, D2_CORE + 1, "D3_= CORE"); #endif =20 + #if defined(DD_MACRO_ARGCHECK) /* * Exersize compile-time arg-checks in DYNAMIC_DEBUG_CLASSMAP_DEFINE. @@ -192,8 +179,6 @@ DYNAMIC_DEBUG_CLASSMAP_USE_(fail_offset_big, 100); /* * now add the sysfs-params to both sub/super-mods */ -DYNAMIC_DEBUG_CLASSMAP_PARAM(disjoint_bits, p); -DYNAMIC_DEBUG_CLASSMAP_PARAM(level_num, p); =20 /* stand-in for all pr_debug etc */ #define prdbg(SYM) __pr_debug_cls(SYM, #SYM " msg\n") @@ -288,5 +273,5 @@ module_init(test_dynamic_debug_init); module_exit(test_dynamic_debug_exit); =20 MODULE_AUTHOR("Jim Cromie "); -MODULE_DESCRIPTION("Kernel module for testing dynamic_debug"); +MODULE_DESCRIPTION("test/demonstrate dynamic-debug features"); MODULE_LICENSE("GPL"); diff --git a/lib/test_dynamic_debug_submod.c b/lib/test_dynamic_debug_submo= d.c index 672aabf40160..3adf3925fb86 100644 --- a/lib/test_dynamic_debug_submod.c +++ b/lib/test_dynamic_debug_submod.c @@ -1,6 +1,9 @@ // SPDX-License-Identifier: GPL-2.0 /* - * Kernel module for testing dynamic_debug + * Kernel module to test/demonstrate dynamic_debug features, + * particularly classmaps and their support for subsystems, like DRM, + * which defines its drm_debug classmap in drm module, and uses it in + * helpers & drivers. * * Authors: * Jim Cromie @@ -12,3 +15,7 @@ */ #define TEST_DYNAMIC_DEBUG_SUBMOD #include "test_dynamic_debug.c" + +MODULE_DESCRIPTION("test/demonstrate dynamic-debug subsystem support"); +MODULE_AUTHOR("Jim Cromie "); +MODULE_LICENSE("GPL"); diff --git a/tools/testing/selftests/dynamic_debug/dyndbg_selftest.sh b/too= ls/testing/selftests/dynamic_debug/dyndbg_selftest.sh index 1bea45507352..8d3f1e49e9e1 100755 --- a/tools/testing/selftests/dynamic_debug/dyndbg_selftest.sh +++ b/tools/testing/selftests/dynamic_debug/dyndbg_selftest.sh @@ -546,7 +546,7 @@ function GOLDEN_RECORDS { #K=3D c518a50ba30ba8099d0dc874a27ecf16 FT_basic_queries.7 #K=3D 69f1958beef98211d4181f9ded9787c4 FT_test_classes.1 #K=3D 5516e3d13cba7ea4197a7fb6c033887a FT_test_classes.2 -#K=3D 22213a7bf431c3e0efd3edbfcba69677 FT_test_classes.3 +#K=3D 20d4545f9753e677e72e3adf52527fd3 FT_test_classes.3 #K=3D 934d8677872fe26bd636a6c3d6416aa2 FT_classmap_inheritance.1 #K=3D cd1389958807063baa1ea4b06c61fa02 FT_classmap_inheritance.2 #K=3D 0708a283f0f1959135c797e36119e4af FT_classmap_inheritance.3 --=20 2.55.0 From nobody Fri Sep 25 04:43:45 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DD2A553444B; Wed, 16 Sep 2026 15:33:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789572784; cv=none; b=m4Lualw2hiA1zb370r89Tz0K6yY2O535N7Ub/nz9sDskK5vMrglEMStonARnyvEF1so1JOCnAPUveC8pIEKwXt8Dt3gnMQ+1nDLwZLBrkn1rB/DC+R/tA3Z+9JcmdScVPCs/now4IwTd2NxRd5rNbWytJdZGDsfaXywX+NV+GGY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789572784; c=relaxed/simple; bh=9rDKS7sHJtsb0Bx6Y5Jcawy/ppk1uKvlwlGnLM9zpRk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=IcuoXNQAhP1F7l2+BHb6LCAvVBhbCDrOyEvTTKPjOULkug254CH/EhgBgEr96qEGyGnPx0PlxYKVu2W9D8wG/o9siQe5uLJMhzX54PJHCblVx6QdFK9hqRdk3pJUM0blF7OdUssm4LtfKsZ/U9Vtmo8VqsKJCWPT3ZuOH2c6M1M= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=mErAqwQ9; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="mErAqwQ9" Received: by smtp.kernel.org (Postfix) with ESMTPS id BBF7FC2BCC7; Wed, 16 Sep 2026 15:33:02 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1789572782; bh=9rDKS7sHJtsb0Bx6Y5Jcawy/ppk1uKvlwlGnLM9zpRk=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=mErAqwQ9xGkbfa+0iu8Ncu3x5XA4/bZCC9flFu1ekP5T2Xygqcrzy5oGQa498xqSo 6/MjlwG5DhycvydpApm4oPYAPnI8SKGsr5iNOH5BwDRo7y43x+9sqY3Kgk27GDj+vN j8xsMJUH6U4+5ACNP381qRoIPAx3proPY785jcKpPzrTmty1+S+I9qDBi8KhPH+vWl iieaqVxqwNQH7f3NIa5TwjNRO0cYJPwUJxbJGbsFEvKy1UwnpfdceCNzMNZbX11oXV eVWEIea8wK2nii4FBQAw7glrIPZ9DJk8RyyWulWJDhrEkT9mMY+zYU9CYPxamQSpur X864+QKwjQKAg== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id A92F8C982C3; Wed, 16 Sep 2026 15:33:02 +0000 (UTC) From: Jim Cromie via B4 Relay Date: Wed, 16 Sep 2026 09:33:21 -0600 Subject: [PATCH v10 29/38] dyndbg: control-parser: treat comma as a token separator Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260916-dd-cmap-part2-clean-v10-29-af4cf4767707@gmail.com> References: <20260916-dd-cmap-part2-clean-v10-0-af4cf4767707@gmail.com> In-Reply-To: <20260916-dd-cmap-part2-clean-v10-0-af4cf4767707@gmail.com> To: Jason Baron , Shuah Khan , Andrew Morton , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Arnd Bergmann , Luis Chamberlain , Petr Pavlu , Daniel Gomez , Sami Tolvanen , Aaron Tomlin , Jonathan Corbet , Greg Kroah-Hartman , Nathan Chancellor , Nicolas Schier , Shuah Khan , Randy Dunlap , "Rafael J. Wysocki" , Pavel Machek , Len Brown Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-arch@vger.kernel.org, linux-modules@vger.kernel.org, linux-doc@vger.kernel.org, linux-kbuild@vger.kernel.org, linux-pm@vger.kernel.org, Jim Cromie X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789572777; l=4314; i=jim.cromie@gmail.com; s=20260203; h=from:subject:message-id; bh=ZrDeIcpsLRk/IxP797PogO5syy10nLdePZS+aXPsHJY=; b=GB4bsD2HatYcvN0T3z+I9+kLJpIBpn05xlf9MnaBSAgf6+dfC1nEFUw6wpW8Aa3GIrOiPOFgT MCJY5DQZWhjDM33VBjQGivsYj/HMtGw2qeA2DJJ2B8Zg9q0svgRKM7P X-Developer-Key: i=jim.cromie@gmail.com; a=ed25519; pk=C6E5ODlPQo7ZBynATXH9wg7K6HxP0pIXyf4s38Qw0XE= X-Endpoint-Received: by B4 Relay for jim.cromie@gmail.com/20260203 with auth_id=958 X-Original-From: Jim Cromie Reply-To: jim.cromie@gmail.com From: Jim Cromie Treat comma as a token terminator, just like a space. This allows a user to avoid quoting hassles when spaces are otherwise needed: :#> modprobe drm dyndbg=3Dclass,DRM_UT_CORE,+p\;class,DRM_UT_KMS,+p Add corresponding Strategy 2 control-file fingerprinting checks to verify the exact control-file state of kernel/params callsites after commas-as-spaces, ignored-commas, and quoted-commas queries. Signed-off-by: Jim Cromie --- Documentation/admin-guide/dynamic-debug-howto.rst | 4 +++- lib/dynamic_debug.c | 17 +++++++++++++= ---- .../testing/selftests/dynamic_debug/dyndbg_selftest.sh | 4 ++-- 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/Documentation/admin-guide/dynamic-debug-howto.rst b/Documentat= ion/admin-guide/dynamic-debug-howto.rst index 9c2f096ed1d8..b9fbb2a12955 100644 --- a/Documentation/admin-guide/dynamic-debug-howto.rst +++ b/Documentation/admin-guide/dynamic-debug-howto.rst @@ -78,11 +78,12 @@ Command Language Reference =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D =20 At the basic lexical level, a command is a sequence of words separated -by spaces or tabs. So these are all equivalent:: +by spaces, tabs, or commas. So these are all equivalent:: =20 :#> ddcmd file svcsock.c line 1603 +p :#> ddcmd "file svcsock.c line 1603 +p" :#> ddcmd ' file svcsock.c line 1603 +p ' + :#> ddcmd file,svcsock.c,line,1603,+p =20 Command submissions are bounded by a write() system call. Multiple commands can be written together, separated by ``;`` or ``\n``:: @@ -172,6 +173,7 @@ module module sunrpc module nfsd module drm* # both drm, drm_kms_helper + module,sunrpc # with ',' as token separator =20 format The given string is searched for in the dynamic debug format diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c index 2347d13e1d30..0720fc4f7a90 100644 --- a/lib/dynamic_debug.c +++ b/lib/dynamic_debug.c @@ -322,6 +322,14 @@ static int ddebug_change(const struct ddebug_query *qu= ery, struct flag_settings return nfound; } =20 +static char *skip_spaces_and_commas(const char *str) +{ + str =3D skip_spaces(str); + while (*str =3D=3D ',') + str =3D skip_spaces(++str); + return (char *)str; +} + /* * Split the buffer `buf' into space-separated words. * Handles simple " and ' quoting, i.e. without nested, @@ -335,8 +343,8 @@ static int ddebug_tokenize(char *buf, char *words[], in= t maxwords) while (*buf) { char *end; =20 - /* Skip leading whitespace */ - buf =3D skip_spaces(buf); + /* Skip leading whitespace and comma */ + buf =3D skip_spaces_and_commas(buf); if (!*buf) break; /* oh, it was trailing whitespace */ if (*buf =3D=3D '#') @@ -352,7 +360,7 @@ static int ddebug_tokenize(char *buf, char *words[], in= t maxwords) return -EINVAL; /* unclosed quote */ } } else { - for (end =3D buf; *end && !isspace(*end); end++) + for (end =3D buf; *end && !isspace(*end) && *end !=3D ','; end++) ; if (end =3D=3D buf) { pr_err("parse err after word:%d=3D%s\n", nwords, @@ -627,7 +635,8 @@ static int ddebug_exec_queries(char *query, const char = *modname) if (split) *split++ =3D '\0'; =20 - query =3D skip_spaces(query); + query =3D skip_spaces_and_commas(query); + if (!query || !*query || *query =3D=3D '#') continue; =20 diff --git a/tools/testing/selftests/dynamic_debug/dyndbg_selftest.sh b/too= ls/testing/selftests/dynamic_debug/dyndbg_selftest.sh index 8d3f1e49e9e1..d485b9245164 100755 --- a/tools/testing/selftests/dynamic_debug/dyndbg_selftest.sh +++ b/tools/testing/selftests/dynamic_debug/dyndbg_selftest.sh @@ -544,8 +544,8 @@ function GOLDEN_RECORDS { #K=3D 02e4fd94602e108cb89bfc70d47a5dad FT_basic_queries.5 #K=3D f03a7ca7316e8db4c0e16523dc41e75d FT_basic_queries.6 #K=3D c518a50ba30ba8099d0dc874a27ecf16 FT_basic_queries.7 -#K=3D 69f1958beef98211d4181f9ded9787c4 FT_test_classes.1 -#K=3D 5516e3d13cba7ea4197a7fb6c033887a FT_test_classes.2 +#K=3D 8f18ea82c09460434b6e9e4cd12543e8 FT_test_classes.1 +#K=3D a15ec4843acd721fbdfddc0b512c8032 FT_test_classes.2 #K=3D 20d4545f9753e677e72e3adf52527fd3 FT_test_classes.3 #K=3D 934d8677872fe26bd636a6c3d6416aa2 FT_classmap_inheritance.1 #K=3D cd1389958807063baa1ea4b06c61fa02 FT_classmap_inheritance.2 --=20 2.55.0 From nobody Fri Sep 25 04:43:45 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7F89A525A78; Wed, 16 Sep 2026 15:33:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789572785; cv=none; b=i7EcV/Nu+gVq4A+tUNBsqXmvxtNmHmZHr9cM9wddXxNx9Yq2nYJOEAJSTsi4gQbzAHsrLnCLElljBvYtXud/s3QhMsSdPRxvzjCVDXWEA4JMHaFjFKk/pW2ciiUiI7SHIkZlwGUMmASBccTErtfbFx3k5lSnf2PIrM40UGHabWE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789572785; c=relaxed/simple; bh=4tBoL20Lq4iw5ATrhUM/tahGCAQuI1T++gRkOEKTNiw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=nztnU9qXfJXtcBKC2hMq/0e3owBAFLQVUrGdCH9yoF1pPdWlg+Sltecs2ekI3RZTgPy3h0vLtuR/6/3jf1HbdmE29Yo3TTggRcO5aFZqS4yj9J//ZxQWXhyBdzyG3pc/Wm6BK9iI7RSiaN67XkKOuvlFuWEPNWNtbFGj4gmY0Po= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=u3x5V4yv; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="u3x5V4yv" Received: by smtp.kernel.org (Postfix) with ESMTPS id D5896C2BCB3; Wed, 16 Sep 2026 15:33:02 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1789572782; bh=4tBoL20Lq4iw5ATrhUM/tahGCAQuI1T++gRkOEKTNiw=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=u3x5V4yvXbRR0I395sTK/gZwbT6ujbPJbHQ1EXs4buecFimpKK4FExOXciIKVCxwa pCYA4c305rIwZDwb2vN1Ndn0vwFO3bonoBHRomzayuYHvg0vplIjdqgeTX9CmkQSQ7 sUqHR5b8zSXv6+4NNC0+rrCQKpUMWkAFIdREDOSimJBPA6jkyvqoluYcjpTyxZg4vN ABYUTwdCFdagDexebpylR3Q+gW/tKOKJr/zzj944e0U89Afwfc/920fpTRurb4BNwt H+vuio/x63LdtEnU95UgQr9m9YsDQ1s+cwk65rWNKZRqM9Nu3jrQI1/J0r9Nu682uv SWfxgh445SAVA== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id BF672C982CF; Wed, 16 Sep 2026 15:33:02 +0000 (UTC) From: Jim Cromie via B4 Relay Date: Wed, 16 Sep 2026 09:33:22 -0600 Subject: [PATCH v10 30/38] selftests: enable comma-terminator tests Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260916-dd-cmap-part2-clean-v10-30-af4cf4767707@gmail.com> References: <20260916-dd-cmap-part2-clean-v10-0-af4cf4767707@gmail.com> In-Reply-To: <20260916-dd-cmap-part2-clean-v10-0-af4cf4767707@gmail.com> To: Jason Baron , Shuah Khan , Andrew Morton , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Arnd Bergmann , Luis Chamberlain , Petr Pavlu , Daniel Gomez , Sami Tolvanen , Aaron Tomlin , Jonathan Corbet , Greg Kroah-Hartman , Nathan Chancellor , Nicolas Schier , Shuah Khan , Randy Dunlap , "Rafael J. Wysocki" , Pavel Machek , Len Brown Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-arch@vger.kernel.org, linux-modules@vger.kernel.org, linux-doc@vger.kernel.org, linux-kbuild@vger.kernel.org, linux-pm@vger.kernel.org, Jim Cromie X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789572777; l=2396; i=jim.cromie@gmail.com; s=20260203; h=from:subject:message-id; bh=ZtnNYHB84SuIr5SgDiLk/1HZgha9qoZYGJ306frMt90=; b=Y+7qsD4xlGsL3watov/5txzm2zCl99Q0mJu8KCdFHuF2l+0Tgn8iYUF29ShrccOjq4Eu9dy+6 ONI2Nzw7zn9CfAfDMLmuaDk/vDSAGZlzdZ9CCLDaqP4ZtX9M7qX6dRs X-Developer-Key: i=jim.cromie@gmail.com; a=ed25519; pk=C6E5ODlPQo7ZBynATXH9wg7K6HxP0pIXyf4s38Qw0XE= X-Endpoint-Received: by B4 Relay for jim.cromie@gmail.com/20260203 with auth_id=958 X-Original-From: Jim Cromie Reply-To: jim.cromie@gmail.com From: Jim Cromie Enable the FT_comma_terminators test block in dyndbg_selftest.sh to verify control query parsing when queries are terminated by commas. Signed-off-by: Jim Cromie --- .../selftests/dynamic_debug/dyndbg_selftest.sh | 25 ++++++++++++++++++= ++++ 1 file changed, 25 insertions(+) diff --git a/tools/testing/selftests/dynamic_debug/dyndbg_selftest.sh b/too= ls/testing/selftests/dynamic_debug/dyndbg_selftest.sh index d485b9245164..bd72a718406c 100755 --- a/tools/testing/selftests/dynamic_debug/dyndbg_selftest.sh +++ b/tools/testing/selftests/dynamic_debug/dyndbg_selftest.sh @@ -347,6 +347,25 @@ function FT_basic_queries { ddcmd "file $f =3D_" "$f" } =20 +# test parsing on spaces, commas. testing against builtin file kernel/para= ms.c +function FT_comma_terminators { + v_echo "${GREEN}# COMMA_TERMINATOR_TESTS ${NC}" + if [ $LACK_DD_BUILTIN -eq 1 ]; then + echo "SKIP - test requires dynamic_debug built into kernel" + return + fi + local f=3D'kernel/params.c' + ddcmd =3D_ + ddcmd "file $f +p" "$f" + + ddcmd "file,$f,=3D_" "$f" + ddcmd "file,$f,+mf" "$f" + # ignore empty tokens + ddcmd ",file ,, , $f, -p" "$f" + ddcmd " , file ,,, , $f, -m" "$f" + + ddcmd =3D_ +} # testing classmap-based query enablers and class configurations function FT_test_classes { v_echo "${GREEN}# TEST_CLASSES - classmap-based query enablers and cla= ss configs ${NC}" @@ -454,6 +473,7 @@ builtin_tests=3D( FT_grammar_ok FT_grammar_errs FT_basic_queries + FT_comma_terminators ) =20 # Modular Feature Tests (Require CONFIG_MODULES=3Dy and test_dynamic_debug= *.ko available) @@ -544,6 +564,11 @@ function GOLDEN_RECORDS { #K=3D 02e4fd94602e108cb89bfc70d47a5dad FT_basic_queries.5 #K=3D f03a7ca7316e8db4c0e16523dc41e75d FT_basic_queries.6 #K=3D c518a50ba30ba8099d0dc874a27ecf16 FT_basic_queries.7 +#K=3D c8bbbac639f244ed9088208ebb7d83a6 FT_comma_terminators.1 +#K=3D bed6350f058f600910837dae83a12f56 FT_comma_terminators.2 +#K=3D 6e8599556a312200fb6d484565b6c52f FT_comma_terminators.3 +#K=3D 68b329da9893e34099c7d8ad5cb9c940 FT_comma_terminators.4 +#K=3D adc1ef04304c861c87fe294a8ba4e402 FT_comma_terminators.5 #K=3D 8f18ea82c09460434b6e9e4cd12543e8 FT_test_classes.1 #K=3D a15ec4843acd721fbdfddc0b512c8032 FT_test_classes.2 #K=3D 20d4545f9753e677e72e3adf52527fd3 FT_test_classes.3 --=20 2.55.0 From nobody Fri Sep 25 04:43:45 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9BE7E5427E8; Wed, 16 Sep 2026 15:33:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789572785; cv=none; b=sdaNHF4Cd8slFwkW32aYE8RED98OuxR0HiybgFhN0Z9i0mcF9/afbIbGmKIR6rFheksVakTr7AjISlGNEHj+MqkuRIkLOGhJZY0DcfHKgN6QWy412DYoow1zoBceQbV76Q1zsEaS5hz06ep5tp8T7ZQR4hLqLulqr1fSpmekWZg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789572785; c=relaxed/simple; bh=o+LEUrChLQumXTQ8gVDWro0LRX/RycvDIOK1D/yCvU8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=QrJxsp3EMakZehsb77VBjPr3KPLehYxDwBH0eH6lyybuJunqoTad2e8mwY/Lg41N7qGicZpv2LnldqxVeIB2DPx0Vt5A6qtrUh6f9x1um6srE+Yx6D79f1Ab0s2wEN2lKdzfiOYd2u2Asmx80glrMyCpA2xY6SPS+NLM+/7C3wo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=mef6Zo3H; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="mef6Zo3H" Received: by smtp.kernel.org (Postfix) with ESMTPS id ECC12C2BCFF; Wed, 16 Sep 2026 15:33:02 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1789572783; bh=o+LEUrChLQumXTQ8gVDWro0LRX/RycvDIOK1D/yCvU8=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=mef6Zo3Hlb142JUkAotqQXrKYCXOdxCtbTtvPeVSkb5HVU0tcC5ibrJdKu5WWehVZ yKyjlvD2wrVTc5Kiu0fwXme0G2ihCzgnEEwhH9X6/h+XE9bi8E4GoknvVR42ZoF+QD ask8nUvZ+ChnafW/ixCsR6fxxKWtHzOKw6T9kny7u/Ib+d+463gse4yzb+fEAtQWUg jWfk3ewm5aa096igsy53VZivwOuWDJ8CGA4p0TXkH6eJoDcOY5HhF+q4tiw9gAweH2 6aEh2pvXZLqZEWlPJAU6AVVm3g37RMwFsPIw8n0TJW42rbxrF97LqRDMUtMLFZYAtx p+aDUlakHxC3w== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id D8455C982C3; Wed, 16 Sep 2026 15:33:02 +0000 (UTC) From: Jim Cromie via B4 Relay Date: Wed, 16 Sep 2026 09:33:23 -0600 Subject: [PATCH v10 31/38] dyndbg: split multi-query strings with @ Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260916-dd-cmap-part2-clean-v10-31-af4cf4767707@gmail.com> References: <20260916-dd-cmap-part2-clean-v10-0-af4cf4767707@gmail.com> In-Reply-To: <20260916-dd-cmap-part2-clean-v10-0-af4cf4767707@gmail.com> To: Jason Baron , Shuah Khan , Andrew Morton , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Arnd Bergmann , Luis Chamberlain , Petr Pavlu , Daniel Gomez , Sami Tolvanen , Aaron Tomlin , Jonathan Corbet , Greg Kroah-Hartman , Nathan Chancellor , Nicolas Schier , Shuah Khan , Randy Dunlap , "Rafael J. Wysocki" , Pavel Machek , Len Brown Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-arch@vger.kernel.org, linux-modules@vger.kernel.org, linux-doc@vger.kernel.org, linux-kbuild@vger.kernel.org, linux-pm@vger.kernel.org, Jim Cromie X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789572777; l=9157; i=jim.cromie@gmail.com; s=20260203; h=from:subject:message-id; bh=vqt+R6qwfeUJ05tDSEl0oRSLpZTTeZrmflDKRmmc8bE=; b=kESQeGZJy5KrAduY0wOdkBWwUqjh0nGxIoifFGgnK0iNnbi6yYCpxYY7DsF1Lu3EJu4WspirE wVda4UUIOzvCEY4Fsl66uvbhA6MmsTH+ZvTtBuydQ5t5IkcNgRkiczx X-Developer-Key: i=jim.cromie@gmail.com; a=ed25519; pk=C6E5ODlPQo7ZBynATXH9wg7K6HxP0pIXyf4s38Qw0XE= X-Endpoint-Received: by B4 Relay for jim.cromie@gmail.com/20260203 with auth_id=958 X-Original-From: Jim Cromie Reply-To: jim.cromie@gmail.com From: Jim Cromie Since commit 85f7f6c0edb8 ("dynamic_debug: process multiple debug-queries on a li= ne") Multi-query commands have been allowed: modprobe drm dyndbg=3D"class DRM_UT_CORE +p; class DRM_UT_KMS +p" modprobe drm dyndbg=3D< --- v10: . replace strpbrk() with quote-aware ddebug_find_delimiter() to ignore '@' = inside quotes. v9: . update FT_multi_query command in dyndbg_selftest.sh to actively test @ de= limiter. v5: avoid +t flag in content tests - pid is not predictable. remove Reviewed-by: - too many changes v2: replace '%' with '@' as multi-query splitter, as it is: - not a sshell special cahr - allows matching on format strings with format specifiers --- Documentation/admin-guide/dynamic-debug-howto.rst | 8 +++-- lib/dynamic_debug.c | 26 ++++++++++++++++- .../selftests/dynamic_debug/dyndbg_selftest.sh | 34 +++++++++++++++---= ---- 3 files changed, 53 insertions(+), 15 deletions(-) diff --git a/Documentation/admin-guide/dynamic-debug-howto.rst b/Documentat= ion/admin-guide/dynamic-debug-howto.rst index b9fbb2a12955..a8962ab22aaf 100644 --- a/Documentation/admin-guide/dynamic-debug-howto.rst +++ b/Documentation/admin-guide/dynamic-debug-howto.rst @@ -85,10 +85,12 @@ by spaces, tabs, or commas. So these are all equivalen= t:: :#> ddcmd ' file svcsock.c line 1603 +p ' :#> ddcmd file,svcsock.c,line,1603,+p =20 -Command submissions are bounded by a write() system call. -Multiple commands can be written together, separated by ``;`` or ``\n``:: +Command submissions are bounded by a write() system call. Multiple +commands can be written together, separated by ``@``, ``;`` or ``\n``:: =20 - :#> ddcmd "func pnpacpi_get_resources +p; func pnp_assign_mem +p" + :#> ddcmd func foo +p @ func bar +p + :#> ddcmd func foo +p \; func bar +p + :#> ddcmd "func foo +p ; func bar +p" :#> ddcmd <<"EOC" func pnpacpi_get_resources +p func pnp_assign_mem +p diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c index 0720fc4f7a90..c023d07623f2 100644 --- a/lib/dynamic_debug.c +++ b/lib/dynamic_debug.c @@ -621,6 +621,30 @@ static int ddebug_exec_query(char *query_string, const= char *modname) return nfound; } =20 +/* + * Split multi-query string on delimiters (@, ;, \n), ignoring delimiters + * that appear inside single or double quoted strings. + */ +static char *ddebug_find_delimiter(char *str, const char *delims) +{ + bool in_quote =3D false; + char quote_char =3D 0; + + for (; *str; str++) { + if (*str =3D=3D '"' || *str =3D=3D '\'') { + if (!in_quote) { + in_quote =3D true; + quote_char =3D *str; + } else if (*str =3D=3D quote_char) { + in_quote =3D false; + } + } else if (!in_quote && strchr(delims, *str)) { + return str; + } + } + return NULL; +} + /* handle multiple queries in query string, continue on error, return last error or number of matching callsites. Module name is either in the modname arg (for boot args) or perhaps in query string. @@ -631,7 +655,7 @@ static int ddebug_exec_queries(char *query, const char = *modname) int i, errs =3D 0, exitcode =3D 0, rc, nfound =3D 0; =20 for (i =3D 0; query; query =3D split) { - split =3D strpbrk(query, ";\n"); + split =3D ddebug_find_delimiter(query, "@;\n"); if (split) *split++ =3D '\0'; =20 diff --git a/tools/testing/selftests/dynamic_debug/dyndbg_selftest.sh b/too= ls/testing/selftests/dynamic_debug/dyndbg_selftest.sh index bd72a718406c..a91a0ffa92d4 100755 --- a/tools/testing/selftests/dynamic_debug/dyndbg_selftest.sh +++ b/tools/testing/selftests/dynamic_debug/dyndbg_selftest.sh @@ -138,7 +138,6 @@ function ddcmd_load () { local val=3D"$4" =20 # 1. Setup the control filters (using positional ddcmd range-check) - echo "$query" "$range" ddcmd "$query" "$range" =20 # 2. Execute the workload and capture syslog prints @@ -332,9 +331,20 @@ function FT_basic_queries { ddcmd "file $f +l" "$f" ddcmd "file $f -m" "$f" ddcmd "file $f =3D_" "$f" +} + +function FT_multi_query { + v_echo "${GREEN}# MULTI_QUERY_TESTS ${NC}" + if [ $LACK_DD_BUILTIN -eq 1 ]; then + echo "SKIP - test requires dynamic_debug built into kernel" + return + fi + local f=3D'kernel/params.c' + ddcmd =3D_ # zero everything =20 - # multi-query commands split on ; on a single line + # multi-query commands on a single line, split on ;/@ respectively ddcmd "file $f +mf ; file $f func parse_args +sl" "$f" + ddcmd "file $f -f @ file $f func parse_args -l" "$f" =20 # verify multi-cmd input, newline separated, with embedded comments ddcmd =3D_ # reset before multiline query to capture full transition @@ -380,7 +390,7 @@ function FT_test_classes { verify_control_slice '\[test_dynamic_debug\]' =20 # 2. Verify state transition and live-printing end-to-end via ddcmd_lo= ad! - ddcmd_load "class D2_CORE +pmf;class D2_KMS +pls;class D2_ATOMIC +pml"= \ + ddcmd_load "class,D2_CORE,+pmf;class,D2_KMS,+pls;class,D2_ATOMIC,+pml"= \ '\[test_dynamic_debug\]' \ "/sys/module/test_dynamic_debug/parameters/do_classes" "1" =20 @@ -474,6 +484,7 @@ builtin_tests=3D( FT_grammar_errs FT_basic_queries FT_comma_terminators + FT_multi_query ) =20 # Modular Feature Tests (Require CONFIG_MODULES=3Dy and test_dynamic_debug= *.ko available) @@ -496,8 +507,8 @@ modular_tests=3D( # # =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D function GOLDEN_RECORDS { - cat << 'EOF' | { -#K=3D 26fd1565f209b383d9f2fbf0b54cd5fc FT_grammar_errs.1 + cat << 'EO_DYNDBG_GOLDEN_REFS' | { +#K=3D 95b249c7ec2cbd5a436f96060b2bee37 FT_grammar_errs.1 #K=3D 200c01632c52a63f6d186da1c6460740 FT_grammar_errs.2 #K=3D 7d7141900ce6e32f15c99202309c63a4 FT_grammar_errs.3 #K=3D 1bb798a5831d0119789d424ef6cb55c4 FT_grammar_errs.4 @@ -517,7 +528,7 @@ function GOLDEN_RECORDS { #K=3D cb8288d607b0c5282125852f3ab05107 FT_grammar_errs.18 #K=3D b371c6ba52503d037dbc43da788af8be FT_grammar_errs.19 #K=3D 98e2bd3e4f3da58536496a38ec3e6238 FT_grammar_errs.20 -#K=3D 02b210b2646aceb68f3d6d2876a3d57a FT_grammar_errs.21 +#K=3D c4e8b7261811e9fdf0c80fa9e374a29e FT_grammar_errs.21 #K=3D 51030cd01ed601a68dd48356902954b1 FT_grammar_errs.22 #K=3D af8818de076407d4e7f4e384ba110ac5 FT_grammar_errs.23 #K=3D 023ba04ffced833b4776fb4fcaae7755 FT_grammar_errs.24 @@ -537,7 +548,7 @@ function GOLDEN_RECORDS { #K=3D 130bf64b92a5e34d1c4cce98899084e1 FT_grammar_errs.38 #K=3D 9681a05658f1a50e3434aa991b5ce992 FT_grammar_errs.39 #K=3D 38506317363a188fbb7a417ff50457a9 FT_grammar_errs.40 -#K=3D 02b210b2646aceb68f3d6d2876a3d57a FT_grammar_errs.41 +#K=3D c4e8b7261811e9fdf0c80fa9e374a29e FT_grammar_errs.41 #K=3D 8c08a8b5cacbf885d022360ed856e7a1 FT_grammar_errs.42 #K=3D f0f4d894a49bd2c1856cf4f013f83e54 FT_grammar_errs.43 #K=3D 25b92d52cb299fa8d84c5584e490bd97 FT_grammar_errs.44 @@ -561,14 +572,15 @@ function GOLDEN_RECORDS { #K=3D db17180b59444e5e34a8fc20c40e4530 FT_basic_queries.2 #K=3D f7bd56bd407ff255ef2e3b5fb093ae6a FT_basic_queries.3 #K=3D 4ce44468b3b5f80ae42ade1f261b952f FT_basic_queries.4 -#K=3D 02e4fd94602e108cb89bfc70d47a5dad FT_basic_queries.5 -#K=3D f03a7ca7316e8db4c0e16523dc41e75d FT_basic_queries.6 -#K=3D c518a50ba30ba8099d0dc874a27ecf16 FT_basic_queries.7 #K=3D c8bbbac639f244ed9088208ebb7d83a6 FT_comma_terminators.1 #K=3D bed6350f058f600910837dae83a12f56 FT_comma_terminators.2 #K=3D 6e8599556a312200fb6d484565b6c52f FT_comma_terminators.3 #K=3D 68b329da9893e34099c7d8ad5cb9c940 FT_comma_terminators.4 #K=3D adc1ef04304c861c87fe294a8ba4e402 FT_comma_terminators.5 +#K=3D 02e4fd94602e108cb89bfc70d47a5dad FT_multi_query.1 +#K=3D c0fc482bbf18b9d5ffd6743b18bc34f7 FT_multi_query.2 +#K=3D f03a7ca7316e8db4c0e16523dc41e75d FT_multi_query.3 +#K=3D c518a50ba30ba8099d0dc874a27ecf16 FT_multi_query.4 #K=3D 8f18ea82c09460434b6e9e4cd12543e8 FT_test_classes.1 #K=3D a15ec4843acd721fbdfddc0b512c8032 FT_test_classes.2 #K=3D 20d4545f9753e677e72e3adf52527fd3 FT_test_classes.3 @@ -613,7 +625,7 @@ function GOLDEN_RECORDS { #K=3D 6a320774e2b535ceb89d6cdde6f5d0fb FT_modprobe_w_param.34 #K=3D 7f961a7d3facd89bdd4b9d8e7b5541e9 FT_modprobe_w_param.35 #K=3D 6a320774e2b535ceb89d6cdde6f5d0fb FT_modprobe_w_param.36 -EOF +EO_DYNDBG_GOLDEN_REFS # Read the K-recs and skip those for tests that can't run while read -r line; do # Filter built-in if needed --=20 2.55.0 From nobody Fri Sep 25 04:43:45 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9DDE95427EE; Wed, 16 Sep 2026 15:33:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789572785; cv=none; b=SXQy0lJQT8F3nNojWS6afb+Vm3ig6XPjmW9qikqnAF9Aa2rF1+KDEy+OZ7qeUYjvQrisWK/vWZX52isf4OVWRC4+fT0Y5u4kuKVD0yT6AKOhvmv6JFe+4cmsGQ2KGeFJbrpHNymIfpx3INHnSI/UkOPPimrJn2yDoCGWn0qldcU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789572785; c=relaxed/simple; bh=4e9i+R5gBm+GP3/NFZ4uii9vubBMRLzot5hojWdLW9k=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ZG4U8WZrxgO2zGZxVdUwgHLL3Qssoj+mW5uwja3acpOaiFKVi9XvdyfpfyhxWCVRCZnz9/+jdQoyv9cllWL41VjDypj9zuJ6iZ4AcD+BjPORnJXZ1uLPxyFgvVDW337hsUbR3KRjwo9OScHl1oQ6bqbyCk5dvGgvx/U/nMmdHEw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=jGHPS55F; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="jGHPS55F" Received: by smtp.kernel.org (Postfix) with ESMTPS id 0EC5BC4AF49; Wed, 16 Sep 2026 15:33:03 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1789572783; bh=4e9i+R5gBm+GP3/NFZ4uii9vubBMRLzot5hojWdLW9k=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=jGHPS55Fikb36Sm6J8zdPpRD64JUiZLgtVpYMjKCGRtfdQUZCmiD1c3RZQNq/Ma9z 3Ct7QLCJLAK5aRAx2n2B23wr99Tm/WcbtYYpyAS2Lai6x5jHrkSTkha05ADaaGqwrY om7AK7Q+b2g9CeCUYbGDA6riLJ8Khj1+5CNZNmgyST8wanE9sVJTxsDYPpTWKdzBDF 7D3FKZ27E8yhQvHyEgIBhE7t26xURat6bKZltl+rCsI2R0f9aMUnskc0SzEnIYGj3+ Av5QY73zfLTO7tmsJzAsqxhwL9f7Pk6E2Ct6v6XjVKReC64LEwgkGiGd0xRxxSRDc2 9wM52JMYIBrDw== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id EE1FEC982D0; Wed, 16 Sep 2026 15:33:02 +0000 (UTC) From: Jim Cromie via B4 Relay Date: Wed, 16 Sep 2026 09:33:24 -0600 Subject: [PATCH v10 32/38] dyndbg: resolve "protection" of class'd pr_debug Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260916-dd-cmap-part2-clean-v10-32-af4cf4767707@gmail.com> References: <20260916-dd-cmap-part2-clean-v10-0-af4cf4767707@gmail.com> In-Reply-To: <20260916-dd-cmap-part2-clean-v10-0-af4cf4767707@gmail.com> To: Jason Baron , Shuah Khan , Andrew Morton , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Arnd Bergmann , Luis Chamberlain , Petr Pavlu , Daniel Gomez , Sami Tolvanen , Aaron Tomlin , Jonathan Corbet , Greg Kroah-Hartman , Nathan Chancellor , Nicolas Schier , Shuah Khan , Randy Dunlap , "Rafael J. Wysocki" , Pavel Machek , Len Brown Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-arch@vger.kernel.org, linux-modules@vger.kernel.org, linux-doc@vger.kernel.org, linux-kbuild@vger.kernel.org, linux-pm@vger.kernel.org, Jim Cromie , Louis Chauvet X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789572777; l=13221; i=jim.cromie@gmail.com; s=20260203; h=from:subject:message-id; bh=0HGVgPqwHxfFGP+6ogh1HX+yap95c8gF9ImOIndTkfg=; b=cYawN6OXrPjeysaSgFDJfrAetDPEVpxjU8WXkmHxAcLpGMW0HlkNUrGUbjGgFuPBRzbbikQKd WbVRJIL9oI2A2DTnlmTqWBQtzQ7b+ISr6bQ+xWPejdyjRq4wNGnc71s X-Developer-Key: i=jim.cromie@gmail.com; a=ed25519; pk=C6E5ODlPQo7ZBynATXH9wg7K6HxP0pIXyf4s38Qw0XE= X-Endpoint-Received: by B4 Relay for jim.cromie@gmail.com/20260203 with auth_id=958 X-Original-From: Jim Cromie Reply-To: jim.cromie@gmail.com From: Jim Cromie classmap-v1 code protected class'd pr_debugs from unintended changes by unclassed/_DFLT queries: # - to declutter examples: alias ddcmd=3D'echo $* > /proc/dynamic_debug/control' # IOW, this should NOT alter drm.debug settings ddcmd -p # Instead, you must name the class to change it. # Protective but tedious ddcmd class DRM_UT_CORE +p # Or do it the (old school) subsystem way # This is ABI !! echo 1 > /sys/module/drm/parameters/debug Since the debug sysfs-node is ABI, if dyndbg is going to implement it, it must also honor its settings; it must at least protect against accidental changes to its classes from legacy queries. The protection allows all previously conceived queries to work the way they always have; ie select the same set of pr_debugs, despite the inclusion of whole new classes of pr_debugs. But that choice has 2 downsides: 1. "name the class to change it" makes a tedious long-winded interface, needing many commands to set DRM_UT_* one at a time. 2. It makes the class keyword special in some sense; the other keywords skip only on query mismatch, otherwise the code falls thru to adjust the pr-debug site. Jason Baron didn't like v1 on point 2. Louis Chauvet didn't like recent rev on point 1 tedium. But that said: /sys/ is ABI, so this must be reliable: #> echo 0x1f > /sys/module/drm/parameters/debug It 'just works' without dyndbg underneath; we must deliver that same stability. Convenience is secondary. The new resolution: If ABI is the blocking issue, then no ABI means no blocking issue. IOW, if the classmap has no presence under /sys/*, ie no PARAM, there is no ABI to guard, and no reason to enforce a tedious interface. In the future, if DRM wants to alter this protection, that is practical, but I think default-on is the correct mode. So atm classes without a PARAM are unprotected at >control, allowing admins their shortcuts. I think this could satisfy all viewpoints. That said, theres also a possibility of wildcard classes: #> ddcmd class '*' +p Currently, the query-class is exact-matched against each module's classmaps.names. This gives precise behavior, a good basis. But class wildcards are possible, they just did'nt appear useful for DRM, whose classmap names are a flat DRM_UT_* namespace. IOW, theres no useful selectivity there: #> ddcmd class "DRM_*" +p # these enable every DRM_* class #> ddcmd class "DRM_UT_*" +p #> ddcmd class "DRM_UT_V*" +p # finally select just 1: DRM_UT_VBL #> ddcmd class "DRM_UT_D*" +p # but this gets 3 #> ddcmd class "D*V*" +p # here be dragons But there is debatable utility in the feature. #> ddcmd class __DEFAULT__ -p # what about this ? #> ddcmd -p # thats what this does. automatically Anyway, this patch does: 1. adds link field from _ddebug_class_map to the .controlling_param 2. sets it in ddebug_match_apply_kparam(), during modprobe/init, when options like drm.debug=3DVAL are handled. 3. ddebug_class_has_param() now checks .controlling_param 4. ddebug_class_wants_protection() macro renames 3. this frames it as a separable policy decision 5. ddebug_match_desc() gets the most attention: a. move classmap consideration to the bottom this insures all other constraints act 1st. allows simpler 'final' decisions. b. split class choices cleanly on query: class FOO vs none, and class'd vs _DPRINTK_CLASS_DFLT site. c. calls 4 when applying a class-less query to a class'd pr_debug here we need a new fn to find the classmap with this .class_id d. calls new ddebug_find_classmap_by_class_id(). when class-less query looks at a class'd pr_debug. finds classmap, which can then decide, currently by PARAM existence. NOTES: protection is only against class-less queries, explicit "class FOO" adjustments are allowed (that is the mechanism). The drm.debug sysfs-node heavily under-specifies the class'd pr_debugs it controls; none of the +mfls prefixing flags have any effect, and each callsite remains individually controllable. drm.debug just toggles the +p flag for all the modules' class'd pr_debugs. Signed-off-by: Jim Cromie Reviewed-by: Louis Chauvet --- v10: . drop dead #if 0 ddebug_apply_class_maps() block. v9: . assign map->controlling_param =3D dcp in ddebug_match_apply_kparam() to enforce protection on parameterized classmaps. v2: RvB after SoB old-v12 minor fixup after squashing subsequent commits to previous ones --- include/linux/dynamic_debug.h | 14 ++++-- lib/dynamic_debug.c | 111 ++++++++++++++++++++++++++++++++++----= ---- 2 files changed, 100 insertions(+), 25 deletions(-) diff --git a/include/linux/dynamic_debug.h b/include/linux/dynamic_debug.h index 3114f4f28be4..2542d7c41b3e 100644 --- a/include/linux/dynamic_debug.h +++ b/include/linux/dynamic_debug.h @@ -89,6 +89,7 @@ enum ddebug_class_map_type { * map @class_names 0..N to consecutive constants starting at @base. */ struct ddebug_class_map { + struct ddebug_class_param *controlling_param; const struct module *mod; /* NULL for builtins */ const char *mod_name; /* needed for builtins */ const char **class_names; @@ -296,7 +297,12 @@ struct ddebug_class_param { * * Creates a sysfs-param to control the classes defined by the * exported classmap, with bits 0..N-1 mapped to the classes named. - * This version keeps class-state in a private long int. + * + * Since sysfs-params are ABI, this also protects the classmap'd + * pr_debugs from un-class'd `echo -p > /proc/dynamic_debug/control` + * changes. + * + * This keeps class-state in a private long int. */ #define DYNAMIC_DEBUG_CLASSMAP_PARAM(_name, _var, _flags) \ static u32 _name##_bvec =3D _DPRINTK_CLASSBITS_INIT; \ @@ -309,10 +315,8 @@ struct ddebug_class_param { * @_var: name of the (exported) classmap var defining the classes/bits * @_flags: flags to be toggled, typically just 'p' * - * Creates a sysfs-param to control the classes defined by the - * exported clasmap, with bits 0..N-1 mapped to the classes named. - * This version keeps class-state in user @_bits. This lets drm check - * __drm_debug elsewhere too. + * Like DYNAMIC_DEBUG_CLASSMAP_PARAM, but maintains param-state in + * extern @_bits. This lets DRM check __drm_debug elsewhere too. */ #define DYNAMIC_DEBUG_CLASSMAP_PARAM_REF(_name, _bits, _var, _flags) \ __DYNAMIC_DEBUG_CLASSMAP_PARAM(_name, _bits, _var, _flags) diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c index c023d07623f2..ac54a0499369 100644 --- a/lib/dynamic_debug.c +++ b/lib/dynamic_debug.c @@ -71,6 +71,10 @@ struct flag_settings { unsigned int mask; }; =20 +static bool ddebug_class_map_in_range(const int class_id, + const struct ddebug_class_map *map); +static bool ddebug_class_user_in_range(const int class_id, + const struct ddebug_class_user *user); static DEFINE_MUTEX(ddebug_lock); static LIST_HEAD(ddebug_tables); static int verbose; @@ -200,6 +204,46 @@ static struct ddebug_class_map *ddebug_find_valid_clas= s(struct _ddebug_info cons return NULL; } =20 + + +static struct ddebug_class_map * +ddebug_find_map_by_class_id(struct _ddebug_info *di, int class_id) +{ + struct ddebug_class_map *map; + struct ddebug_class_user *cli; + int i; + + for_subvec(i, map, di, maps) + if (ddebug_class_map_in_range(class_id, map)) + return map; + + for_subvec(i, cli, di, users) + if (ddebug_class_user_in_range(class_id, cli)) + return cli->map; + + return NULL; +} + +/* + * classmaps-V1 protected classes from changes by legacy commands + * (those selecting _DPRINTK_CLASS_DFLT by omission). This had the + * downside that saying "class FOO" for every change can get tedious. + * + * V2 is smarter, it protects class-maps if the defining module also + * calls DYNAMIC_DEBUG_CLASSMAP_PARAM to create a sysfs parameter. + * Since the author wants the knob, we should assume they intend to + * use it (in preference to "class FOO +p" >control), and want to + * trust its settings. This gives protection when its useful, and not + * when its just tedious. + */ +static inline bool ddebug_class_has_param(const struct ddebug_class_map *m= ap) +{ + return !!(map->controlling_param); +} + +/* re-framed as a policy choice */ +#define ddebug_class_wants_protection(map) (ddebug_class_has_param(map)) + /* * Search the tables for _ddebug's which match the given `query' and * apply the `flags' and `mask' to them. Returns number of matching @@ -208,11 +252,10 @@ static struct ddebug_class_map *ddebug_find_valid_cla= ss(struct _ddebug_info cons */ static bool ddebug_match_desc(const struct ddebug_query *query, struct _ddebug *dp, - int valid_class) + struct _ddebug_info *di, + int selected_class) { - /* match site against query-class */ - if (dp->class_id !=3D valid_class) - return false; + struct ddebug_class_map *site_map; =20 if (!dp->format) { pr_err_ratelimited("ddebug: NULL format string at %s:%s:%u\n", @@ -257,7 +300,28 @@ static bool ddebug_match_desc(const struct ddebug_quer= y *query, dp->lineno > query->last_lineno) return false; =20 - return true; + /* + * above are all satisfied, so we can make final decisions: + * 1- class FOO or implied class __DEFAULT__ + * 2- site.is_classed or not + */ + if (query->class_string) { + /* class FOO given, exact match required */ + return (dp->class_id =3D=3D selected_class); + } + /* query class __DEFAULT__ by omission. */ + if (dp->class_id =3D=3D _DPRINTK_CLASS_DFLT) { + /* un-classed site */ + return true; + } + /* site is class'd */ + site_map =3D ddebug_find_map_by_class_id(di, dp->class_id); + if (!site_map) { + WARN_ONCE(1, "unknown class_id %d, check %s's CLASSMAP definitions", dp-= >class_id, di->mod_name); + return false; + } + /* module(-param) decides protection */ + return !ddebug_class_wants_protection(site_map); } =20 static int ddebug_change(const struct ddebug_query *query, struct flag_set= tings *modifiers) @@ -267,33 +331,31 @@ static int ddebug_change(const struct ddebug_query *q= uery, struct flag_settings unsigned int newflags; unsigned int nfound =3D 0; struct flagsbuf fbuf, nbuf; - struct ddebug_class_map *map =3D NULL; - int valid_class; + int selected_class; =20 /* search for matching ddebugs */ mutex_lock(&ddebug_lock); list_for_each_entry(dt, &ddebug_tables, link) { struct _ddebug_info *di =3D &dt->info; + struct ddebug_class_map *mods_map; =20 /* match against the module name */ if (query->module && !match_wildcard(query->module, di->mod_name)) continue; =20 + selected_class =3D _DPRINTK_CLASS_DFLT; if (query->class_string) { - map =3D ddebug_find_valid_class(&dt->info, query->class_string, - &valid_class); - if (!map) + mods_map =3D ddebug_find_valid_class(di, query->class_string, + &selected_class); + if (!mods_map) continue; - } else { - /* constrain query, do not touch class'd callsites */ - valid_class =3D _DPRINTK_CLASS_DFLT; } =20 for (i =3D 0; i < di->descs.len; i++) { struct _ddebug *dp =3D &di->descs.start[i]; =20 - if (!ddebug_match_desc(query, dp, valid_class)) + if (!ddebug_match_desc(query, dp, di, selected_class)) continue; =20 nfound++; @@ -1170,7 +1232,6 @@ static bool ddebug_class_user_in_range(const int clas= s_id, const struct ddebug_c return false; return ddebug_class_map_in_range(class_id - user->offset, user->map); } - static const char *ddebug_class_name(struct _ddebug_info *di, struct _ddeb= ug *dp) { struct ddebug_class_map *map; @@ -1324,25 +1385,35 @@ static void ddebug_sync_classbits(const struct kern= el_param *kp, const char *mod } } =20 -static void ddebug_match_apply_kparam(const struct kernel_param *kp, - const struct ddebug_class_map *map, - const char *mod_name) +static struct ddebug_class_param * +ddebug_get_classmap_kparam(const struct kernel_param *kp, + const struct ddebug_class_map *map) { struct ddebug_class_param *dcp; =20 if (kp->ops !=3D ¶m_ops_dyndbg_classes) - return; + return NULL; =20 dcp =3D (struct ddebug_class_param *)kp->arg; + return (map =3D=3D dcp->map) + ? dcp : (struct ddebug_class_param *)NULL; +} + +static void ddebug_match_apply_kparam(const struct kernel_param *kp, + struct ddebug_class_map *map, + const char *mod_name) +{ + struct ddebug_class_param *dcp =3D ddebug_get_classmap_kparam(kp, map); =20 if (dcp && dcp->map =3D=3D map) { + map->controlling_param =3D dcp; v2pr_info(" kp:%s.%s =3D0x%x", mod_name, kp->name, *dcp->bits); vpr_cm_info(map, " %s maps ", mod_name); ddebug_sync_classbits(kp, mod_name); } } =20 -static void ddebug_apply_params(const struct ddebug_class_map *cm, const c= har *mod_name) +static void ddebug_apply_params(struct ddebug_class_map *cm, const char *m= od_name) { const struct kernel_param *kp; =20 --=20 2.55.0 From nobody Fri Sep 25 04:43:45 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9F4195427F5; Wed, 16 Sep 2026 15:33:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789572785; cv=none; b=dBieX16L2kqOU5sNIym7Uhgd7DDx7USdnhiWTyLFLqiUGdczz7KJAmJ2ICGOPgIhsUjItuevIGGPzrVgUf4M65wth/a5PMV5jkspyZq3HzFpS4IgMeg3EaE9k7DfW/F5+eM8KgApMTZmjVG++MMnOpwhaopiuty50QaMmI0u/4M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789572785; c=relaxed/simple; bh=cK/Sahy3bNvWbjqvdDSyRK3pOigTpWzlzP6m3eBJhZI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=O8DmtBXE/2GKpxFjaALyOLJzq88nrDIgvvX+dSV0h1mtPIkKt83AeuDctN5n9uso9t1mjFEFPdX5tKV5q3aHBLSamtn9AStpSfFUQSvO9VcLhfsSncvtFVZdlmm9s8a5/w6REQ6tytrD5fOgy/b/dSzayWGAA3YhhXbLYGXAIzo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=AQ1Tyr5V; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="AQ1Tyr5V" Received: by smtp.kernel.org (Postfix) with ESMTPS id 24FB5C4AF16; Wed, 16 Sep 2026 15:33:03 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1789572783; bh=cK/Sahy3bNvWbjqvdDSyRK3pOigTpWzlzP6m3eBJhZI=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=AQ1Tyr5VUgTVPndE2BG+sT4XMJnnyfQkX77pwn2kKRZKPFe3tMO8j3THoIlhxJhTr +qVZqdvabFnaWRvtZPp8/d+5RPq0A70IDxGHtQ/LeWbiGMvhP0jhyKeHt3gMJtfS3L K76EAfwR63sZL9fWsQu9SAYMG2yViHFyZuIVMG2TADgXpyhhzPZfLmA0lS/tm+ST68 GJ6jTp9WuTQKuBg+uzKWsh3080AH/ijjeXJneQlwrHqKeLlE5j1aTGDTO4/PYJmrej OXazcdLuKFdYnpcqc0m7Kj4tkls4Dty6xf63v29Gu7UVcCi0BAVmqdAevcNJKYP51W CAxwp6U1YccHg== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 10DBBC982C9; Wed, 16 Sep 2026 15:33:03 +0000 (UTC) From: Jim Cromie via B4 Relay Date: Wed, 16 Sep 2026 09:33:25 -0600 Subject: [PATCH v10 33/38] dyndbg: harden classmap and descriptor validation Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260916-dd-cmap-part2-clean-v10-33-af4cf4767707@gmail.com> References: <20260916-dd-cmap-part2-clean-v10-0-af4cf4767707@gmail.com> In-Reply-To: <20260916-dd-cmap-part2-clean-v10-0-af4cf4767707@gmail.com> To: Jason Baron , Shuah Khan , Andrew Morton , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Arnd Bergmann , Luis Chamberlain , Petr Pavlu , Daniel Gomez , Sami Tolvanen , Aaron Tomlin , Jonathan Corbet , Greg Kroah-Hartman , Nathan Chancellor , Nicolas Schier , Shuah Khan , Randy Dunlap , "Rafael J. Wysocki" , Pavel Machek , Len Brown Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-arch@vger.kernel.org, linux-modules@vger.kernel.org, linux-doc@vger.kernel.org, linux-kbuild@vger.kernel.org, linux-pm@vger.kernel.org, Jim Cromie X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789572777; l=9553; i=jim.cromie@gmail.com; s=20260203; h=from:subject:message-id; bh=nVFWnFKk0QgFo8thqqeslt7rKlx+zalXosrMpbqoT/M=; b=HjX+eUvHojWORc3aN6sS1EcixM4R5BxkavlY5DAiN/HRS2V5h377CNjRsgFDeciopyiA/XGdn 7YYA3T+SZWxCGh5hAVPTLpIegxifalHI9iGY11AjOpH9bXXs0ADMZzC X-Developer-Key: i=jim.cromie@gmail.com; a=ed25519; pk=C6E5ODlPQo7ZBynATXH9wg7K6HxP0pIXyf4s38Qw0XE= X-Endpoint-Received: by B4 Relay for jim.cromie@gmail.com/20260203 with auth_id=958 X-Original-From: Jim Cromie Reply-To: jim.cromie@gmail.com From: Jim Cromie Dynamic debug classmaps allow modules to _DEFINE and/or _USE multiple classmaps, but this requires coordination amongst the classmaps. Previously, class validation done by DYNAMIC_DEBUG_CLASSMAP_DEFINE at compile-time, and ddebug_class_range_overlap() at modprobe-time, was incomplete, and DYNAMIC_DEBUG_CLASSMAP_USE_ had no validation. This could allow broken classmaps, making them harder to use well. This commit improves classmap and descriptor validation: - Add run-time overlap checks for _USEd classmaps in ddebug_add_module() to prevent collisions between private maps and imported APIs. - Scan module descriptors at load time to print a single warning per missing class_id, rather than waiting for a user query to trip over it. - Downgrade the global WARN_ONCE in ddebug_match_desc() to a pr_warn_ratelimited, since orphaned class IDs are now tracked and warned about early at module load. Signed-off-by: Jim Cromie --- v10: . fix pr_warn_ratelimited() line wrap in ddebug_match_desc(). --- lib/dynamic_debug.c | 68 ++++++++++++++++++= ++-- lib/test_dynamic_debug.c | 16 +++-- .../selftests/dynamic_debug/dyndbg_selftest.sh | 22 +++---- 3 files changed, 84 insertions(+), 22 deletions(-) diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c index ac54a0499369..eb28831a6cb2 100644 --- a/lib/dynamic_debug.c +++ b/lib/dynamic_debug.c @@ -317,7 +317,8 @@ static bool ddebug_match_desc(const struct ddebug_query= *query, /* site is class'd */ site_map =3D ddebug_find_map_by_class_id(di, dp->class_id); if (!site_map) { - WARN_ONCE(1, "unknown class_id %d, check %s's CLASSMAP definitions", dp-= >class_id, di->mod_name); + pr_warn_ratelimited("unknown class_id %d, check %s's CLASSMAP definition= s\n", + dp->class_id, di->mod_name); return false; } /* module(-param) decides protection */ @@ -1490,6 +1491,23 @@ static int ddebug_class_range_overlap(struct ddebug_= class_map *cm, u64 *reserved return 0; } =20 +static int ddebug_class_user_overlap(struct ddebug_class_user *cli, + u64 *reserved_ids) +{ + struct ddebug_class_map *cm =3D cli->map; + int base =3D cm->base + cli->offset; + u64 range =3D (((1ULL << cm->length) - 1) << base); + + if (range & *reserved_ids) { + pr_err("module %s: [%d..%d] (from %s) conflicts with %llx\n", + cli->mod_name, base, base + cm->length - 1, + cm->class_names[0], *reserved_ids); + return -EINVAL; + } + *reserved_ids |=3D range; + return 0; +} + /* * Allocate a new ddebug_table for the given module * and add it to the global list. @@ -1500,7 +1518,8 @@ static int ddebug_add_module(struct _ddebug_info *di) struct ddebug_class_map *cm; struct ddebug_class_user *cli; u64 reserved_ids =3D 0; - int i; + u64 bad_ids =3D 0; + int i, err =3D 0; =20 if (!di->descs.len) return 0; @@ -1531,10 +1550,47 @@ static int ddebug_add_module(struct _ddebug_info *d= i) dd_set_module_subrange(i, cm, &dt->info, maps); dd_set_module_subrange(i, cli, &dt->info, users); =20 - /* insure 2+ classmaps share the per-module 0..62 class_id space */ + /* validate the per-module shared 0..62 class_id space */ for_subvec(i, cm, &dt->info, maps) if (ddebug_class_range_overlap(cm, &reserved_ids)) - goto cleanup; + err =3D -EINVAL; + + for_subvec(i, cli, &dt->info, users) { + cm =3D cli->map; + if (!cm) { + pr_err("module %s: classmap not found for user\n", di->mod_name); + err =3D -EINVAL; + continue; + } + + if (cm->base + cm->length + cli->offset > _DPRINTK_CLASS_DFLT) { + pr_err("module %s: base:%d + classes.len:%d + cli.offset:%d must be <= =3D %d\n", + di->mod_name, cm->base, cm->length, + cli->offset, _DPRINTK_CLASS_DFLT); + err =3D -EINVAL; + continue; + } + + if (ddebug_class_user_overlap(cli, &reserved_ids)) + err =3D -EINVAL; + } + if (err) + goto cleanup; + + /* validate all class_ids against module's classmaps/users */ + for (i =3D 0; i < dt->info.descs.len; i++) { + struct _ddebug *dp =3D &dt->info.descs.start[i]; + + if (dp->class_id =3D=3D _DPRINTK_CLASS_DFLT) + continue; + if (bad_ids & (1ULL << dp->class_id)) + continue; + if (!ddebug_find_map_by_class_id(&dt->info, dp->class_id)) { + pr_warn("module %s uses unknown class_id %d\n", + dt->info.mod_name, dp->class_id); + bad_ids |=3D (1ULL << dp->class_id); + } + } =20 mutex_lock(&ddebug_lock); list_add_tail(&dt->link, &ddebug_tables); @@ -1546,7 +1602,7 @@ static int ddebug_add_module(struct _ddebug_info *di) dt->info.descs.len, dt->info.mod_name); return 0; cleanup: - WARN_ONCE(1, "dyndbg multi-classmap conflict in %s\n", di->mod_name); + pr_err("dyndbg multi-classmap conflict in %s\n", di->mod_name); kfree(dt); return -EINVAL; } @@ -1633,7 +1689,7 @@ static int ddebug_module_notify(struct notifier_block= *self, unsigned long val, mod->dyndbg_info.mod_name =3D mod->name; ret =3D ddebug_add_module(&mod->dyndbg_info); if (ret) - WARN(1, "Failed to allocate memory: dyndbg may not work properly.\n"); + pr_err("dyndbg: failed to add module %s: %d\n", mod->name, ret); break; case MODULE_STATE_GOING: ddebug_remove_module(mod->name); diff --git a/lib/test_dynamic_debug.c b/lib/test_dynamic_debug.c index 7c10a1ddc630..fe5b885398f3 100644 --- a/lib/test_dynamic_debug.c +++ b/lib/test_dynamic_debug.c @@ -161,14 +161,20 @@ DYNAMIC_DEBUG_CLASSMAP_DEFINE(fail_base_len, 0, 60, #endif =20 #else /* TEST_DYNAMIC_DEBUG_SUBMOD */ - /* - * in submod/drm-drivers, use the classmaps defined in top/parent - * module above. + * In submod (drm-drivers/helpers) use the classmaps defined in + * top/parent module above. We _USE_() with offset, to test the + * non-zero case. */ - DYNAMIC_DEBUG_CLASSMAP_USE(map_disjoint_bits); -DYNAMIC_DEBUG_CLASSMAP_USE_(map_level_num, 7); +/* + * maybe force failure of runtime sanity test of classmap.length + offset = < 63 + */ +#if !defined(DD_RUNTIME_CLASS_CHECK) +DYNAMIC_DEBUG_CLASSMAP_USE_(map_level_num, 8); +#else +DYNAMIC_DEBUG_CLASSMAP_USE_(map_level_num, 55); +#endif =20 #if defined(DD_MACRO_ARGCHECK) DYNAMIC_DEBUG_CLASSMAP_USE_(fail_offset_big, 100); diff --git a/tools/testing/selftests/dynamic_debug/dyndbg_selftest.sh b/too= ls/testing/selftests/dynamic_debug/dyndbg_selftest.sh index a91a0ffa92d4..ef5f41ca7f7d 100755 --- a/tools/testing/selftests/dynamic_debug/dyndbg_selftest.sh +++ b/tools/testing/selftests/dynamic_debug/dyndbg_selftest.sh @@ -583,12 +583,12 @@ function GOLDEN_RECORDS { #K=3D c518a50ba30ba8099d0dc874a27ecf16 FT_multi_query.4 #K=3D 8f18ea82c09460434b6e9e4cd12543e8 FT_test_classes.1 #K=3D a15ec4843acd721fbdfddc0b512c8032 FT_test_classes.2 -#K=3D 20d4545f9753e677e72e3adf52527fd3 FT_test_classes.3 -#K=3D 934d8677872fe26bd636a6c3d6416aa2 FT_classmap_inheritance.1 -#K=3D cd1389958807063baa1ea4b06c61fa02 FT_classmap_inheritance.2 +#K=3D bc074e657d8d7f0bbc960e4dfa8de25d FT_test_classes.3 +#K=3D a60284143b51b5d13c4562f7f4a2e807 FT_classmap_inheritance.1 +#K=3D 1d43471dca765597d88a1be25d776c92 FT_classmap_inheritance.2 #K=3D 0708a283f0f1959135c797e36119e4af FT_classmap_inheritance.3 -#K=3D 05f6efb80299d24cde65174f64d97308 FT_classmap_inheritance.4 -#K=3D 7e92245008439ee79fe2460aeaa16a9b FT_classmap_inheritance.5 +#K=3D a0b9a8a9530706b85c4f8bf911607db0 FT_classmap_inheritance.4 +#K=3D f43e0aff8a4b38435b73d90ed8100d1b FT_classmap_inheritance.5 #K=3D 53d1b6875b65c79cfd759e209ae50b11 FT_modprobe_w_param.1 #K=3D 53d1b6875b65c79cfd759e209ae50b11 FT_modprobe_w_param.2 #K=3D 79d912e2aeb04dea70f9c7e701333f0a FT_modprobe_w_param.3 @@ -599,11 +599,11 @@ function GOLDEN_RECORDS { #K=3D 6a320774e2b535ceb89d6cdde6f5d0fb FT_modprobe_w_param.8 #K=3D f9cee4512e5604603e0262fba4bea223 FT_modprobe_w_param.9 #K=3D 6a320774e2b535ceb89d6cdde6f5d0fb FT_modprobe_w_param.10 -#K=3D b6a62433165f6423b81417f782551ab9 FT_modprobe_w_param.11 +#K=3D 7c645692e3e3796d4d3b8604c49583f7 FT_modprobe_w_param.11 #K=3D 6a320774e2b535ceb89d6cdde6f5d0fb FT_modprobe_w_param.12 -#K=3D de89753b843449d11da14240c4da4cad FT_modprobe_w_param.13 +#K=3D e995f70c0509334a33aec40ada9e6e6c FT_modprobe_w_param.13 #K=3D 6a320774e2b535ceb89d6cdde6f5d0fb FT_modprobe_w_param.14 -#K=3D 1d966d0cae735457791c93a86e9e1650 FT_modprobe_w_param.15 +#K=3D 72f97ca3e8f4c3e7f34fbe91de62e223 FT_modprobe_w_param.15 #K=3D 6a320774e2b535ceb89d6cdde6f5d0fb FT_modprobe_w_param.16 #K=3D 1aacb7c196a8354c46c60c73d78c6bf2 FT_modprobe_w_param.17 #K=3D 6a320774e2b535ceb89d6cdde6f5d0fb FT_modprobe_w_param.18 @@ -617,11 +617,11 @@ function GOLDEN_RECORDS { #K=3D 6a320774e2b535ceb89d6cdde6f5d0fb FT_modprobe_w_param.26 #K=3D 7fa4c84490c42c750986614c3539d56a FT_modprobe_w_param.27 #K=3D 6a320774e2b535ceb89d6cdde6f5d0fb FT_modprobe_w_param.28 -#K=3D 1eb866a813551061cd73178ba7833543 FT_modprobe_w_param.29 +#K=3D fc098897aa3e1472a536e7ae8069c84f FT_modprobe_w_param.29 #K=3D 6a320774e2b535ceb89d6cdde6f5d0fb FT_modprobe_w_param.30 -#K=3D a9e7424ed7b02696b5e12108971792dd FT_modprobe_w_param.31 +#K=3D 38ea63fed62a0308241325e57020b28e FT_modprobe_w_param.31 #K=3D 6a320774e2b535ceb89d6cdde6f5d0fb FT_modprobe_w_param.32 -#K=3D 5323d7746d983cdcfda4866255cd5123 FT_modprobe_w_param.33 +#K=3D 4b896adb5e7cfcc79f9ffa879d791f37 FT_modprobe_w_param.33 #K=3D 6a320774e2b535ceb89d6cdde6f5d0fb FT_modprobe_w_param.34 #K=3D 7f961a7d3facd89bdd4b9d8e7b5541e9 FT_modprobe_w_param.35 #K=3D 6a320774e2b535ceb89d6cdde6f5d0fb FT_modprobe_w_param.36 --=20 2.55.0 From nobody Fri Sep 25 04:43:45 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E55B1534461; Wed, 16 Sep 2026 15:33:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789572784; cv=none; b=Td/VUESLwIWmY9m6KD2n8aYycuPFB3EgaD7uIO5G1Fjrajkn0iTT1LXYUgEJSzAnxhJW43Mn4WWPTIIOMlUfDgY3GKj+GFK8Z9opgcE7N2pS3oEbw8Dsy0MARqxqp9NHwJn7Awrn0IkJvE8HPMjrMqtrrOTH9YNGsIXFTCS3gMw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789572784; c=relaxed/simple; bh=4+MZkT8C5be39u5Rz56Zi5vIinvJowiSV+zTxXMoXlE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=t58VFGkt9jccTLPWJyI9OJmyTYfoksaf0V4Aakjh8Rd50XMCG9jKZM8Nxsi1776of3eXztUsygqGsI4KxwPA8s70FDrbBkhJSI1bM6cNjw3zbZqjp93+5Xtn/AGfs3iQwjRGgsNh2KSSLSwOx+IHgOj1Taikvok/gR6XwHwxo+Q= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=ECjDinyz; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="ECjDinyz" Received: by smtp.kernel.org (Postfix) with ESMTPS id 3AA68C4AF15; Wed, 16 Sep 2026 15:33:03 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1789572783; bh=4+MZkT8C5be39u5Rz56Zi5vIinvJowiSV+zTxXMoXlE=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=ECjDinyzBIBB2xu3M2o0oGxADQc8PcMZAorFruiKzkyqvZ4fXM6oQB5itQse2Cyz1 pYZLRUyl3b2/YK3S0DzgedhdUG3rxU1xEeLHuPahnWzxWFSelUPP56QKMHioGK2lH3 h/iI9EJ6QSBvaW3JAhTblGFo7QTFcx/ZLRhrOI2vsmKucNM14Q+jY/j7CSB/wY5Tee x/EB8qNKHdOmuFrXqsnnaDC+E09CpTWNmpBlsULBP4qPNxUplpK1D7y+IHnd8AI88Y CJzE/G5iXn8TaMhs4N6a4M7Gx9MfCfES6x5FI+AzIuNku5anOfoIz5R8g4oyXE55sV wJRDVasDnx+Bw== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 27B8DC982CF; Wed, 16 Sep 2026 15:33:03 +0000 (UTC) From: Jim Cromie via B4 Relay Date: Wed, 16 Sep 2026 09:33:26 -0600 Subject: [PATCH v10 34/38] docs/dyndbg: add classmap info to howto Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260916-dd-cmap-part2-clean-v10-34-af4cf4767707@gmail.com> References: <20260916-dd-cmap-part2-clean-v10-0-af4cf4767707@gmail.com> In-Reply-To: <20260916-dd-cmap-part2-clean-v10-0-af4cf4767707@gmail.com> To: Jason Baron , Shuah Khan , Andrew Morton , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Arnd Bergmann , Luis Chamberlain , Petr Pavlu , Daniel Gomez , Sami Tolvanen , Aaron Tomlin , Jonathan Corbet , Greg Kroah-Hartman , Nathan Chancellor , Nicolas Schier , Shuah Khan , Randy Dunlap , "Rafael J. Wysocki" , Pavel Machek , Len Brown Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-arch@vger.kernel.org, linux-modules@vger.kernel.org, linux-doc@vger.kernel.org, linux-kbuild@vger.kernel.org, linux-pm@vger.kernel.org, Jim Cromie , Louis Chauvet X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789572777; l=7938; i=jim.cromie@gmail.com; s=20260203; h=from:subject:message-id; bh=bDBlM3OKBf1bitIDxea2Srxslww3od17iV3usIW+vIY=; b=2ht0QItFlKCvvNP0VfIsa6vhiFSYkTOXmJHT6fGWxDEPRGN+BObHbdwVvpet2i/N/+mhAW82L vHyGe80g+LoBs4zTVIneBLbnTjQjZq+GUyCMmjTClasQy82KUpdzmNS X-Developer-Key: i=jim.cromie@gmail.com; a=ed25519; pk=C6E5ODlPQo7ZBynATXH9wg7K6HxP0pIXyf4s38Qw0XE= X-Endpoint-Received: by B4 Relay for jim.cromie@gmail.com/20260203 with auth_id=958 X-Original-From: Jim Cromie Reply-To: jim.cromie@gmail.com From: Jim Cromie Describe the 3 API macros providing dynamic_debug's classmaps DYNAMIC_DEBUG_CLASSMAP_DEFINE - create & export a classmap DYNAMIC_DEBUG_CLASSMAP_USE - refer to exported map DYNAMIC_DEBUG_CLASSMAP_PARAM - bind control param to the classmap DYNAMIC_DEBUG_CLASSMAP_PARAM_REF + use module's storage - __drm_debug NB: The _DEFINE & _USE model makes the user dependent on the definer, just like EXPORT_SYMBOL(__drm_debug) already does. cc: linux-doc@vger.kernel.org Signed-off-by: Jim Cromie Reviewed-by: Louis Chauvet --- v9: . fix typo in class keyword documentation. . document DYNAMIC_DEBUG_CLASSMAP_PARAM_REF. v2: RvB after SoB --- Documentation/admin-guide/dynamic-debug-howto.rst | 145 ++++++++++++++++++= ++-- 1 file changed, 135 insertions(+), 10 deletions(-) diff --git a/Documentation/admin-guide/dynamic-debug-howto.rst b/Documentat= ion/admin-guide/dynamic-debug-howto.rst index a8962ab22aaf..f5b1470a4b88 100644 --- a/Documentation/admin-guide/dynamic-debug-howto.rst +++ b/Documentation/admin-guide/dynamic-debug-howto.rst @@ -146,6 +146,9 @@ keywords are:: "1-30" is valid range but "1 - 30" is not. =20 =20 +Keywords +-------- + The meanings of each keyword are: =20 func @@ -193,16 +196,6 @@ format format "nfsd: SETATTR" // a neater way to match a format with whitespace format 'nfsd: SETATTR' // yet another way to match a format with whitesp= ace =20 -class - The given class_name is validated against each module, which may - have declared a list of known class_names. If the class_name is - found for a module, callsite & class matching and adjustment - proceeds. Examples:: - - class DRM_UT_KMS # a DRM.debug category - class JUNK # silent non-match - // class TLD_* # NOTICE: no wildcard in class names - line The given line number or range of line numbers is compared against the line number of each ``pr_debug()`` callsite. A single @@ -217,6 +210,25 @@ line line -1605 // the 1605 lines from line 1 to line 1605 line 1600- // all lines from line 1600 to the end of the file =20 +class + + The given class_name is validated against each module, which may + have declared a list of class_names it accepts. If the class_name + is accepted by a module, callsite & class matching and adjustment + proceeds. Examples:: + + class DRM_UT_KMS # a drm.debug category + class JUNK # silent non-match + // class TLD_* # NOTICE: no wildcard in class names + +.. note:: + + Unlike other keywords, classes are "name-to-change", not + "omitting-constraint-allows-change". See Dynamic Debug Classmaps + +Flags +----- + The flags specification comprises a change operation followed by one or more flag characters. The change operation is one of the characters:: @@ -238,6 +250,11 @@ The flags are:: l Include line number d Include call trace =20 +.. note:: + + * To query without changing ``+_`` or ``-_``. + * To clear all flags ``=3D_`` or ``-fslmpt``. + For ``print_hex_dump_debug()`` and ``print_hex_dump_bytes()``, only the ``p`` flag has meaning, other flags are ignored. =20 @@ -394,3 +411,111 @@ just a shortcut for ``print_hex_dump(KERN_DEBUG)``. For ``print_hex_dump_debug()``/``print_hex_dump_bytes()``, format string is its ``prefix_str`` argument, if it is constant string; or ``hexdump`` in case ``prefix_str`` is built dynamically. + +.. _dyndbg-classmaps: + +Dynamic Debug Classmaps +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + +The "class" keyword selects prdbgs based on author supplied, +domain-oriented names. This complements the nested-scope keywords: +module, file, function, line. + +The main difference from the others: classes must be named to be +changed. This protects them from unintended overwrite:: + + # IOW this cannot undo any drm.debug settings + :#> ddcmd -p + +This protection is needed; /sys/module/drm/parameters/debug is ABI. +drm.debug is authoritative when dyndbg is not used, dyndbg-under-DRM +is an implementation detail, and must not behave erratically, just +because another admin fed >control something unrelated. + +So each class must be enabled individually (no wildcards):: + + :#> ddcmd class DRM_UT_CORE +p + :#> ddcmd class DRM_UT_KMS +p + # or more selectively + :#> ddcmd class DRM_UT_CORE module drm +p + +That makes direct >control wordy and annoying, but it is a secondary +interface; it is not intended to replace the ABI, just slide in +underneath and reimplement the guaranteed behavior. So DRM would keep +using the convenient way, and be able to trust it:: + + :#> echo 0x1ff > /sys/module/drm/parameters/debug + +That said, since the sysfs/kparam is the ABI, if the author omits the +CLASSMAP_PARAM, theres no ABI to guard, and he probably wants a less +pedantic >control interface. In this case, protection is dropped. + +Dynamic Debug Classmap API +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D + +DYNAMIC_DEBUG_CLASSMAP_DEFINE(clname,type,_base,classnames) - this maps +classnames (a list of strings) onto class-ids consecutively, starting +at _base. + +DYNAMIC_DEBUG_CLASSMAP_USE(clname) & _USE_(clname,_base) - modules +call this to refer to the var _DEFINEd elsewhere (and exported). + +DYNAMIC_DEBUG_CLASSMAP_PARAM(clname) - creates the sysfs/kparam, +maps/exposes bits 0..N as class-names. + +DYNAMIC_DEBUG_CLASSMAP_PARAM_REF(name,bits,var,flags) - connects an +existing module parameter variable (e.g. __drm_debug) to a classmap. + +Classmaps are opt-in: modules invoke _DEFINE or _USE to authorize +dyndbg to update those named classes. "class FOO" queries are +validated against the classes defined or used by the module, this +finds the classid to alter; classes are not directly selectable by +their classid. + +Classnames are global in scope, so subsystems (module-groups) should +prepend a subsystem name; unqualified names like "CORE" are discouraged. + +NB: It is an inherent API limitation (due to class_id's int type) that +the following are possible: + + // these errors should be caught in review + __pr_debug_cls(0, "fake DRM_UT_CORE msg"); // this works + __pr_debug_cls(62, "un-known classid msg"); // this compiles, does nothi= ng + +There are 2 types of classmaps: + +* DD_CLASS_TYPE_DISJOINT_BITS: classes are independent, like drm.debug +* DD_CLASS_TYPE_LEVEL_NUM: classes are relative, ordered (V3 > V2) + +DYNAMIC_DEBUG_CLASSMAP_PARAM - modelled after module_param_cb, it +refers to a DEFINEd classmap, and associates it to the param's +data-store. This state is then applied to DEFINEr and USEr modules +when they're modprobed. + +The PARAM interface also enforces the DD_CLASS_TYPE_LEVEL_NUM relation +amongst the contained classnames; all classes are independent in the +control parser itself. There is no implied meaning in names like "V4" +or "PL_ERROR" vs "PL_WARNING". + +Modules or subsystems (drm & drivers) can define multiple classmaps, +as long as they (all the classmaps) share the limited 0..62 +per-module-group _class_id range, without overlap. + +If a module encounters a conflict between 2 classmaps it is _USEing or +_DEFINEing, it can invoke the extended _USE_(name,_base) macro to +de-conflict the respective ranges. + +``#define DEBUG`` will enable all pr_debugs in scope, including any +class'd ones. This won't be reflected in the PARAM readback value, +but the class'd pr_debug callsites can be forced off by toggling the +classmap-kparam all-on then all-off. + +Self-Testing and Validation +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D + +Dynamic debug includes a regression test script in kselftest:: + + :#> make -C tools/testing/selftests TARGETS=3Ddynamic_debug run_tests + # Or run directly on a running kernel: + :#> ./tools/testing/selftests/dynamic_debug/dyndbg_selftest.sh + --=20 2.55.0 From nobody Fri Sep 25 04:43:45 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 13A61538D68; Wed, 16 Sep 2026 15:33:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789572784; cv=none; b=ss/m6ZXiz6F1f6fVVv8iPJ7FDern06ugmx1jHmyD7FF7BMPC92qHL03WCOauytgcCMpvUym6vRaM2xaPxaZMmZ5kPewMBNoX1H8vIjx6ix/yXli4Ed4DVGbbilGyBbf36yvK7s7CYRGywO5WgFP8wHGU7VKmDhZkiV25ajVsCdo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789572784; c=relaxed/simple; bh=J2wtgx08J+zXoVVYsLkh+9kBTJrKAzmGOYGyO9x2vtg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=qMZVJGDzR0/V6u5XvGWwKAFuL2g7aU+DI7XHNvJ4eckAqVsU4oMmvWfI9o+p1Vkavnb7+2F1bSKoUKGDcXo/cbCzGHcR9zyuiM7X52gItionLaEUJj0NlYEF1Z65tkiWWmIN1gn8cJcQq8KOgCL8wSFjHlXrLa8v7fKfAANNtZU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=bfD492ly; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="bfD492ly" Received: by smtp.kernel.org (Postfix) with ESMTPS id 4E32CC4AF19; Wed, 16 Sep 2026 15:33:03 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1789572783; bh=J2wtgx08J+zXoVVYsLkh+9kBTJrKAzmGOYGyO9x2vtg=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=bfD492lyQUsxNpkz4ZB6Tdv1B2+imAm6I5c/AtrJxGr92ivi83qaf98/dH+k3B9F5 qP/2PKSrGnEyUxqihgBEHBbAue1J+0790BO+GfbEz6l9oxJLuJ6nYpt5sB8ki7oIMm kpjdPXEpghzvw8z1ZzcCbDS7f4XjXT4tXl1AR7PJdfNCliJrdUvCXTkSY4uD5rV2QN EdKqwnD8IS+oJ3Zxbtd51dRM+uBdRrfeuNuo+dFU8zTh64KU5OscnY+JlCwZrVLjEJ M/iWfytW/YnrCBrek+xd0m5uPD8EQId19eaW/xGV/ON9+mtrgbSE6uAJ35zR/qfH0n NOqtu8yYACLCQ== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 3AD01C982C3; Wed, 16 Sep 2026 15:33:03 +0000 (UTC) From: Jim Cromie via B4 Relay Date: Wed, 16 Sep 2026 09:33:27 -0600 Subject: [PATCH v10 35/38] dyndbg: Ignore additional arguments from pr_fmt Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260916-dd-cmap-part2-clean-v10-35-af4cf4767707@gmail.com> References: <20260916-dd-cmap-part2-clean-v10-0-af4cf4767707@gmail.com> In-Reply-To: <20260916-dd-cmap-part2-clean-v10-0-af4cf4767707@gmail.com> To: Jason Baron , Shuah Khan , Andrew Morton , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Arnd Bergmann , Luis Chamberlain , Petr Pavlu , Daniel Gomez , Sami Tolvanen , Aaron Tomlin , Jonathan Corbet , Greg Kroah-Hartman , Nathan Chancellor , Nicolas Schier , Shuah Khan , Randy Dunlap , "Rafael J. Wysocki" , Pavel Machek , Len Brown Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-arch@vger.kernel.org, linux-modules@vger.kernel.org, linux-doc@vger.kernel.org, linux-kbuild@vger.kernel.org, linux-pm@vger.kernel.org, Jim Cromie , Philipp Hahn X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789572777; l=7234; i=jim.cromie@gmail.com; s=20260203; h=from:subject:message-id; bh=fSTkq3e+fagqoGSvxLT4HO/f6Eg0KGNZD7VBMflSa78=; b=YHRlv0h8KOwHcw0A6fQsfKidK8rYUsNmqIr+JVedrugUbIhnqA85LdxgVj9cKZT5HlkJUTXRI mlD6p6YNfMCA0fowmCUdrJmoGFieL4uRKiNKSwrh5PT1OI5VsxKX0Fo X-Developer-Key: i=jim.cromie@gmail.com; a=ed25519; pk=C6E5ODlPQo7ZBynATXH9wg7K6HxP0pIXyf4s38Qw0XE= X-Endpoint-Received: by B4 Relay for jim.cromie@gmail.com/20260203 with auth_id=958 X-Original-From: Jim Cromie Reply-To: jim.cromie@gmail.com From: Philipp Hahn pr_fmt can be used to add a common prefix to any output from a module: #define pr_fmt(fmt) KBUILD_MODNAME ".%s " fmt, __func__ But adding additional arguments breaks dynamic debug: > error: macro "DEFINE_DYNAMIC_DEBUG_METADATA_CLS" passed 4 arguments, but = takes just 3 > | pr_debug_ratelimited("%s", "Hello world!"); > | ^ > note: macro "DEFINE_DYNAMIC_DEBUG_METADATA_CLS" defined here > | #define DEFINE_DYNAMIC_DEBUG_METADATA_CLS(name, cls, fmt) \ > | > error: =E2=80=98DEFINE_DYNAMIC_DEBUG_METADATA_CLS=E2=80=99 undeclared (fi= rst use in this function) > | DEFINE_DYNAMIC_DEBUG_METADATA_CLS(name, _DPRINTK_CLASS_DFLT, fm= t) > | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > note: in expansion of macro =E2=80=98DEFINE_DYNAMIC_DEBUG_METADATA=E2=80= =99 > | DEFINE_DYNAMIC_DEBUG_METADATA(descriptor, pr_fmt(fmt)); = \ > | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > note: in expansion of macro =E2=80=98pr_debug_ratelimited=E2=80=99 > | pr_debug_ratelimited("%s", "Hello world!"); > | ^~~~~~~~~~~~~~~~~~~~ Add an additional ', ...' to DEFINE_DYNAMIC_DEBUG_METADATA_CLS to slurp any additional argument, which `pr_fmt` might add. Signed-off-by: Philipp Hahn [pr_fmt change on test_dynamic_debug_submod instead of parent] Reviewed-by: Jim Cromie --- v10: . pass raw fmt to DEFINE_DYNAMIC_DEBUG_METADATA in pr_debug_ratelimited(). --- include/linux/dynamic_debug.h | 2 +- include/linux/printk.h | 2 +- lib/test_dynamic_debug.c | 4 ++-- .../selftests/dynamic_debug/dyndbg_selftest.sh | 26 +++++++++++-------= ---- 4 files changed, 17 insertions(+), 17 deletions(-) diff --git a/include/linux/dynamic_debug.h b/include/linux/dynamic_debug.h index 2542d7c41b3e..d94ad3a2018a 100644 --- a/include/linux/dynamic_debug.h +++ b/include/linux/dynamic_debug.h @@ -359,7 +359,7 @@ void __dynamic_ibdev_dbg(struct _ddebug *descriptor, dump_stack(); \ } =20 -#define DEFINE_DYNAMIC_DEBUG_METADATA_CLS(name, cls, fmt) \ +#define DEFINE_DYNAMIC_DEBUG_METADATA_CLS(name, cls, fmt, ...) \ static struct _ddebug __aligned(8) \ __section("__dyndbg_descs") name =3D { \ .modname =3D DDEBUG_MODNAME, \ diff --git a/include/linux/printk.h b/include/linux/printk.h index f594c1266bfd..5d701952e739 100644 --- a/include/linux/printk.h +++ b/include/linux/printk.h @@ -742,7 +742,7 @@ do { \ static DEFINE_RATELIMIT_STATE(_rs, \ DEFAULT_RATELIMIT_INTERVAL, \ DEFAULT_RATELIMIT_BURST); \ - DEFINE_DYNAMIC_DEBUG_METADATA(descriptor, pr_fmt(fmt)); \ + DEFINE_DYNAMIC_DEBUG_METADATA(descriptor, fmt); \ if (DYNAMIC_DEBUG_BRANCH(descriptor) && \ __ratelimit(&_rs)) \ __dynamic_pr_debug(&descriptor, pr_fmt(fmt), ##__VA_ARGS__); \ diff --git a/lib/test_dynamic_debug.c b/lib/test_dynamic_debug.c index fe5b885398f3..2710c4ea39a0 100644 --- a/lib/test_dynamic_debug.c +++ b/lib/test_dynamic_debug.c @@ -23,7 +23,7 @@ * the usage clearer. */ #if defined(TEST_DYNAMIC_DEBUG_SUBMOD) - #define pr_fmt(fmt) "test_dd_submod: " fmt + #define pr_fmt(fmt) "test_dd_submod: %s " fmt, __func__ #else #define pr_fmt(fmt) "test_dd: " fmt #endif @@ -272,7 +272,7 @@ static int __init test_dynamic_debug_init(void) =20 static void __exit test_dynamic_debug_exit(void) { - pr_debug("exited\n"); + pr_debug_ratelimited("exited\n"); } =20 module_init(test_dynamic_debug_init); diff --git a/tools/testing/selftests/dynamic_debug/dyndbg_selftest.sh b/too= ls/testing/selftests/dynamic_debug/dyndbg_selftest.sh index ef5f41ca7f7d..5eae762d6f78 100755 --- a/tools/testing/selftests/dynamic_debug/dyndbg_selftest.sh +++ b/tools/testing/selftests/dynamic_debug/dyndbg_selftest.sh @@ -588,40 +588,40 @@ function GOLDEN_RECORDS { #K=3D 1d43471dca765597d88a1be25d776c92 FT_classmap_inheritance.2 #K=3D 0708a283f0f1959135c797e36119e4af FT_classmap_inheritance.3 #K=3D a0b9a8a9530706b85c4f8bf911607db0 FT_classmap_inheritance.4 -#K=3D f43e0aff8a4b38435b73d90ed8100d1b FT_classmap_inheritance.5 +#K=3D 62b6803edf43519186d6185bebf34352 FT_classmap_inheritance.5 #K=3D 53d1b6875b65c79cfd759e209ae50b11 FT_modprobe_w_param.1 #K=3D 53d1b6875b65c79cfd759e209ae50b11 FT_modprobe_w_param.2 -#K=3D 79d912e2aeb04dea70f9c7e701333f0a FT_modprobe_w_param.3 +#K=3D 117ebf415c886c14b22e473d9b49886b FT_modprobe_w_param.3 #K=3D 6a320774e2b535ceb89d6cdde6f5d0fb FT_modprobe_w_param.4 -#K=3D 7cd75277388a6e7cf9c849442388f4af FT_modprobe_w_param.5 +#K=3D 23bf93d8d91b2e033f91caf2e5d2df2c FT_modprobe_w_param.5 #K=3D 6a320774e2b535ceb89d6cdde6f5d0fb FT_modprobe_w_param.6 -#K=3D 9196c43693f5e6059f3512e4d87e7347 FT_modprobe_w_param.7 +#K=3D 7090bc68365ad55564c54b1ba7355c73 FT_modprobe_w_param.7 #K=3D 6a320774e2b535ceb89d6cdde6f5d0fb FT_modprobe_w_param.8 #K=3D f9cee4512e5604603e0262fba4bea223 FT_modprobe_w_param.9 #K=3D 6a320774e2b535ceb89d6cdde6f5d0fb FT_modprobe_w_param.10 -#K=3D 7c645692e3e3796d4d3b8604c49583f7 FT_modprobe_w_param.11 +#K=3D 076874eb43826e97586f034f4d2786e6 FT_modprobe_w_param.11 #K=3D 6a320774e2b535ceb89d6cdde6f5d0fb FT_modprobe_w_param.12 -#K=3D e995f70c0509334a33aec40ada9e6e6c FT_modprobe_w_param.13 +#K=3D 872dbd5d067953e34cd5a88db3a3b5e4 FT_modprobe_w_param.13 #K=3D 6a320774e2b535ceb89d6cdde6f5d0fb FT_modprobe_w_param.14 -#K=3D 72f97ca3e8f4c3e7f34fbe91de62e223 FT_modprobe_w_param.15 +#K=3D dce720419939a1baadaae27e98ceabea FT_modprobe_w_param.15 #K=3D 6a320774e2b535ceb89d6cdde6f5d0fb FT_modprobe_w_param.16 #K=3D 1aacb7c196a8354c46c60c73d78c6bf2 FT_modprobe_w_param.17 #K=3D 6a320774e2b535ceb89d6cdde6f5d0fb FT_modprobe_w_param.18 #K=3D e62014acf5ab6a76dfbfbcf67b2ca0e8 FT_modprobe_w_param.19 #K=3D e62014acf5ab6a76dfbfbcf67b2ca0e8 FT_modprobe_w_param.20 -#K=3D 58c009cb287fa5df3f8c1c72c832cb42 FT_modprobe_w_param.21 +#K=3D 4bfcf87a67b1a5a5a56212deac36c20a FT_modprobe_w_param.21 #K=3D 6a320774e2b535ceb89d6cdde6f5d0fb FT_modprobe_w_param.22 -#K=3D e7831be2aac4a82daba43966b9d31e19 FT_modprobe_w_param.23 +#K=3D f0d3016e22d88ee9f810b81235c6acdc FT_modprobe_w_param.23 #K=3D 6a320774e2b535ceb89d6cdde6f5d0fb FT_modprobe_w_param.24 -#K=3D 4df2fbc0cae329debb14bedb5e7d86c0 FT_modprobe_w_param.25 +#K=3D da3e0531675fc96503a7077ef8fa5eeb FT_modprobe_w_param.25 #K=3D 6a320774e2b535ceb89d6cdde6f5d0fb FT_modprobe_w_param.26 #K=3D 7fa4c84490c42c750986614c3539d56a FT_modprobe_w_param.27 #K=3D 6a320774e2b535ceb89d6cdde6f5d0fb FT_modprobe_w_param.28 -#K=3D fc098897aa3e1472a536e7ae8069c84f FT_modprobe_w_param.29 +#K=3D 923ca0e8a24d3e365b9dc89624062708 FT_modprobe_w_param.29 #K=3D 6a320774e2b535ceb89d6cdde6f5d0fb FT_modprobe_w_param.30 -#K=3D 38ea63fed62a0308241325e57020b28e FT_modprobe_w_param.31 +#K=3D 7eb76bdeb6e42f46e9c16b5932db79e1 FT_modprobe_w_param.31 #K=3D 6a320774e2b535ceb89d6cdde6f5d0fb FT_modprobe_w_param.32 -#K=3D 4b896adb5e7cfcc79f9ffa879d791f37 FT_modprobe_w_param.33 +#K=3D 5aaa5a8e367ec2871785f0c64853e243 FT_modprobe_w_param.33 #K=3D 6a320774e2b535ceb89d6cdde6f5d0fb FT_modprobe_w_param.34 #K=3D 7f961a7d3facd89bdd4b9d8e7b5541e9 FT_modprobe_w_param.35 #K=3D 6a320774e2b535ceb89d6cdde6f5d0fb FT_modprobe_w_param.36 --=20 2.55.0 From nobody Fri Sep 25 04:43:45 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A182A5427F8; Wed, 16 Sep 2026 15:33:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789572785; cv=none; b=bLMxrIrjYklMOaeLXKD/JuTRDWm4sjGxtJns4tf7n+PWe4fA+uyGrnR+Im+Z1dEr3Q4aSx8Iqg43b9VbkTFBrsgLqo8BEGKEkAXRaYYcqWVPPYTlSZAuFcXp9mn0bgcSxBjVIEUDbsqI2I+nZ74Axw/isOc1Hv0migdj2crNhAQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789572785; c=relaxed/simple; bh=qXTRbpJ7ReGwZJ5gYtv8LBnx55PmlIa0iKRgL5OtWxI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=pbrVTfxb7L3wjBxiSLUn/G+2IKCvQyNS4fkymqPjvzADE1YayMLqRrruAArDNTlHMtOOGtsilZWKds7eK2zSOmnlQEhgsOibF82dqMBf8s/FltgtQlr4R/EpmLWvBxusXOOlt3OKt9z8jcoX0pCUgDTlcMttvQ3ZfvBgOxej8Mw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=oq092fH/; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="oq092fH/" Received: by smtp.kernel.org (Postfix) with ESMTPS id 638B6C4AF1A; Wed, 16 Sep 2026 15:33:03 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1789572783; bh=qXTRbpJ7ReGwZJ5gYtv8LBnx55PmlIa0iKRgL5OtWxI=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=oq092fH/CK6MMaxjIjK+vQOodq3WiApLPtq2lDhU8j95i2VzXt3Aq0+PqB/xBwvNL vZ7mvA/CK8m62cavUZtjfZDfdEMYGFklQ+cvHwUr3GKFqfRUu69Ue8Zue92TeCS+bQ AIeIDg7r5eBxrJBPjF2EwepSkOU0DdkYm+D0p+n5WzuaJ+D36XB+EKHkzLIMcMfjhH RCLmUmcIpFA4K/fr2pjwz6R3QKsZFSXnIM/u1CzxdfCyzGD90AzesKk7sqUX9tyykk Emu+BrWAfZF42ERYPtlyka3UH4XLXsHOyN6cgjAcBsuwxoH5iy00Yy+VDKOrUHuahc 4s+tc794VWwog== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 50509C982D0; Wed, 16 Sep 2026 15:33:03 +0000 (UTC) From: Jim Cromie via B4 Relay Date: Wed, 16 Sep 2026 09:33:28 -0600 Subject: [PATCH v10 36/38] dyndbg: add epilogue to dynamic_debug/control file Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260916-dd-cmap-part2-clean-v10-36-af4cf4767707@gmail.com> References: <20260916-dd-cmap-part2-clean-v10-0-af4cf4767707@gmail.com> In-Reply-To: <20260916-dd-cmap-part2-clean-v10-0-af4cf4767707@gmail.com> To: Jason Baron , Shuah Khan , Andrew Morton , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Arnd Bergmann , Luis Chamberlain , Petr Pavlu , Daniel Gomez , Sami Tolvanen , Aaron Tomlin , Jonathan Corbet , Greg Kroah-Hartman , Nathan Chancellor , Nicolas Schier , Shuah Khan , Randy Dunlap , "Rafael J. Wysocki" , Pavel Machek , Len Brown Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-arch@vger.kernel.org, linux-modules@vger.kernel.org, linux-doc@vger.kernel.org, linux-kbuild@vger.kernel.org, linux-pm@vger.kernel.org, Jim Cromie X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789572777; l=2252; i=jim.cromie@gmail.com; s=20260203; h=from:subject:message-id; bh=t4exfKxrgybri5XrCovAfGOptL2KD/oh7WXXahxPsi4=; b=TohONGMwqA/3OVpvRGOo+ardrof1fhxX4yK8PzFM00MjzZwVBwOX7TvDE9VhdXjc8JE8qGeND ekqnZBFXLgFDwK6nIW3FL4norVhX/ECzjj383X44eJGNQdDSAgRZEMe X-Developer-Key: i=jim.cromie@gmail.com; a=ed25519; pk=C6E5ODlPQo7ZBynATXH9wg7K6HxP0pIXyf4s38Qw0XE= X-Endpoint-Received: by B4 Relay for jim.cromie@gmail.com/20260203 with auth_id=958 X-Original-From: Jim Cromie Reply-To: jim.cromie@gmail.com From: Jim Cromie Add an epilogue to the control-file, to allow display of statistics etc, without disturbing the header. NB: epilogue lines should start with "#: " to distinguish them from lines describing pr_debugs (and from the header line). No new lines are added here, only the place to do so. Signed-off-by: Jim Cromie --- v9: . update ddebug_proc_start() to return EPILOGUE_TOKEN when seeking directly= to epilogue. --- lib/dynamic_debug.c | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c index eb28831a6cb2..406b64d67440 100644 --- a/lib/dynamic_debug.c +++ b/lib/dynamic_debug.c @@ -1183,6 +1183,9 @@ static struct _ddebug *ddebug_iter_next(struct ddebug= _iter *iter) * read() call from userspace. Takes the ddebug_lock and * seeks the seq_file's iterator to the given position. */ +static char ddebug_epilogue_token; +#define EPILOGUE_TOKEN (&ddebug_epilogue_token) + static void *ddebug_proc_start(struct seq_file *m, loff_t *pos) { struct ddebug_iter *iter =3D m->private; @@ -1198,7 +1201,9 @@ static void *ddebug_proc_start(struct seq_file *m, lo= ff_t *pos) dp =3D ddebug_iter_first(iter); while (dp !=3D NULL && --n > 0) dp =3D ddebug_iter_next(iter); - return dp; + if (dp) + return dp; + return n <=3D 1 ? EPILOGUE_TOKEN : NULL; } =20 /* @@ -1211,12 +1216,20 @@ static void *ddebug_proc_next(struct seq_file *m, v= oid *p, loff_t *pos) struct ddebug_iter *iter =3D m->private; struct _ddebug *dp; =20 + (*pos)++; + + if (p =3D=3D EPILOGUE_TOKEN) + return NULL; + if (p =3D=3D SEQ_START_TOKEN) dp =3D ddebug_iter_first(iter); else dp =3D ddebug_iter_next(iter); - ++*pos; - return dp; + + if (dp) + return dp; + + return EPILOGUE_TOKEN; } =20 static bool ddebug_class_map_in_range(const int class_id, const struct dde= bug_class_map *map) @@ -1268,6 +1281,10 @@ static int ddebug_proc_show(struct seq_file *m, void= *p) "# filename:lineno [module]function flags format\n"); return 0; } + if (p =3D=3D EPILOGUE_TOKEN) { + /* use this soon */ + return 0; + } =20 seq_printf(m, "%s:%u [%s]%s =3D%s \"", trim_prefix(dp->filename), dp->lineno, --=20 2.55.0 From nobody Fri Sep 25 04:43:45 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0F1BC53447D; Wed, 16 Sep 2026 15:33:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789572784; cv=none; b=uNpi4HU3CY0pKXpxL1TamPC7czfiv9IsiLBRbIm2lLBzZK5nFYb4gmkoQMjq/eWtgZ4n4hJ4D2r02dCzaDKlT1cbfMAvQL5TX029CqyYPpSlSgGD4Lo0umt1XQUlNIMZtDB3cAa7w0fH+BxMlenyRHL1GnDVU3s204qOGbG3VbY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789572784; c=relaxed/simple; bh=EiaKxBcFsbn0W1clC6eKs9DiqBTaOD5y5X/TCWlwY+o=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=GwYfgNpburUmP6pM8Tnfe9LvF/r+TlYFx0j/AyV1KyopApRBzsOI58krqnI3cWqiZdFFctPjxMQYpCePfToeyg9hM1s19u/GUr3htCVnBVbSIi7h8A6t/vdpmaOfZxfzryv1iZ3cXYLninqeLfJREgP9Vx4CF5E3i6kpoVCOmKo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=EUjFr55B; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="EUjFr55B" Received: by smtp.kernel.org (Postfix) with ESMTPS id 76E44C4AF50; Wed, 16 Sep 2026 15:33:03 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1789572783; bh=EiaKxBcFsbn0W1clC6eKs9DiqBTaOD5y5X/TCWlwY+o=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=EUjFr55BndcDC8BPtRxe7Fcip3zpyHGUv5DUzBMSbr7fIIWxFHKD2o+hmPkn+OGLU HdAI60lETuPjJwrI6ZHPmNx6pL9moWmX9pYiiXoj3tuJwWslPmdVnSMJhZeqJZpTOB xg7KJq98TI17h08mZ5TiwFLXXGdKF3Pn9mkbslbXUtrxPVt5t4ESI1S9oaHcO+1BQ9 2ecjGEs+4mCXy6zovp9PsODp3Bwz281tkBSGgg9s8R6uvGMVvxvyYIe2CMzMziEAZ7 8ZYtYV/qeE9zBCpZ7omkTVXGrNMQ+gFCy7hknYFFgrTxzpIzxO9m8rIUtNUuoAIwPZ 6xCFE7my2Qb+A== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 6542FC982C9; Wed, 16 Sep 2026 15:33:03 +0000 (UTC) From: Jim Cromie via B4 Relay Date: Wed, 16 Sep 2026 09:33:29 -0600 Subject: [PATCH v10 37/38] dyndbg: add +c flag to count advantage of classmaps for DRM Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260916-dd-cmap-part2-clean-v10-37-af4cf4767707@gmail.com> References: <20260916-dd-cmap-part2-clean-v10-0-af4cf4767707@gmail.com> In-Reply-To: <20260916-dd-cmap-part2-clean-v10-0-af4cf4767707@gmail.com> To: Jason Baron , Shuah Khan , Andrew Morton , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Arnd Bergmann , Luis Chamberlain , Petr Pavlu , Daniel Gomez , Sami Tolvanen , Aaron Tomlin , Jonathan Corbet , Greg Kroah-Hartman , Nathan Chancellor , Nicolas Schier , Shuah Khan , Randy Dunlap , "Rafael J. Wysocki" , Pavel Machek , Len Brown Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-arch@vger.kernel.org, linux-modules@vger.kernel.org, linux-doc@vger.kernel.org, linux-kbuild@vger.kernel.org, linux-pm@vger.kernel.org, Jim Cromie X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789572777; l=15846; i=jim.cromie@gmail.com; s=20260203; h=from:subject:message-id; bh=UgEpeUYYslZ7ljuve3ooJVvCgWAYyjl+oKIxiw/dQXU=; b=I+A9sR8IVqhFZKqqppVFj+Dfgb8RkKVr+LJ84t42pk5yqvp7mzz6DwHHEnxpS3aPmIgtsGgjf EgWi7Cl71SIACoT5YuQ0jghR9CS5sRPe6zlXsgGEQB1OkY0ND6lxNlC X-Developer-Key: i=jim.cromie@gmail.com; a=ed25519; pk=C6E5ODlPQo7ZBynATXH9wg7K6HxP0pIXyf4s38Qw0XE= X-Endpoint-Received: by B4 Relay for jim.cromie@gmail.com/20260203 with auth_id=958 X-Original-From: Jim Cromie Reply-To: jim.cromie@gmail.com From: Jim Cromie Introduce a +c flag, to increment a per-cpu counter: ddebug_count when a flagged pr_debug() is called. Reset the counter with: echo reset_stats > /proc/dynamic_debug/control and see the count value with: tail -n1 /proc/dynamic_debug/control #: total count: 2295401 This counter lets us count drm*dbg() callrate without doing the printk; it counts how often upstream drm_debug_enabled() would read main memory, evict a cache-line, and test a bit. CONFIG_DRM_USE_DYNAMIC_DEBUG=3Dy gives drm a per callsite static-key to avoid that cache-line insult. On my amdgpu + nvidia laptop, thats ~3200 of them. The benchmarks below are from a recent build running on my asus amdgpu + nouveau laptop, using scripts from below the snip. #> count_hits 30 hammer_vk -- Banging on: hammer_vk (&) [1] 100847 [1]+ Done hammer_vk #: total hits: 2295401 #> count_hits 30 hammer_vk -- DRM_UT_CORE Banging on: hammer_vk (&) [1] 99910 [1]+ Done hammer_vk #: total hits: 2204406 Notably, the DRM_UT_CORE category dominates the call traffic, not DRM_UT_VBL or any others, which contribute little extra to the above. To see the distribution of debug categories (for vkcube load) #> 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 REVIEW: In every minute, 12 vkcubes issue ~4.6M drm_debug_enabled(__drm_debug) macro-calls. To test the bits, they all *may* go out to main memory, though __drm_debug is ro-mostly. Still, theres significant cache-line eviction, and potentially meaningful costs we can avoid. With CONFIG_DRM_USE_DYNAMIC_DEBUG=3Dy, each pr_debug call-site is replaced by a static-key, with the off-cost of few NOOPs, avoiding all the unpredictable downsides. NOTES: The +c flag invokes the callsite, but avoids the heavy syslog writing. It is currently independent of +p, but it could be compressed into a state-machine, and the bit recovered, but not til we need to do so. The +c flag has no predictive quality; to count usr_dbg() callsites, you must have reimplemnted them already with pr_debug. This just gives DRM some numbers to consider, to balance against the work needed o test this series. Assisted-by: Gemini-CLI:gemini-2.5-pro Signed-off-by: Jim Cromie --- v10: . add __DYNAMIC_DEBUG_BRANCH() checking _ENABLED while DYNAMIC_DEBUG_BRANCH= () checks _ACTIVE. . add early return guards in __dynamic_*_dbg() helpers checking _ACTIVE. v9: . add missing kfree(tmpbuf) in reset_stats handler before early return. . sum across for_each_possible_cpu() in get_ddebug_call_count() for hotplug= stability. . update !CONFIG_JUMP_LABEL branch check to check _DPRINTK_FLAGS_ENABLED. function ddcmd () { local cmd=3D"$*" # Direct write - assume the parent script is run with 'sudo' or as root [ -f /proc/dynamic_debug/control ] || return 1; if ! echo "$cmd" > /proc/dynamic_debug/control 2>/tmp/dd_err; then local ret=3D$? echo "ERROR ($ret): $(cat /tmp/dd_err)" #>&2 # Check dmesg for the "!" syntax error on wk-baseline dmesg | grep -i "dyndbg" | tail -n 2 #>&2 return $ret fi } function _get_cal_count() { if [ ! -f /proc/interrupts ]; then echo 0 return fi # sum all CPU columns for any line starting with CAL: # the awk starts at $2 to skip the label (CAL:) # NF-2 skips the trailing text "Function call interrupts" grep "^ *CAL:" /proc/interrupts | \ awk '{ for(i=3D2; i<=3DNF-2; i++) sum+=3D$i } END { print sum+0 }' } function wrap_cal_count() { local cal_before cal_before=3D$(_get_cal_count) printf " wrapping: %s\n" "$*" #>&2 #time \ "$@" || return 1 local cal_after cal_after=3D$(_get_cal_count) local delta=3D$(( ${cal_after:-0} - ${cal_before:-0} )) printf "Delta-CAL (IPI): %d\n" "$delta" #>&2 } TEST_CLASSES_LIST=3D"D2_CORE D2_DRIVER D2_KMS D2_PRIME D2_ATOMIC D2_VBL D2_= STATE D2_LEASE D2_DP D2_DRMRES V0 V1 V2 V3 V4 V5 V6 V7" DRM_CLASSES_LIST=3D"DRM_UT_CORE DRM_UT_DRIVER DRM_UT_KMS DRM_UT_PRIME DRM_U= T_ATOMIC DRM_UT_VBL DRM_UT_STATE DRM_UT_LEASE DRM_UT_DP DRM_UT_DRMRES" function dd_setup_() { local flags=3D"${1:-+p}" # Use $2 if provided, otherwise fallback to the full list local CLASSES_LIST=3D"$2" local q=3D"" local C # Safeguard: if list is empty, don't do anything [[ -z "$CLASSES_LIST" ]] && echo "no classes!" && return 0 for C in $CLASSES_LIST; do q+=3D"class $C $flags ; " done #echo "sending: $q" ddcmd "$q" } function dd_setup_test() { modprobe test_dynamic_debug || return 1 dd_setup_ $1 "${2:-$TEST_CLASSES_LIST}" } function dd_setup_drm() { dd_setup_ $1 "${2:-$DRM_CLASSES_LIST}" } function count_hits() { local duration=3D60 [[ "$1" =3D~ ^[0-9]+$ ]] && { duration=3D$1; shift; } local cmd_to_run=3D() local custom_classes=3D"" while [[ $# -gt 0 ]]; do if [[ "$1" =3D=3D "--" ]]; then shift custom_classes=3D"$*" break fi cmd_to_run+=3D("$1") shift done ddcmd reset_stats dd_setup_drm "+c" "$custom_classes" if [[ ${#cmd_to_run[@]} -gt 0 ]]; then echo "Banging on: ${cmd_to_run[*]} (&)" # Use eval so bash functions work eval "${cmd_to_run[*]} &" local cmd_pid=3D$! sleep "$duration" killall vkcube 2>/dev/null kill "$cmd_pid" 2>/dev/null else sleep "$duration" fi dd_setup_drm "-c" "$custom_classes" tail -n1 /proc/dynamic_debug/control } function hammer_vk() { for i in {1..12}; do vkcube >/dev/null 2>&1 & done } function isolate_drm_hits() { local duration=3D${1:-10} local cmd=3D${2:-vkcube} echo "Starting isolation study: ${duration}s per class using ${cmd}" echo "----------------------------------------------------------" printf "%-20s | %-10s\n" "DRM CLASS" "TOTAL HITS" echo "----------------------------------------------------------" for class in $DRM_CLASSES_LIST FOO; do # Run count_hits for the specific class # Use 'capture' logic to grab only the hit count from the tail outp= ut result=3D$(count_hits "$duration" "$cmd" -- "$class" | grep "total = hits" | awk '{print $NF}') printf "%-20s | %-10s\n" "$class" "$result" done #result=3D$(count_hits "$duration" "$cmd" -- "FOO" | grep "total hits" = | awk '{print $NF}') #printf "%-20s | %-10s\n" "$class" "$result" } [ $SHLVL =3D=3D 2 -a -n "$*" ] && echo " doing: $* in $PWD" #>&2 if [ $SHLVL =3D=3D 2 ]; then # run args as cmd $@ fi --- include/linux/dynamic_debug.h | 54 ++++++++++++++++++++++++++++++++-------= ---- lib/dynamic_debug.c | 54 +++++++++++++++++++++++++++++++++++++++= ---- 2 files changed, 91 insertions(+), 17 deletions(-) diff --git a/include/linux/dynamic_debug.h b/include/linux/dynamic_debug.h index d94ad3a2018a..55abe0dc275a 100644 --- a/include/linux/dynamic_debug.h +++ b/include/linux/dynamic_debug.h @@ -49,6 +49,10 @@ struct _ddebug { #define _DPRINTK_FLAGS_INCL_TID (1<<4) #define _DPRINTK_FLAGS_INCL_SOURCENAME (1<<5) #define _DPRINTK_FLAGS_INCL_STACK (1<<6) +#define _DPRINTK_FLAGS_COUNT (1<<7) + +#define _DPRINTK_FLAGS_ENABLED (_DPRINTK_FLAGS_PRINT | _DPRINTK_FLAGS_COUN= T) +#define _DPRINTK_FLAGS_ACTIVE (_DPRINTK_FLAGS_PRINT) =20 #define _DPRINTK_FLAGS_INCL_ANY \ (_DPRINTK_FLAGS_INCL_MODNAME | _DPRINTK_FLAGS_INCL_FUNCNAME |\ @@ -383,28 +387,44 @@ void __dynamic_ibdev_dbg(struct _ddebug *descriptor, =20 #define _DPRINTK_KEY_INIT .key.dd_key_true =3D (STATIC_KEY_TRUE_INIT) =20 -#define DYNAMIC_DEBUG_BRANCH(descriptor) \ - static_branch_likely(&descriptor.key.dd_key_true) +#define __DYNAMIC_DEBUG_BRANCH(descriptor) \ + static_branch_likely(&(descriptor).key.dd_key_true) #else #define _DPRINTK_KEY_INIT .key.dd_key_false =3D (STATIC_KEY_FALSE_INIT) =20 -#define DYNAMIC_DEBUG_BRANCH(descriptor) \ - static_branch_unlikely(&descriptor.key.dd_key_false) +#define __DYNAMIC_DEBUG_BRANCH(descriptor) \ + static_branch_unlikely(&(descriptor).key.dd_key_false) #endif =20 #else /* !CONFIG_JUMP_LABEL */ =20 #define _DPRINTK_KEY_INIT =20 +#ifdef DEBUG +#define __DYNAMIC_DEBUG_BRANCH(descriptor) \ + likely((descriptor).flags & _DPRINTK_FLAGS_ENABLED) +#else +#define __DYNAMIC_DEBUG_BRANCH(descriptor) \ + unlikely((descriptor).flags & _DPRINTK_FLAGS_ENABLED) +#endif + +#endif /* CONFIG_JUMP_LABEL */ + #ifdef DEBUG #define DYNAMIC_DEBUG_BRANCH(descriptor) \ - likely(descriptor.flags & _DPRINTK_FLAGS_PRINT) + (__DYNAMIC_DEBUG_BRANCH(descriptor) && \ + likely((descriptor).flags & _DPRINTK_FLAGS_ACTIVE)) #else #define DYNAMIC_DEBUG_BRANCH(descriptor) \ - unlikely(descriptor.flags & _DPRINTK_FLAGS_PRINT) + (__DYNAMIC_DEBUG_BRANCH(descriptor) && \ + unlikely((descriptor).flags & _DPRINTK_FLAGS_ACTIVE)) #endif =20 -#endif /* CONFIG_JUMP_LABEL */ +void ddebug_increment_call_count(void); +#define DYNAMIC_DEBUG_COUNT(descriptor) { \ + if (unlikely(descriptor.flags & _DPRINTK_FLAGS_COUNT)) \ + ddebug_increment_call_count(); \ + } =20 /* * Factory macros: ($prefix)dynamic_func_call($suffix) @@ -417,11 +437,15 @@ void __dynamic_ibdev_dbg(struct _ddebug *descriptor, * (|_cls): adds in _DPRINT_CLASS_DFLT as needed * (|_no_desc): former gets callsite descriptor as 1st arg (for prdbgs) */ + #define __dynamic_func_call_cls(id, cls, fmt, func, ...) do { \ DEFINE_DYNAMIC_DEBUG_METADATA_CLS(id, cls, fmt); \ - if (DYNAMIC_DEBUG_BRANCH(id)) { \ - func(&id, ##__VA_ARGS__); \ - __dynamic_dump_stack(id); \ + if (__DYNAMIC_DEBUG_BRANCH(id)) { \ + DYNAMIC_DEBUG_COUNT(id); \ + if (id.flags & _DPRINTK_FLAGS_ACTIVE) { \ + func(&id, ##__VA_ARGS__); \ + __dynamic_dump_stack(id); \ + } \ } \ } while (0) #define __dynamic_func_call(id, fmt, func, ...) \ @@ -430,9 +454,12 @@ void __dynamic_ibdev_dbg(struct _ddebug *descriptor, =20 #define __dynamic_func_call_cls_no_desc(id, cls, fmt, func, ...) do { \ DEFINE_DYNAMIC_DEBUG_METADATA_CLS(id, cls, fmt); \ - if (DYNAMIC_DEBUG_BRANCH(id)) { \ - func(__VA_ARGS__); \ - __dynamic_dump_stack(id); \ + if (__DYNAMIC_DEBUG_BRANCH(id)) { \ + DYNAMIC_DEBUG_COUNT(id); \ + if (id.flags & _DPRINTK_FLAGS_ACTIVE) { \ + func(__VA_ARGS__); \ + __dynamic_dump_stack(id); \ + } \ } \ } while (0) #define __dynamic_func_call_no_desc(id, fmt, func, ...) \ @@ -525,6 +552,7 @@ void __dynamic_ibdev_dbg(struct _ddebug *descriptor, #define DYNAMIC_DEBUG_CLASSMAP_PARAM_REF(_name, _bits, _var, _flags) \ module_param_named(_name, _bits, uint, 0600) #define DEFINE_DYNAMIC_DEBUG_METADATA(name, fmt) +#define __DYNAMIC_DEBUG_BRANCH(descriptor) false #define DYNAMIC_DEBUG_BRANCH(descriptor) false #define DECLARE_DYNDBG_CLASSMAP(...) =20 diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c index 406b64d67440..bdc6d32ec685 100644 --- a/lib/dynamic_debug.c +++ b/lib/dynamic_debug.c @@ -19,12 +19,14 @@ #include #include #include +#include #include #include #include #include #include #include + #include #include #include @@ -71,6 +73,21 @@ struct flag_settings { unsigned int mask; }; =20 +static DEFINE_PER_CPU(unsigned long, ddebug_call_count); +void ddebug_increment_call_count(void) +{ + this_cpu_inc(ddebug_call_count); +} +EXPORT_SYMBOL(ddebug_increment_call_count); + +static void reset_ddebug_call_count(void) +{ + int cpu; + + for_each_possible_cpu(cpu) + per_cpu(ddebug_call_count, cpu) =3D 0; +} + static bool ddebug_class_map_in_range(const int class_id, const struct ddebug_class_map *map); static bool ddebug_class_user_in_range(const int class_id, @@ -101,6 +118,7 @@ static const struct { unsigned flag:8; char opt_char; }= opt_array[] =3D { { _DPRINTK_FLAGS_INCL_LINENO, 'l' }, { _DPRINTK_FLAGS_INCL_TID, 't' }, { _DPRINTK_FLAGS_INCL_STACK, 'd' }, + { _DPRINTK_FLAGS_COUNT, 'c' }, { _DPRINTK_FLAGS_NONE, '_' }, }; =20 @@ -365,10 +383,10 @@ static int ddebug_change(const struct ddebug_query *q= uery, struct flag_settings if (newflags =3D=3D dp->flags) continue; #ifdef CONFIG_JUMP_LABEL - if (dp->flags & _DPRINTK_FLAGS_PRINT) { - if (!(newflags & _DPRINTK_FLAGS_PRINT)) + if (dp->flags & _DPRINTK_FLAGS_ENABLED) { + if (!(newflags & _DPRINTK_FLAGS_ENABLED)) static_branch_disable(&dp->key.dd_key_true); - } else if (newflags & _DPRINTK_FLAGS_PRINT) { + } else if (newflags & _DPRINTK_FLAGS_ENABLED) { static_branch_enable(&dp->key.dd_key_true); } #endif @@ -727,6 +745,11 @@ static int ddebug_exec_queries(char *query, const char= *modname) if (!query || !*query || *query =3D=3D '#') continue; =20 + if (!strcmp(query, "reset_stats")) { + reset_ddebug_call_count(); + continue; + } + if (modname) v2pr_info("query %d: module %s \"%s\"\n", i, modname, query); else @@ -980,6 +1003,9 @@ void __dynamic_pr_debug(struct _ddebug *descriptor, co= nst char *fmt, ...) BUG_ON(!descriptor); BUG_ON(!fmt); =20 + if (!(descriptor->flags & _DPRINTK_FLAGS_ACTIVE)) + return; + va_start(args, fmt); =20 vaf.fmt =3D fmt; @@ -1000,6 +1026,9 @@ void __dynamic_dev_dbg(struct _ddebug *descriptor, BUG_ON(!descriptor); BUG_ON(!fmt); =20 + if (!(descriptor->flags & _DPRINTK_FLAGS_ACTIVE)) + return; + va_start(args, fmt); =20 vaf.fmt =3D fmt; @@ -1031,6 +1060,9 @@ void __dynamic_netdev_dbg(struct _ddebug *descriptor, BUG_ON(!descriptor); BUG_ON(!fmt); =20 + if (!(descriptor->flags & _DPRINTK_FLAGS_ACTIVE)) + return; + va_start(args, fmt); =20 vaf.fmt =3D fmt; @@ -1067,6 +1099,9 @@ void __dynamic_ibdev_dbg(struct _ddebug *descriptor, struct va_format vaf; va_list args; =20 + if (!(descriptor->flags & _DPRINTK_FLAGS_ACTIVE)) + return; + va_start(args, fmt); =20 vaf.fmt =3D fmt; @@ -1106,6 +1141,7 @@ static __init int dyndbg_setup(char *str) =20 __setup("dyndbg=3D", dyndbg_setup); =20 + /* * File_ops->write method for /dynamic_debug/control. Gathers the * command text from userspace, parses and executes it. @@ -1263,6 +1299,16 @@ static const char *ddebug_class_name(struct _ddebug_= info *di, struct _ddebug *dp return NULL; } =20 +static unsigned long get_ddebug_call_count(void) +{ + unsigned long total =3D 0; + int cpu; + + for_each_possible_cpu(cpu) + total +=3D per_cpu(ddebug_call_count, cpu); + return total; +} + /* * Seq_ops show method. Called several times within a read() * call from userspace, with ddebug_lock held. Formats the @@ -1282,7 +1328,7 @@ static int ddebug_proc_show(struct seq_file *m, void = *p) return 0; } if (p =3D=3D EPILOGUE_TOKEN) { - /* use this soon */ + seq_printf(m, "#: total call-counts: %lu\n", get_ddebug_call_count()); return 0; } =20 --=20 2.55.0 From nobody Fri Sep 25 04:43:45 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 112B9538D65; Wed, 16 Sep 2026 15:33:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789572784; cv=none; b=M7tlBnOblkZEB3k1gjcFNlL/KC7+IEJYfnov3xv52f9jbzUAgJ2AGrXfNywfovquTK9wKRabK1pyyKPEHof5iVQlj7ioRdoP41iHcUaAdAKfJIBaRN1acldjy19TKh5Xgvfn8VeRywiWEJ+dEZnzXsCPpahi1KYdb/3cIKRF90M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789572784; c=relaxed/simple; bh=G1e93JLYIeHbZ3shQqr2lfvKOb15ncKTvdp7EKGbQPA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=AnN05F0HjCgJZH29vTDIOrkPifGoVl26ZYAMzsvQyxxzONQHb7HtvOGKjuaGIKIIZE1w/MmfPFKWMxFRRunKTKoIcq0Zs0McyDrhE7xtRBpfwBo2WlrdwXZ9M0X4HlP82nkkPREM/gNs0KT1aRL/SHXUodx9rzErdC+/pQ8lb5Q= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=pBVJRquW; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="pBVJRquW" Received: by smtp.kernel.org (Postfix) with ESMTPS id 8D757C4AF0F; Wed, 16 Sep 2026 15:33:03 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1789572783; bh=G1e93JLYIeHbZ3shQqr2lfvKOb15ncKTvdp7EKGbQPA=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=pBVJRquWq8kLnmusxXWgw7tIDTXeY56qkOaRhVVe5qCmsByNyicYel5E8KSGVI2a9 pwtb3SR1hMhkKx869sC4mfV00bpEUtZBv1ycsiklw7klpqbbpJC9JBzP/f6Xm7REcC 0CyMHt5Dfw97Xyx4KSJi/xiv6AdPJ2GaK2wEZ32K7bZOtUQ/shjJtJlaV9ZgGcHFpv X9vcR4h4sM4SlD32tJp47B/YJ9zM/ZWCg8VenxnC7ta/0bc0iefGMpDrQdPJqwqugE YUDC9cNONjByeNh8tNVKjYQYjJXsLTOMX4huvlLbk/3deY9dTlsBLIefS7eFjndbLf 0y48cXEwQPjXQ== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 7995CC982CF; Wed, 16 Sep 2026 15:33:03 +0000 (UTC) From: Jim Cromie via B4 Relay Date: Wed, 16 Sep 2026 09:33:30 -0600 Subject: [PATCH v10 38/38] dyndbg: add DEBUG-biased fallback stubs for _dynamic_func_call_cls Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260916-dd-cmap-part2-clean-v10-38-af4cf4767707@gmail.com> References: <20260916-dd-cmap-part2-clean-v10-0-af4cf4767707@gmail.com> In-Reply-To: <20260916-dd-cmap-part2-clean-v10-0-af4cf4767707@gmail.com> To: Jason Baron , Shuah Khan , Andrew Morton , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Arnd Bergmann , Luis Chamberlain , Petr Pavlu , Daniel Gomez , Sami Tolvanen , Aaron Tomlin , Jonathan Corbet , Greg Kroah-Hartman , Nathan Chancellor , Nicolas Schier , Shuah Khan , Randy Dunlap , "Rafael J. Wysocki" , Pavel Machek , Len Brown Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-arch@vger.kernel.org, linux-modules@vger.kernel.org, linux-doc@vger.kernel.org, linux-kbuild@vger.kernel.org, linux-pm@vger.kernel.org, Jim Cromie , kernel test robot X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789572777; l=2698; i=jim.cromie@gmail.com; s=20260203; h=from:subject:message-id; bh=Hqt4H/yLDyArtGauEPbVmb8rC+Dx/wzfM98i13kibjg=; b=YV7bSfgSweSi9dTMBz1wf5Apot/Xgx+SIb2AQa3lBeFfHEV4oRMoDNegLq1gkPbJKIco/HOKA 7d0yDGEheurBgeOUyI5v2MT5uVWDVbpsJISUFO29ynoDZ1M3YYY3nyc X-Developer-Key: i=jim.cromie@gmail.com; a=ed25519; pk=C6E5ODlPQo7ZBynATXH9wg7K6HxP0pIXyf4s38Qw0XE= X-Endpoint-Received: by B4 Relay for jim.cromie@gmail.com/20260203 with auth_id=958 X-Original-From: Jim Cromie Reply-To: jim.cromie@gmail.com From: Jim Cromie When the dynamic debug core is enabled (CONFIG_DYNAMIC_DEBUG_CORE=3Dy) but the global CONFIG_DYNAMIC_DEBUG is disabled, subsystems can opt-in to dynamic debug by defining DYNAMIC_DEBUG_MODULE. However, for built-in code (like DRM core) where DYNAMIC_DEBUG_MODULE is not defined, the macros fall back to the disabled #else block in include/linux/dynamic_debug.h. In this block, the family of _dynamic_func_call_cls macros were completely undefined. This caused build failures (implicit declarations) in subsystems (like DRM) that attempt to use these macros to wrap their own debug functions even when dynamic debug is disabled. Add stub definitions that mirror the enabled behavior and respect the DEBUG macro, similar to pr_debug. If DEBUG is defined, they inject NULL as the first argument (to satisfy the expected descriptor pointer) and pass the arguments through, allowing the wrapped function's own slow-path fallback logic to execute. If DEBUG is not defined, they use an if (0) statement-expression to compile out the call while returning 0, achieving zero overhead while maintaining compile-time argument checking. Reported-by: kernel test robot Closes: https://lore.kernel.org/oe-kbuild-all/202605201408.x1sHT6fx-lkp@int= el.com/ Assisted-by: Gemini-CLI:gemini-2.5-pro Signed-off-by: Jim Cromie --- include/linux/dynamic_debug.h | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/include/linux/dynamic_debug.h b/include/linux/dynamic_debug.h index 55abe0dc275a..a04e546079d8 100644 --- a/include/linux/dynamic_debug.h +++ b/include/linux/dynamic_debug.h @@ -556,6 +556,23 @@ void ddebug_increment_call_count(void); #define DYNAMIC_DEBUG_BRANCH(descriptor) false #define DECLARE_DYNDBG_CLASSMAP(...) =20 +#if defined(DEBUG) +#define _dynamic_func_call_cls(cls, fmt, func, ...) \ + do { func(NULL, ##__VA_ARGS__); } while (0) +#define _dynamic_func_call_cls_no_desc(cls, fmt, func, ...) \ + do { func(__VA_ARGS__); } while (0) +#else +#define _dynamic_func_call_cls(cls, fmt, func, ...) \ + do { if (0) func(NULL, ##__VA_ARGS__); } while (0) +#define _dynamic_func_call_cls_no_desc(cls, fmt, func, ...) \ + do { if (0) func(__VA_ARGS__); } while (0) +#endif + +#define _dynamic_func_call(fmt, func, ...) \ + _dynamic_func_call_cls(_DPRINTK_CLASS_DFLT, fmt, func, ##__VA_ARGS__) +#define _dynamic_func_call_no_desc(fmt, func, ...) \ + _dynamic_func_call_cls_no_desc(_DPRINTK_CLASS_DFLT, fmt, func, ##__VA_ARG= S__) + #define dynamic_pr_debug(fmt, ...) \ no_printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__) #define dynamic_dev_dbg(dev, fmt, ...) \ --=20 2.55.0