From nobody Sun Feb 8 07:58:43 2026 Received: from mail-ot1-f65.google.com (mail-ot1-f65.google.com [209.85.210.65]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2D7C32F3632 for ; Wed, 14 Jan 2026 01:58:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.65 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768355930; cv=none; b=tI1O5b971i/y3isNSFbVcdOEirzbKJ5s02ReUy4VSFXjclkiz7PxHzVqtv5z+q4SygAKC2CwcY8tGDjrIpMW+G1b1YkFCMCzDhtLdsSbirbuyAxXeEAAM7vW27B3J/yNaiVdDWgqA1Vmcisyqt4cjl9CjDFKHKWL2bhhRraA7k4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768355930; c=relaxed/simple; bh=J1eDk9ZVPw8FZKq7NBfxm7axQ7Jd97Z9A2H46UDDwHk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=A9o8oOsxHZ21kPLO7yDpFAsvr7Dj39P+dPC1TETWJf8/Hksx3S0jtB11YPdjSUdCtG05jX5BSkblW+BE9uNI905s7jcBedTcElWNOrKkigDtir0ByFoUWF6CkjALlNSN5YZqg8QbjaeDbcYK7MbVkhgzkXBxMm1mS7C7bt0upJc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=NzkkMq6D; arc=none smtp.client-ip=209.85.210.65 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="NzkkMq6D" Received: by mail-ot1-f65.google.com with SMTP id 46e09a7af769-7c7613db390so5003707a34.2 for ; Tue, 13 Jan 2026 17:58:48 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1768355928; x=1768960728; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=6JUGCGjJm2Xj6X5n/nhoMCGHMBetXjpQki6LB/h6PNI=; b=NzkkMq6DKrxBwdDJbQF0KXJ/Bv6fpmu9qaNiJSRckfj+g7zGirqdj65Wyqo9MjA+ZG PEje0Z8fjUh2ZO4fC70tmut7UC1vGuJhQnsSuNLbm0reuG6OWE7SWLQv9CB/SGSaqooU yX2N7emaRSj5MDc+pkaJBR6RYmE8vRCm+LHfWUDkUGTyiFksdAfcQClSTX/quofom7UY zdDKP7aRztU1VgncBlciIRrnvpe48F1+i6TDgBypUQT2BRw7MGXgcP2i4a9nrRCyfUou k+ONxJ3G2XVRrrwVWHaFJyylxG6+rAHfcUVrtg9HSY7Ct/Hg7cmKhfexeUlE6sodO5tW Z++g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768355928; x=1768960728; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=6JUGCGjJm2Xj6X5n/nhoMCGHMBetXjpQki6LB/h6PNI=; b=caUwPiN98PZXG3KoUmVbYQrdD2TMT9je8HW3rG8jUwq8yVH3NFP7dxBUx9ogLT5bLj pyo7YOvbvir6CccOVEF7sQ5YnKLZyZIdqXVCZ3xzXpe+LqA7npyJmul4/lWb7ivyH02x AQiLFVW322sPBIY/WOo0hrDMolFLjnBdTsGsq3+BXHTx++EyGCKQhiKrlllkxG31gSFW ylpUhaBVt4cThSZvWqUlpasuz/ygr66HOIXU5juVbfL9XQzUub3jsCMjFL3a9L1hkz2p 6HB1U8Sfma2krMLvCZzNdtH0tU6JvUjFMj3PHxx0v6dyybqjW+ijWgB/GNkhMjqE2lnv bDiw== X-Forwarded-Encrypted: i=1; AJvYcCUE61LzTt0Cqp5GODPdRGKp1r9sYb7gWLwYAFqkFAco2QGVQHJHimw9PNsKF1VhjnR0K3XV5H4I2ETY7oo=@vger.kernel.org X-Gm-Message-State: AOJu0YzaMFjJFrsUzePeNTCiRk8aVGArZaWE/ib9+pQpAMXp9Nlv3I8X a1M0azIEw/jRFkP3e7GY8Kjaa8ak2UC8cLf5ILlxZ6P3ATaknD9dfGZbaL9zK7u5CG6eDw== X-Gm-Gg: AY/fxX5KDsj27H4hm3CegdlJwodCBIdt4Mcv7HYyb8KKq56RxqlwSUoqFW5ctn65YLc PMX+iyyI/s3iOG+kb4Btb1Kk86EYggeQZkWHnW5tQnDsrvbjgLt99OHQcVMtmRqtpZI/PzHDAW1 tA10EEzWGv+wQ4SD8E3ZRSTc/lBLsSTwtEJ2A8K6WSaDDdlZ8KCduX8MID7mSJnDoOPIFvC0eez A4r/k7uhGmH/ZS8ROavHTluAYNrr4X++QMaQVgbsRzvD7IA+y3ZprwJLmd5Puqp8GJxXmRVrXt2 u/u4qjuhJOr/abFj5rOVe/VluLIHWGebXnicmj35vrk8k+KTsIRhSKNV809ihzqfo8M7xsYgz1Z wTdUtKJToARyY8g2i83i2s4c0A9RdQKUyTKBuLZCFdiQxCNS6+9+MhZdCBMBanOYf0qASYwWwGG N+8aAed8RD4Cr28SIhfL79TRF+pw9QVD9q+6oC X-Received: by 2002:a9d:708f:0:b0:7c7:8280:9206 with SMTP id 46e09a7af769-7cfcb6b1274mr339324a34.38.1768355927952; Tue, 13 Jan 2026 17:58:47 -0800 (PST) Received: from frodo (c-98-38-17-99.hsd1.co.comcast.net. [98.38.17.99]) by smtp.googlemail.com with ESMTPSA id 46e09a7af769-7ce4781c447sm16782299a34.9.2026.01.13.17.58.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 13 Jan 2026 17:58:47 -0800 (PST) From: Jim Cromie To: gregkh@linuxfoundation.org, linux-kernel@vger.kernel.org Cc: Jim Cromie , Jason Baron , =?UTF-8?q?=C5=81ukasz=20Bartosik?= , Louis Chauvet , Bagas Sanjaya , Dave Airlie , Daniel Vetter , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , dri-devel@lists.freedesktop.org, Petr Mladek , Shuah Khan , linux-doc@vger.kernel.org, Steven Rostedt , "Liam R. Howlett" Subject: [PATCH v8 01/31] dyndbg: factor ddebug_match_desc out from ddebug_change Date: Tue, 13 Jan 2026 18:57:17 -0700 Message-ID: <20260114015815.1565725-2-jim.cromie@gmail.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260114015815.1565725-1-jim.cromie@gmail.com> References: <20260114015815.1565725-1-jim.cromie@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" 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 --- lib/dynamic_debug.c | 83 +++++++++++++++++++++++++-------------------- 1 file changed, 47 insertions(+), 36 deletions(-) diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c index 5a007952f7f2..eb5146bcfaca 100644 --- a/lib/dynamic_debug.c +++ b/lib/dynamic_debug.c @@ -171,6 +171,52 @@ 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; + + /* 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) { @@ -203,42 +249,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.52.0 From nobody Sun Feb 8 07:58:43 2026 Received: from mail-ot1-f68.google.com (mail-ot1-f68.google.com [209.85.210.68]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CEDB32F3620 for ; Wed, 14 Jan 2026 01:58:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.68 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768355934; cv=none; b=cPP7WKr0+cLRjpQMAzVTgMtv0d9aXJTFWyPHWzo7/xDVPCcWQWUTvODJJQPw5XrlEjUnVTSbVyN63NGcqyE28c337Sm4j7SFvXYGYQ0KUurx+gW8ck0e46P42h59oc9xXfoxIEYH8eIZHJ8M43mKjH1Obd79TRfQa0dOpx8qb7w= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768355934; c=relaxed/simple; bh=qcJ9WTVfS0uIhrALRso7IA2CF/K5hLrMPEervT/QQok=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=FiOKnEEZnwPNueGbDcp4jV9ac2uKFafG5LKoJq6f+Ccrv4RXY7gdmQy1E1+7y/jOV6FuxrHeF9CENvJOTZIcZfwayFkhZi58qCAtZAte8rzTfS7j4ZvYfCDvQ9evL9igS/fLDGuDanfwOW2TPQeuSs+o46bsPKvChOS3PoBMQxs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=F4TP4YOb; arc=none smtp.client-ip=209.85.210.68 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="F4TP4YOb" Received: by mail-ot1-f68.google.com with SMTP id 46e09a7af769-7c7660192b0so5798261a34.0 for ; Tue, 13 Jan 2026 17:58:52 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1768355932; x=1768960732; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=8i2B8ufAHD9sSahBAZkEx2yO1Ly/YjHLa83EmimubvQ=; b=F4TP4YObB0sTRljRjnPa4bn148Ydgc7cCZathvFMZxSGlOBrYOo5wDXXICWBXJRhFI TTFDg9FFB5b2wiFCk3Kyr7YAfG2m52pO8lEcdRan+jT2OUBRROdOSsbNSQiVz0oJtSRG zwqzmikELmJOExjhvPzmvuV7FDK82VU9SFWT6E9kZW9ACQKfaVCD0VNOkzFWw61hyMCz oe/3VfYXgWFgnBI6+zUKa6b0sfQfi4RcnD7H6cNI7rT0nHQY3ePGmC5wmCSoaD+sklk9 bTB54h5DSMW/YcckExIUKrDv8QZTuQifVBBO58SwQ26RNPbNDzHDDRPL4V7slEjL4H2H DvXw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768355932; x=1768960732; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=8i2B8ufAHD9sSahBAZkEx2yO1Ly/YjHLa83EmimubvQ=; b=T7p1H7IPU0I2Mtd6d2u+GqWJbXZ3W+z2ZLVUjmhgTQllQ4iM2tVHH7Dkx/gF7p2SKR EomA0ZpWn3707a3msye57wjcNdz/OPyABVdmGATHg8N+FKrh6zCsuE8i9kqpcfM+s3Rg TCJziZX0FS4AEq5HGmOmWvxIb2tzT86IBnem7nwtAwJszEudwW4xpBW2xYUZ4+dW+I7b KQuli1H2Q3gsnR0ZL9Hjd7x7b17jopzArjlZ4i/9KwPrEB9E0LwOJegbhUXxjZfn8RkO 1uaZ7uDtWrybD/KO0nETM3+TCDHeyDDN2gfGmmolx51xg2R21mP0EAsTPeYlYaatLqnD K1SQ== X-Forwarded-Encrypted: i=1; AJvYcCUisbqw4ZhVyy+QFJgcn07gUC8k1zK1UpK+zsQMb54OqY7auSdP/hPdrsvsT7E8z9dLSdf5ON6iU/ZZlBM=@vger.kernel.org X-Gm-Message-State: AOJu0Yyg5DBSPNvUt+CH9tpLL1uFzIBvUV4kqA1I0H/6wmOliHsZwDws v6byFYUl/RBgzjQcwA5AApNd+3W/KUwvd8S2zwPY+bRb/UD28ABgILs6 X-Gm-Gg: AY/fxX6c4rCrGRi0YxTESoKp5aliat8HdcwpUsKSNTTlRQAuY+uHCB+J6wuGYPK/lOG wiolTBHdLH0oZOFypWXt4HXnzq3Gpe/D2jZTJOvVqOecNRSMzcvAM2McOKEPAciPmfTYBTJChx0 9bBs/6qIcAgCR2eyxqoUn6IOVh5NvSWl1VDq3LboJuBGB9pOVVWh5dle38+cna86gWbWVlUc355 Buot7Sk9wzQ+ev+s+c+dUwMtvxodVRX4t+t6RrMHcy6a7mlmHah0I/XJQuTvZgeGya6wo0w6Ybp IAFuVVdRVoYtg94fhykkaSrq8mp4QvczqJExmkrp6k+PM0+nEhuStyreg5ovptzoge1TeIof6vI L+V3a3dtvVtMAj3dd6R+n3MZ+9fMLXvZEuDf7YXUoCfABgloOuiG30vV3nD5tgyhgskXfXn3G0o cr6UusMFEKbbu1zNGFzocwED5+CECqc+lGmCOV X-Received: by 2002:a05:6830:3148:b0:7c6:cf19:1dec with SMTP id 46e09a7af769-7cfc8b73711mr1019391a34.33.1768355931685; Tue, 13 Jan 2026 17:58:51 -0800 (PST) Received: from frodo (c-98-38-17-99.hsd1.co.comcast.net. [98.38.17.99]) by smtp.googlemail.com with ESMTPSA id 46e09a7af769-7ce478d9c17sm17120860a34.22.2026.01.13.17.58.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 13 Jan 2026 17:58:51 -0800 (PST) From: Jim Cromie To: gregkh@linuxfoundation.org, linux-kernel@vger.kernel.org Cc: Jim Cromie , Jason Baron , =?UTF-8?q?=C5=81ukasz=20Bartosik?= , Louis Chauvet , Bagas Sanjaya , Dave Airlie , Daniel Vetter , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , dri-devel@lists.freedesktop.org, Petr Mladek , Shuah Khan , linux-doc@vger.kernel.org, Steven Rostedt , "Liam R. Howlett" Subject: [PATCH v8 02/31] dyndbg: add stub macro for DECLARE_DYNDBG_CLASSMAP Date: Tue, 13 Jan 2026 18:57:18 -0700 Message-ID: <20260114015815.1565725-3-jim.cromie@gmail.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260114015815.1565725-1-jim.cromie@gmail.com> References: <20260114015815.1565725-1-jim.cromie@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" 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 ff44ec346162..98a36e2f94b6 100644 --- a/include/linux/dynamic_debug.h +++ b/include/linux/dynamic_debug.h @@ -92,27 +92,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; @@ -137,6 +116,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 @@ -303,6 +303,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.52.0 From nobody Sun Feb 8 07:58:43 2026 Received: from mail-oa1-f43.google.com (mail-oa1-f43.google.com [209.85.160.43]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 090122F5A12 for ; Wed, 14 Jan 2026 01:58:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.160.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768355938; cv=none; b=c8s7HgNO4xaI2T9L05HPRZhLFXQCA4AonVfhp1GS+ashklyOHUffUPJNEdqnrwGfbD47/UDv/w3leicwwYKkTiVoDSvHlSqgBQhZsV9Ozh6EXB0h8OO9WldNdvwkqoNumsqqWYWd3mFaVmfXr8JQ/3UpJsxbJhwjkxZFROmYV9w= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768355938; c=relaxed/simple; bh=Dl6cNQBg3u7SGfQmdKJXxn3my2NuuDbw75ihDoc9xW4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=bd0dUFFHvBynudZhnu761CIck6vg3uPnn7ju8SspzHi/RUmM6ARiM1bAVlDFYfH2LvojPSpJnGZCnnXAssoOdxpWNMONwwhjY3fTlPwbm2F1wvaLT2ej6VKgx1m/mMbDggbOLh5+8EoltURF/7JiotlUd/AvXRynHcpolIarAHY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=YKvNYgJ7; arc=none smtp.client-ip=209.85.160.43 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="YKvNYgJ7" Received: by mail-oa1-f43.google.com with SMTP id 586e51a60fabf-3ec6c10a295so3646230fac.0 for ; Tue, 13 Jan 2026 17:58:56 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1768355936; x=1768960736; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=Oa5wcVDeV5J5v7vkbrVOxP4Roi/4nUDRF2hheke3WoM=; b=YKvNYgJ7pxNABYu3ET3TqbUOcbI4Cmtt5k4DjxlMUso2hWTF40mwZ0SWFc4rX2ozjR eTylGhosevmasLg0EB3QSTC/X+Jjn06AA8R33IdyRJsqDFMdK/BCAwP9nZmH8R9FfXxs bXPZmLrCYahULm2zO+u+BGSq46xuxfXJyXoDFxXA0E42aNWHsy2PV36o84T49d0ZAInf /ceNZmzoLKYrv4rM+D4DsKbCvkoxrORikR+xcMsxZHMZujthWhj8OeE4YqeZrjtuAlj2 MBlRQPATHkejTOpiSUYf3XTdLaqgMNnccY4cxb3FwEkr/wfFQd4cN5va5SGXeT80Sidy AjBg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768355936; x=1768960736; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=Oa5wcVDeV5J5v7vkbrVOxP4Roi/4nUDRF2hheke3WoM=; b=HBrvOHY+xllmF/y06PT8+zu3DXMvQWINtd6nkpOwDqBWHu9rBEvFoT7ChjfICyHLU6 YCml1n/GI+NfDe2rUVI/740MXVxtisBbWZkIYm2lEYT0Um/05n3Gj67D/l9V9gLhsMdV qTaC8ND87HMP70pdH4fKnKOzuvDFkwUI2Wvft/vHLelfYPhLNA5rxfgFEcKmQZFYkiTj G+JXzFPsRXSIeHqK6MEgHYYzyUiRw5OviOaDSii9mk9/NijCTzSkuoWGS99W6hcssar7 TA84ric21IJFaZsi762HJcR9tXkMcGw3s4zaKZpyLyDGLqDa/5H2hONZlf2N6qcRriNI e+iw== X-Forwarded-Encrypted: i=1; AJvYcCWyhRMsNCmB61gfX100qdRgxmjMqWRf2U9D6QoKV++wMiY86D3jg9IY/g/k64+juVQ5RnaIV9CLakC4X20=@vger.kernel.org X-Gm-Message-State: AOJu0YzcAeedsmhXOSxLJ7OXgrwUF/DMoDQKH82frtTsHXIwnghyNZyE s5k3O7eWPmg8NQBirXf4r+ByTYl+69ccx+u313Gd/fcseYvvaa1MhRKc X-Gm-Gg: AY/fxX56i+h8sSBGxKRIIFs32EUuT0u9fbT9kGCLu4sh2GNBrdHC2iwd2Kwa+3ciMeD 9ep9i52ttyeSSugS/D8IxJJE8Ad8BPXiGmRKmQPuXl0PlWIWTelVFdFAx2/MkSo5jLaki/ahRqI JDFRQxeWiE5/U09XKqnGQuZNwS/1m8hBF2tEr7caIaKKF/suiWvSQcjNjS9HUIhfHS/LNW95qYd JZZonOA3+ZFu7H+rGG2/LOTt6bTyC2GHLm1kOHxc5UPq3mLE+jjQ5TMuAES6wxCWNNfeosOsIkN MXjT3QbwhFQmTiywbYOMGLx8tZsNtU5OGCcM595hZumVpO6ullPsVFi1lZiRvmIj7/CjULJXOlp cPcYrcHT/CAUSCWhAieagOeJZUpNJ7CZ05dJp+d2hrc2OWmkMRbL1V2ElmYWRFNtpHKJlbB/GDB DNxw0v/u4kJ7+SUTe965udaw/zi/4HN2+zq0EH X-Received: by 2002:a05:6870:3041:b0:3f1:6dce:b865 with SMTP id 586e51a60fabf-4040bffc5a7mr412510fac.28.1768355935829; Tue, 13 Jan 2026 17:58:55 -0800 (PST) Received: from frodo (c-98-38-17-99.hsd1.co.comcast.net. [98.38.17.99]) by smtp.googlemail.com with ESMTPSA id 586e51a60fabf-3ffa50722e9sm15400748fac.14.2026.01.13.17.58.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 13 Jan 2026 17:58:55 -0800 (PST) From: Jim Cromie To: gregkh@linuxfoundation.org, linux-kernel@vger.kernel.org Cc: Jim Cromie , Jason Baron , =?UTF-8?q?=C5=81ukasz=20Bartosik?= , Louis Chauvet , Bagas Sanjaya , Dave Airlie , Daniel Vetter , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , dri-devel@lists.freedesktop.org, Petr Mladek , Shuah Khan , linux-doc@vger.kernel.org, Steven Rostedt , "Liam R. Howlett" Subject: [PATCH v8 03/31] docs/dyndbg: update examples \012 to \n Date: Tue, 13 Jan 2026 18:57:19 -0700 Message-ID: <20260114015815.1565725-4-jim.cromie@gmail.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260114015815.1565725-1-jim.cromie@gmail.com> References: <20260114015815.1565725-1-jim.cromie@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" commit 47ea6f99d06e ("dyndbg: use ESCAPE_SPACE for cat control") changed the control-file to display format strings with "\n" rather than "\012". Update the docs to match the new reality. Reviewed-by: Louis Chauvet Tested-by: Louis Chauvet Signed-off-by: Jim Cromie --- .../admin-guide/dynamic-debug-howto.rst | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/Documentation/admin-guide/dynamic-debug-howto.rst b/Documentat= ion/admin-guide/dynamic-debug-howto.rst index 7c036590cd07..4ac18c0a1d95 100644 --- a/Documentation/admin-guide/dynamic-debug-howto.rst +++ b/Documentation/admin-guide/dynamic-debug-howto.rst @@ -38,12 +38,12 @@ You can view the currently configured behaviour in the = *prdbg* catalog:: =20 :#> head -n7 /proc/dynamic_debug/control # filename:lineno [module]function flags format - init/main.c:1179 [main]initcall_blacklist =3D_ "blacklisting initcall %s= \012 - init/main.c:1218 [main]initcall_blacklisted =3D_ "initcall %s blackliste= d\012" - init/main.c:1424 [main]run_init_process =3D_ " with arguments:\012" - init/main.c:1426 [main]run_init_process =3D_ " %s\012" - init/main.c:1427 [main]run_init_process =3D_ " with environment:\012" - init/main.c:1429 [main]run_init_process =3D_ " %s\012" + init/main.c:1179 [main]initcall_blacklist =3D_ "blacklisting initcall %s= \n" + init/main.c:1218 [main]initcall_blacklisted =3D_ "initcall %s blackliste= d\n" + init/main.c:1424 [main]run_init_process =3D_ " with arguments:\n" + init/main.c:1426 [main]run_init_process =3D_ " %s\n" + init/main.c:1427 [main]run_init_process =3D_ " with environment:\n" + init/main.c:1429 [main]run_init_process =3D_ " %s\n" =20 The 3rd space-delimited column shows the current flags, preceded by a ``=3D`` for easy use with grep/cut. ``=3Dp`` shows enabled callsites. @@ -59,10 +59,10 @@ query/commands to the control file. Example:: =20 :#> ddcmd '-p; module main func run* +p' :#> grep =3Dp /proc/dynamic_debug/control - init/main.c:1424 [main]run_init_process =3Dp " with arguments:\012" - init/main.c:1426 [main]run_init_process =3Dp " %s\012" - init/main.c:1427 [main]run_init_process =3Dp " with environment:\012" - init/main.c:1429 [main]run_init_process =3Dp " %s\012" + init/main.c:1424 [main]run_init_process =3Dp " with arguments:\n" + init/main.c:1426 [main]run_init_process =3Dp " %s\n" + init/main.c:1427 [main]run_init_process =3Dp " with environment:\n" + init/main.c:1429 [main]run_init_process =3Dp " %s\n" =20 Error messages go to console/syslog:: =20 --=20 2.52.0 From nobody Sun Feb 8 07:58:43 2026 Received: from mail-oa1-f43.google.com (mail-oa1-f43.google.com [209.85.160.43]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 98AFD2F531F for ; Wed, 14 Jan 2026 01:59:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.160.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768355942; cv=none; b=Y1Ed9nJ9E3JO6lDBWdSsSNwb8j/W+XoK3CdyMb1r249BZNX6B2f9fTvFBxMIOqjViQlxFpqigOwcYIPMfxUvSEImDKW4WWb+WFRo7olDbOabPGu49AdteLR4SJuwhIkK4YRqZ/lexNjhmB8VM85zE2ND63NVZGIUApTWahyM5qA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768355942; c=relaxed/simple; bh=EqxGeITc2UKYaMAzZMDYQfg02UCHl3X6FUpCJ4R9urE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=r7v2Eqw5hkKC5Egg2knMU1U6LzC1Wz9cd3pD1WSTEf6XJgA84rJMRWX06zngkmsfLaDC8QuUHxRqlrPqH/NKtINEJV2YVwqkyW5m1RD+tr0vvk6fxzQnE2NMJu4zSEhxOj4lVGPbpFEVAKTos0mKD75o1g1LUd+VS1K3B3DEzdY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=B8vVebGi; arc=none smtp.client-ip=209.85.160.43 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="B8vVebGi" Received: by mail-oa1-f43.google.com with SMTP id 586e51a60fabf-3ffbfebae12so2700496fac.2 for ; Tue, 13 Jan 2026 17:59:00 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1768355940; x=1768960740; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=dFfaj1jg7DkAQbZ2xQqGZ0nerYqYJ2u1eC/UX4LEwiY=; b=B8vVebGiYhihD0QIhIsJgmdhmqh1SaFfiusq+xMbXalNPyNmIrXg3afpRis6xfqhAi 222xGjokB0CgddqX4gCFDfk0fd8y2nszCXU0CKhKnPI5LhZX/HiqXh/u42itp7waVF3v 4gzYXP4+cOHEI8nZpN2fPqri3Lq6/gII/Sw4o+xMxzoa38p+I934dkOfsrmO7rfXK8a8 f8s17AUJYG+aMRwReO3izqIu6gcLckDEntZsldvQt4Ncs7k0wlKYiZ0rOuPS7sTcUd3/ o+FO0q/cYLWG22Ynl/xsTsp70To/rf/wwrv+EaKsSDQi5kfg36OqVTjpSV3dbMh6cEne V7qg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768355940; x=1768960740; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=dFfaj1jg7DkAQbZ2xQqGZ0nerYqYJ2u1eC/UX4LEwiY=; b=jV9tvpvJxJ1LSSULq0X7XlzD7Wq90On02faMIREe+rgTSCFdUbrKaVUHFrjON8Zu06 I23U42zmN6+SIWee2YHM9gm5wrr2GzWCHFvcUrH16VAO2xrIvmMORXjvsIEI4hydckmP L7yYyef+9v71UtuJWGqZRAq4PNHgid+2drPP7bOHAUnBE5dmHNFsnzIPDKr7fWsBhdGR 7MWplNcaWVd+nocdYaRkUblRXIohCYSUtymfNV0bT+8nDR2wzAeui5fl0c2RUg4ilVVj K20x/Cn+K02OUr6KRCKqN9nvz3FkH1jDMH2uni4XmjN+/gGjdkovZ3T/Wp4mANqLUXKx S2pA== X-Forwarded-Encrypted: i=1; AJvYcCXzNwMWhl6XYIPQ/+70MqMr6OxXdkLnoxl7d/nwJH1ohIhwJWT6i4Z8efh4OAeLMEKzcq2OSPuCIRDrxGs=@vger.kernel.org X-Gm-Message-State: AOJu0YzAwwONjtCDSIWFA1kH3WfiFpLMu08r6ie3XFNlnkWsYgMBd3WL 1iV72exzJzbS1md+I0OHm5sI/xqtenraAjH0ttvocbFvLt13ivm3Uyvp X-Gm-Gg: AY/fxX7NV5F8rhqjZduWlj/EWZ50WV54ejeKHtXHpwqa5mbAx9Kw4A4uD/a58sCUpEB j5kj6il1dysLyRcTLBtrNL4Skk9rwwug41ya/Xv1wlIOUeb0Bx7XmUIOX5gVJGkzFzZsbjKJLDh 7nv9+Xki1Cl5hCSMl2hQHuzjkv3owP1W+MkYwZYB7rYIFM/tDx2vh8LlhpdmwLOiUq+jjxMJSgW jcw905Jf+F18kxzgNITv+xFOcarhjxNjzyavBVSZEto6u1JwX2mHH28yzM14D2JPzyyKwSV+U76 VSGXZmLqwMSTlk2Rsuy/3FE+gEAK66o7WFCRcwTkPdQkosT8Z91me+I91QYMiR6Iym4A8I/KsC3 GTGNi47UGKX52IcjLpdBEXmR08OmPVQl4NRoQBpn7s1393GAWMZV727xk9OrAImat+5lfZuwxBd Da6jbnIX2MXJUiSyKfsJleLP7yD4h5C682HUfg X-Received: by 2002:a05:687c:409c:b0:3f5:d9b0:567e with SMTP id 586e51a60fabf-4040ba70e63mr407331fac.14.1768355939842; Tue, 13 Jan 2026 17:58:59 -0800 (PST) Received: from frodo (c-98-38-17-99.hsd1.co.comcast.net. [98.38.17.99]) by smtp.googlemail.com with ESMTPSA id 586e51a60fabf-3ffa4e3e844sm15596198fac.9.2026.01.13.17.58.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 13 Jan 2026 17:58:59 -0800 (PST) From: Jim Cromie To: gregkh@linuxfoundation.org, linux-kernel@vger.kernel.org Cc: Jim Cromie , Jason Baron , =?UTF-8?q?=C5=81ukasz=20Bartosik?= , Louis Chauvet , Bagas Sanjaya , Dave Airlie , Daniel Vetter , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , dri-devel@lists.freedesktop.org, Petr Mladek , Shuah Khan , linux-doc@vger.kernel.org, Steven Rostedt , "Liam R. Howlett" Subject: [PATCH v8 04/31] docs/dyndbg: explain flags parse 1st Date: Tue, 13 Jan 2026 18:57:20 -0700 Message-ID: <20260114015815.1565725-5-jim.cromie@gmail.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260114015815.1565725-1-jim.cromie@gmail.com> References: <20260114015815.1565725-1-jim.cromie@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" When writing queries to >control, flags are parsed 1st, since they are the only required field, and they require specific compositions. So if the flags draw an error (on those specifics), then keyword errors aren't reported. This can be mildly confusing/annoying, so explain it instead. cc: linux-doc@vger.kernel.org Reviewed-by: Louis Chauvet Signed-off-by: Jim Cromie --- .../admin-guide/dynamic-debug-howto.rst | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/Documentation/admin-guide/dynamic-debug-howto.rst b/Documentat= ion/admin-guide/dynamic-debug-howto.rst index 4ac18c0a1d95..e76ccd987704 100644 --- a/Documentation/admin-guide/dynamic-debug-howto.rst +++ b/Documentation/admin-guide/dynamic-debug-howto.rst @@ -109,10 +109,19 @@ The match-spec's select *prdbgs* from the catalog, up= on which to apply the flags-spec, all constraints are ANDed together. An absent keyword is the same as keyword "*". =20 - -A match specification is a keyword, which selects the attribute of -the callsite to be compared, and a value to compare against. Possible -keywords are::: +Note that since the match-spec can be empty, the flags are checked 1st, +then the pairs of keyword and value. Flag errs will hide keyword errs:: + + bash-5.2# ddcmd mod bar +foo + dyndbg: read 13 bytes from userspace + dyndbg: query 0: "mod bar +foo" mod:* + dyndbg: unknown flag 'o' + dyndbg: flags parse failed + dyndbg: processed 1 queries, with 0 matches, 1 errs + +So a match-spec is a keyword, which selects the attribute of the +callsite to be compared, and a value to compare against. Possible +keywords are:: =20 match-spec ::=3D 'func' string | 'file' string | --=20 2.52.0 From nobody Sun Feb 8 07:58:43 2026 Received: from mail-oi1-f193.google.com (mail-oi1-f193.google.com [209.85.167.193]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D860D2F6184 for ; Wed, 14 Jan 2026 01:59:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.193 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768355946; cv=none; b=h4ctkUIFtcZbX6Fybdu7fDkH7yePY9NRbuT8D04rPmhcA3cC4Bov8tefsfuXeLqgCF8irz7Wue/yZz5J2VJuEhpI4TH/FMGE9rxhJTCOYrWTqITm4KTJIcMGrPmH+H5iONiMvjmOOfWKUeIfZagUQFCm3Ii8FZBKuZrGZwzpDKM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768355946; c=relaxed/simple; bh=fM95hmZ04ed6zy8idewI3EL31tuL2KItDxeKe01AAec=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=GFJZeXEDNiRMqMhZnSUQ2LNYt8/h1HnSX/mOn4WCCLFTtwH5z5erxtoPJmCEiyaS3DUJIoNPO2GH+aQFoUc0He0uDDPxBhR09ow1RQbFhZB0XjQm37wi7ZVdMytO+9QxWxN/pgmQ5kuGuvmySlRRCqi2+4jHPXIQESfedurW0p4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=F2P8o88E; arc=none smtp.client-ip=209.85.167.193 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="F2P8o88E" Received: by mail-oi1-f193.google.com with SMTP id 5614622812f47-459fa8b6044so5433212b6e.2 for ; Tue, 13 Jan 2026 17:59:04 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1768355944; x=1768960744; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=HpOUBSAqvR/6qLOY5JhuGvZqZpKLgLxKB67YbPHT84s=; b=F2P8o88EZ6FOol0KFM6oRgkUV+ZiBeg+RkJVqmm8I8ZxyqFpQTfS8iozFd1koz0ZXg RgD5xwNXHPMfa+cwy8FV9z7Rjhs2DBUUfcA63DUGCuEQL78M9gCS033+5FToMoCpGkt3 rlBq3p0Smmq1SvfuTs0E0lI2u+NynaDMzO6U4R+iumLju/5TVDqReftdeOE5rkZOQgRM hcc+RbnQIt4elku6/5F+vWgnqWQ9oMBhGeYYhmeVgx38y8V6FIgkRHsQeV6WOVVvPCfU 3UbgajGBiNs6xYZs80lz2XpQ2UpBDJRa4ksO9czL/jyAAAD4wxhh4eApEtDAaaCalgxk KUMw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768355944; x=1768960744; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=HpOUBSAqvR/6qLOY5JhuGvZqZpKLgLxKB67YbPHT84s=; b=qNBUsgL34tKDw1fS2XBSU0G2sHQ7i2ginlIB0Vlp00aZork+f3EP+5TMNxrv4dKsVV hteE3ykrW5g+dajSbiuB8gBtMP8ZyqmZCqe858obpdKnNN5PdHptjDXbl6uqdv6ungq0 6Q0CyR7rUf/8lPR7lW6p8xQNYuI0xV4tH3cohGI6e1XqR37/g1yoAPVGWViQtQ3FJOns 9rRN13wSfifgER5hMykQOHuHZzT6S1Btjc1Ee7eTnZnSpYuFV9ZsjMF0AhLYJF4mCO8I AI7d3z7CyTljFmTWVRGbvHmZtbn8YtzHY6y2QQzePDqf+v5jYi06L0JfwWeCrKheqer+ bACw== X-Forwarded-Encrypted: i=1; AJvYcCVfvZPMuuK2k/zeAPl2riWsxyoQ1davpFavOusKR7et/MgRxErn4nZKFaIoFfEGjPeoiKGqIXJuD5l0Z4g=@vger.kernel.org X-Gm-Message-State: AOJu0Ywr/0Pas+mpXC9MTnjoagve880TbBpM6TsafjgpHmJvF05jPsme za6DLE6fVi97ZkQsv1i/f8F/Rg4ELgRH5E2jhi2x7HQLHn2mZTZNRBmQ X-Gm-Gg: AY/fxX7bkYOdW+knHOGgYwaEWiRfin0QHfa6EYMoVKJEKRmjjYTgqvogy21EUgKMoP/ GOzvF2/3xiYLPubWAwSgFP6LELcMwFrpTQhYvYZVawhM8cH16zqFTNmhd4VLDrD+rPLJca+a+Ej kaUtQ0mjCLx6SXsAf0XnwbBuCQsU+1uQAmIUm0VtWvoE5VaTe+ZgUMwxk4SiyFAnFV0WHqwQfUg Ez5rDL05d8+PqoZnNdrMtz6jl8x+mYIFcdENmli3L0qQ9pWg2f1cXBnYYwt0Hcga8NVN4naz4o3 FB5RP4wl0WOdVLme+ItrsM2BuJTJAZxFQliwpkAxj111hHjgUvRnpc0gtfql0jxz+3bkZlY4dnH IIrH5exAfxYSqUrrkXxkOZ02Op8jN/08o/eGx37n4r1aAaU36kyxzuh1ZzV0kTcYDza+JE+UfIj MJnYqmMdDEqRr5+g2uenzn7+Uv45zh8L+KJ39a X-Received: by 2002:a05:6808:1785:b0:45a:a4b7:e5a9 with SMTP id 5614622812f47-45c71553f80mr625400b6e.61.1768355943758; Tue, 13 Jan 2026 17:59:03 -0800 (PST) Received: from frodo (c-98-38-17-99.hsd1.co.comcast.net. [98.38.17.99]) by smtp.googlemail.com with ESMTPSA id 5614622812f47-45a5dfb6256sm10704815b6e.0.2026.01.13.17.59.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 13 Jan 2026 17:59:03 -0800 (PST) From: Jim Cromie To: gregkh@linuxfoundation.org, linux-kernel@vger.kernel.org Cc: Jim Cromie , Jason Baron , =?UTF-8?q?=C5=81ukasz=20Bartosik?= , Louis Chauvet , Bagas Sanjaya , Dave Airlie , Daniel Vetter , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , dri-devel@lists.freedesktop.org, Petr Mladek , Shuah Khan , linux-doc@vger.kernel.org, Steven Rostedt , "Liam R. Howlett" Subject: [PATCH v8 05/31] test-dyndbg: fixup CLASSMAP usage error Date: Tue, 13 Jan 2026 18:57:21 -0700 Message-ID: <20260114015815.1565725-6-jim.cromie@gmail.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260114015815.1565725-1-jim.cromie@gmail.com> References: <20260114015815.1565725-1-jim.cromie@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" commit 6ea3bf466ac6 ("dyndbg: test DECLARE_DYNDBG_CLASSMAP, sysfs nodes") A closer look at test_dynamic_debug.ko logging output reveals a macro usage error: lib/test_dynamic_debug.c:105 [test_dynamic_debug]do_cats =3Dp "LOW msg\n" c= lass:MID lib/test_dynamic_debug.c:106 [test_dynamic_debug]do_cats =3Dp "MID msg\n" c= lass:HI lib/test_dynamic_debug.c:107 [test_dynamic_debug]do_cats =3D_ "HI msg\n" cl= ass unknown, _id:13 107 says: HI is unknown, and 105,106 have a LOW/MID and MID/HI skew. DECLARE_DYNDBG_CLASSMAP() _base arg must equal the enum's 1st value, in this case it was _base + 1. This leaves HI class un-selectable. NB: the macro could better validate its arguments. Reviewed-by: Louis Chauvet Tested-by: Louis Chauvet Signed-off-by: Jim Cromie --- lib/test_dynamic_debug.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/test_dynamic_debug.c b/lib/test_dynamic_debug.c index 77c2a669b6af..396144cf351b 100644 --- a/lib/test_dynamic_debug.c +++ b/lib/test_dynamic_debug.c @@ -75,7 +75,7 @@ DD_SYS_WRAP(disjoint_bits, p); DD_SYS_WRAP(disjoint_bits, T); =20 /* symbolic input, independent bits */ -enum cat_disjoint_names { LOW =3D 11, MID, HI }; +enum cat_disjoint_names { LOW =3D 10, MID, HI }; DECLARE_DYNDBG_CLASSMAP(map_disjoint_names, DD_CLASS_TYPE_DISJOINT_NAMES, = 10, "LOW", "MID", "HI"); DD_SYS_WRAP(disjoint_names, p); --=20 2.52.0 From nobody Sun Feb 8 07:58:43 2026 Received: from mail-oa1-f68.google.com (mail-oa1-f68.google.com [209.85.160.68]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C86882F12D9 for ; Wed, 14 Jan 2026 01:59:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.160.68 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768355950; cv=none; b=W0uRrr5t9gbaQinoR60aGVwpBBnrmmUxCy8dfeHFPVVpWgdqfcLZMwtbbD3Wz6paYvdF7JPPq/VudlQM3FQYD1t8gqdvxSzgJda0PEm5floLFrBCyRpVHmFTcf0dHxqXjwd9bJJ4YF+UIApwgcqRbI28BlGH0RJ/x5laHoiQO18= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768355950; c=relaxed/simple; bh=buhxBjHOVKorNueLk5sK7AoBcrC3h4riWAq7157uSMU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=DHropN/fnkOqV94vZ2VkkauG+jwtWJ4BllRt+uhmIi/fxJHr0z2oBYcVGxNHCBGATC/I7iiP6xBCV1Sug8N+ZhfHXleuGGraz9a6FK3mKvc4WopxydJyAOgJeSE7y2Oa03NBlw+F4L1QKdQbcD4XNzAtymoaoaL9M0ccbeZsC0I= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=DsuiyZv7; arc=none smtp.client-ip=209.85.160.68 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="DsuiyZv7" Received: by mail-oa1-f68.google.com with SMTP id 586e51a60fabf-3ed15120e55so5668378fac.2 for ; Tue, 13 Jan 2026 17:59:08 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1768355948; x=1768960748; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=U7ftMB0O2RO6V6KEGBmyXf/qaI8CtnkfkNTYnuarQaQ=; b=DsuiyZv7CIU6U0L0cMoBchRXu+lxSRFwAoh44p05wOrGL9px8JWy5W1zp4uq3E/7yZ JY5VfmxD9NisOujwfk9QBTvhsxGJXNv9nzvunEUnxVOJxi3nCE5Pl15OTlmORmbv88ti ou3ehLm/uqzFtE1d/2pSpi/vB6zFqLijZ8otrfZkVXtpELxMHAd+46A6It7rYUUHFVdF VSPKV/sEwkADRSPXpeZGtaMkhgG+7w42gmbgCoGmV8VdbtNpOs0Z31+zGFePDnyaw+Ww QMyN4bzjnw7FvQSgRyN5QxVWEN5qR6fOONzV1sm1/DrC+I1fPJTfEVyG5T9+4DWl+gw4 o7BA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768355948; x=1768960748; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=U7ftMB0O2RO6V6KEGBmyXf/qaI8CtnkfkNTYnuarQaQ=; b=skJSqZQvx8xF4zimEDn3gxAGMFFy/CZ9geKmhO4Wkdsrw8YvRZ4h5aBti/jh9TRluq AbZ0sY5X7/Pq3Q5R4zmLUsh1jM9cZTDoLW72hsdQbd/mPCOt+BhlOYqLCJmxOkpLsMFi 2mqEMkUjfr2oyjTKtEFuUmkW3U4fp/zj8/Zkxzr4kFtufJ2SnAb7yz96KikGa3IIgNx9 6nIGZz1u9kYExt5mTrJAXa9zr8klyc7kAbL7K5rHUtCx2pPr+6gqpWccsiPLBxL+VzwZ DTPaHbHartzu3RxJ0Skd79nRG4DzN3yLmog3VygOP0vcicRsWWT3e8405QqMNzF8SWwB p5lg== X-Forwarded-Encrypted: i=1; AJvYcCXJx44UDqx/PuHCkxy160SQF5NNN4ovbF+r6Z3YMjI1p9a/2kpf1FwRbqOBcBr0QOl/czTF2xjSwVoyZe8=@vger.kernel.org X-Gm-Message-State: AOJu0Yy8/yQSaKuduWVbgkRezSjyYIcQA2fTEzHQEqPDvrWwgwQs2u9R bsnweK7LZS4Lz5QCVWf6qsODRSLOGpBlz0sl8hqQlptX/na2kGudeCol X-Gm-Gg: AY/fxX4cBY07VlAvADLNwj9AHLjz4tSuShg9EYFZR/YL0xiZsH02Xuv4JlN95g4CDn6 rLA9ttQjnQrZ/jNwv1esPwpUUSsWrXL10MK+uaZo9aDeQYjnjmc+YZwvkl5MRcruFWZ7x8OKq9y ZPBT2wrhpTqX8owu9T6o1b3+c8yKZb/CQMcpDw7GDBCCoOhxfk6TGeXdF4LughFtt92Sg5SKDKe rjbrCOab3meXaihztMZg8DpCG70/krhzJP5n4k7YDj1BEUNHMztcNUeh/nAdDUqp1v3qYgpxSnM WwyxIbhu2Rt1y6yEYyAVS5erWcbJUKBFa8rrJhflzXPt3qc9CaKy1F2KrB8CBNLy1Hcc+eel1Dl Yb5VBFiQ6nSFXslODSej+I1+xpysg6vAQnzad0QViIApn+nS9Twgl0x1TV5neoBtelpjPX4LHR7 8YxaWXS2LlMHGkiqBtYGBzipXO+9vDbY/mNt2K X-Received: by 2002:a05:6871:3a0f:b0:3ec:44ca:ca33 with SMTP id 586e51a60fabf-40406f3b654mr743821fac.4.1768355947689; Tue, 13 Jan 2026 17:59:07 -0800 (PST) Received: from frodo (c-98-38-17-99.hsd1.co.comcast.net. [98.38.17.99]) by smtp.googlemail.com with ESMTPSA id 586e51a60fabf-4040cba2d2asm341362fac.5.2026.01.13.17.59.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 13 Jan 2026 17:59:07 -0800 (PST) From: Jim Cromie To: gregkh@linuxfoundation.org, linux-kernel@vger.kernel.org Cc: Jim Cromie , Jason Baron , =?UTF-8?q?=C5=81ukasz=20Bartosik?= , Louis Chauvet , Bagas Sanjaya , Dave Airlie , Daniel Vetter , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , dri-devel@lists.freedesktop.org, Petr Mladek , Shuah Khan , linux-doc@vger.kernel.org, Steven Rostedt , "Liam R. Howlett" Subject: [PATCH v8 06/31] dyndbg: reword "class unknown," to "class:_UNKNOWN_" Date: Tue, 13 Jan 2026 18:57:22 -0700 Message-ID: <20260114015815.1565725-7-jim.cromie@gmail.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260114015815.1565725-1-jim.cromie@gmail.com> References: <20260114015815.1565725-1-jim.cromie@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" When a dyndbg classname is unknown to a kernel module (as before previous patch), the callsite is un-addressable via >control queries. The control-file displays this condition as "class unknown," currently. That spelling is sub-optimal/too-generic, so change it to "class:_UNKNOWN_" to loudly announce the erroneous situation, and to make it uniquely greppable. Reviewed-by: Louis Chauvet Signed-off-by: Jim Cromie --- 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 eb5146bcfaca..cb171088850c 100644 --- a/lib/dynamic_debug.c +++ b/lib/dynamic_debug.c @@ -1165,7 +1165,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.52.0 From nobody Sun Feb 8 07:58:43 2026 Received: from mail-oa1-f66.google.com (mail-oa1-f66.google.com [209.85.160.66]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C19912F12D9 for ; Wed, 14 Jan 2026 01:59:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.160.66 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768355956; cv=none; b=ZEUp6RmsMAVHhHjWK2ALRRIBYaaMRZ2VALVJyxrTvQC8Tn4Bc68wtEylBzsm3EiFsUKa/geOSBS3YYmN4IhLBxByRdoDf6g7bUgS0cPKA7311PVwVOQz9vLcJ95Bg+GydU5p9kNgKrXiLp1LJa7o4o+ww1P8ZqXPevsRnRLVMXs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768355956; c=relaxed/simple; bh=sDWD1uGFDDRlfxhy01ddUztM6UdtdQV0shZVeb+54EY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=EZ+WCExxTrBNAnZBGXKRHk3NFG/MvpMcuVNzHPXVrcxIjimQxUWymD0Sb4rtWeY78quTqT4G0gs0KHDvbGEX7HfMeRdyhyuT6JA5Qd49aKkUclhpuArQuOTmSogWlBRMSMc2b5tPQnIPW78720TxorBNXW7VDLCxmxXUoDnRwvU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=TbZVy1qB; arc=none smtp.client-ip=209.85.160.66 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="TbZVy1qB" Received: by mail-oa1-f66.google.com with SMTP id 586e51a60fabf-3ec6c10a295so3646290fac.0 for ; Tue, 13 Jan 2026 17:59:14 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1768355952; x=1768960752; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=pKljsU8Xmw+/foisR3SYsx7mqK9N8s1wNDUiE0Eb/VY=; b=TbZVy1qBrLW2UvMad4FXwFwloPilP+ad6+gRn9Fk+SVRNS6Rd371xt65drwSoNcVQ+ OjMrYdBoYik/f7JeloiaYn1H5J9ivzdzdY0QXPILO6YOYDLePF4C8p9JTWsDDuDj1wE4 KEbMgFQ79ZChIDgU56+WA8hKzlbuxi3UZlIHOEnepjq68FVCqQRkArUj0NjFAFaPDm09 PnIB+TrnnpVwdLMdierNp9Z8aWUy4hbcKD0NUsyxsKBU2ejJWFtKG/uQ5I6w+pLiriIo sxZYVLOer22wb3pmE5eobqpGaPKZufyhFQX/yDHH0FuAaovASCJC/xsN4jsKryFaryU0 blfw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768355952; x=1768960752; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=pKljsU8Xmw+/foisR3SYsx7mqK9N8s1wNDUiE0Eb/VY=; b=vZIDM13HnglpXYsFKvouIog2ZoKo1Tz1pgXZPi8bTwvejeau8Pdk36d5c8JW6kU1bf 7DXUvu3sYMnfoYwSqTFI7gZwSHl56e4jkhUdVL+itXaTto+0fLrzZOasxebBtIqPm3Y+ Uy7dIqDVgzFFo2mieFUyb3DDHn+OTqJN86dPkxYzyqxPgrEoYCVXFJAD3lVHGciRGteI 5Z91prIGAVEBhPrzTjAU3eQAvlN8Vg5IdK3Kws5XwHP5K7NP9MSgS6/c3MuztTnKLd17 lmh5X+rlWOn+xSApGQZ0sOINTslI/RqTVLwgb85XSpzDTzbVOkxRIy1s9cZAbq00XyuC 4zyQ== X-Forwarded-Encrypted: i=1; AJvYcCVin4ZeMqZfE7NF1axuuroGYnqwwqdYxiOvQgJw/SiDdt9KPSveqEq0dHPZ/97Kev8xDvsFuxwM0/rfo3s=@vger.kernel.org X-Gm-Message-State: AOJu0YyA0tBmnh0jsoD/TqcGHHpIOq56viZ2P1nbxrSXkPkhoKoe/4zt 4p5ax9x7HxnFKuq2HOGd+m3vCdlgb4lvVMcA0q9LRH3jeI3t5GzXkFer X-Gm-Gg: AY/fxX7TdJcyqzfagKHh78Jewm+sGHbIQOmAN3Qnxiin6ZQcDfyII8BjLJosbeMdciu iMG+NsR3ECcE/Fi399l67QfOz8Z4DeBX58MKk7FBV9S4Y/fx8jYtFNUOZrg9z5Rppng5DZoOt0m 08KpbcHoZ9OAKjeiI4lU+oZEoFNA2fODJnhhdGJCPolTgW2Xaw28TwTYWdCLHN9G4zN6M1R96cw M8E0fM9+dceC91IU0EikdW2O5H2yuGmJOnyQvZWwlfKdedo7xlCXHRlL7wefd3XONzR/QFLTGrP 2WTrLEUkQWePI2Q287JbKYkhRAXIScKEZ7c7seJVsjF940D+/jVYvV2AjI8gPCwR6EsAyHFtNzh gJ1TsTpocgGiInmT4jPnaarclk++Jqyb1Jkp5cxvJOPt2+cXFsvV8P/ITNUHioIPNlofDOiMZQs x4RWoCAAQVbqZBtUmcTgGneZWiNTKJVT2S9HCs X-Received: by 2002:a05:6820:168e:b0:65b:3c3b:699d with SMTP id 006d021491bc7-66102df2cb6mr449232eaf.64.1768355951696; Tue, 13 Jan 2026 17:59:11 -0800 (PST) Received: from frodo (c-98-38-17-99.hsd1.co.comcast.net. [98.38.17.99]) by smtp.googlemail.com with ESMTPSA id 006d021491bc7-65f48bbb3f1sm9740809eaf.4.2026.01.13.17.59.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 13 Jan 2026 17:59:11 -0800 (PST) From: Jim Cromie To: gregkh@linuxfoundation.org, linux-kernel@vger.kernel.org Cc: Jim Cromie , Jason Baron , =?UTF-8?q?=C5=81ukasz=20Bartosik?= , Louis Chauvet , Bagas Sanjaya , Dave Airlie , Daniel Vetter , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , dri-devel@lists.freedesktop.org, Petr Mladek , Shuah Khan , linux-doc@vger.kernel.org, Steven Rostedt , "Liam R. Howlett" Subject: [PATCH v8 07/31] dyndbg: make ddebug_class_param union members same size Date: Tue, 13 Jan 2026 18:57:23 -0700 Message-ID: <20260114015815.1565725-8-jim.cromie@gmail.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260114015815.1565725-1-jim.cromie@gmail.com> References: <20260114015815.1565725-1-jim.cromie@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" struct ddebug_class_param keeps a ref to the state-storage of the param; make both class-types use the same unsigned long storage type. ISTM this is simpler and safer; it avoids an irrelevant difference, and if 2 users somehow get class-type mixed up (or refer to the wrong union member), at least they will both see the same value. Reviewed-by: Louis Chauvet Signed-off-by: Jim Cromie --- include/linux/dynamic_debug.h | 2 +- lib/dynamic_debug.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/include/linux/dynamic_debug.h b/include/linux/dynamic_debug.h index 98a36e2f94b6..4b7c3b997657 100644 --- a/include/linux/dynamic_debug.h +++ b/include/linux/dynamic_debug.h @@ -103,7 +103,7 @@ struct _ddebug_info { struct ddebug_class_param { union { unsigned long *bits; - unsigned int *lvl; + unsigned long *lvl; }; char flags[8]; const struct ddebug_class_map *map; diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c index cb171088850c..d2ff203d0873 100644 --- a/lib/dynamic_debug.c +++ b/lib/dynamic_debug.c @@ -810,7 +810,7 @@ int param_get_dyndbg_classes(char *buffer, const struct= kernel_param *kp) =20 case DD_CLASS_TYPE_LEVEL_NAMES: case DD_CLASS_TYPE_LEVEL_NUM: - return scnprintf(buffer, PAGE_SIZE, "%d\n", *dcp->lvl); + return scnprintf(buffer, PAGE_SIZE, "%ld\n", *dcp->lvl); default: return -1; } --=20 2.52.0 From nobody Sun Feb 8 07:58:43 2026 Received: from mail-oa1-f43.google.com (mail-oa1-f43.google.com [209.85.160.43]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id AB69C2F290A for ; Wed, 14 Jan 2026 01:59:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.160.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768355958; cv=none; b=YF1WWMBjzA4T0cS5ISrbxZZ5KyqivRMdul/A3cki7vQZ6P83zTILn0/i16EDdsrwVP4V/4UWHEnU39N2clXOaJDORU/Gjm1kFkb8YMiXa/s7P4DOpMKGw/q+OA5/RNZ9kGTXC9QAY3KDyG7Uct0gtmv7sYdHnvaGXSuPj/KRAZQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768355958; c=relaxed/simple; bh=wepq2o8x4t8iETVUIn8EzyPUIPyNNDfZPTFTI/EzHMA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=i57x1okqE0HlGbe43EiSLUl4oOO6OCRaEs/awFFm2IdEKM4pzO9ey9GTvWgjMcKy80Rx7ckUsyzLVvWZ58BWx9OabXwvtrfZw6mKa8Dtup9aykbLanoPe+oD5inrr/NHu5itaDnwqI/iEH3R89mjq6QceWsuvSftYKbKB1MMekM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=YY51IqhK; arc=none smtp.client-ip=209.85.160.43 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="YY51IqhK" Received: by mail-oa1-f43.google.com with SMTP id 586e51a60fabf-3ec6c10a295so3646305fac.0 for ; Tue, 13 Jan 2026 17:59:16 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1768355956; x=1768960756; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=kbNTI65sKfDeAaHShpwIIW/4QzYcWu3sc0P4jYcnBH4=; b=YY51IqhKspdcJj6FNE+ZxMqs0uqzgji/iYLdJtf46HEy6xkTMDPk5EFo2H9UekueP7 eNQJ+lAaQyqn3hcAWN3txWtvvqmRBw+g/tXxE3lkgSy6XKeShWzUAOo9MNpvEXkpO3B6 WBHEjpz2+QdNnRYgV8A+oNK+Ze/PpyUCxbBUamC4Wbx/S1WcJ2Ym1VECuXuvLtn5uq/X PJf0bmCL/XcWk3mOCkKZmJFRepEROstuJrtfwQHS+UUhglVF7C4RvZJSHC28KExOYyZX uZdKDg/Q5Nx71XF2g7WJdYbFCsDZ/44VLYQZqBBdlF4SNcmg4b6OT2K94b4rCFLf0qTC h1tw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768355956; x=1768960756; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=kbNTI65sKfDeAaHShpwIIW/4QzYcWu3sc0P4jYcnBH4=; b=S+qGlu1gXTmwnNemcOqSclr7DLJq5prtc1uUBExqFm45dnG4MX150Vxi2PaHR66q7B rDdZ5mKXe3tc7RcSLVPVvCPThs+TswxrRF06j/ke1LlWOEUDzBltdQ/XvyDXOoDnx7gl naaZ6jO61BVSlBkxDqG7NQvp/P157a6p8460R7FtoYruXVAeDFTmkIFh/aMVTr/+wPvh bcHHwVEoQr9LYFO1bGjfsZ4B2qMAUZHa9WkF52pGfRKEpPjLMAuo4ufXVqLOiwkbqji2 yAE58+eXUvNkBoVJMZSCcG4nrl7OKhVqYgVtAQw9K+gjFBzdXHTMyw+lmIgKjsYpSWtE 8qCg== X-Forwarded-Encrypted: i=1; AJvYcCWyU4uuPtcx02xzP66l0vQHWQFWxK4j6w0IJ4RxS7TgftsH0fatlvXvGTO50b6lG4AvAAapCvXICoBPR7w=@vger.kernel.org X-Gm-Message-State: AOJu0Yz81rQEW9Lh2KTek119R6kf3NKrdIqXx8stHYvVtVf0FnmjuDKp ac0ndV/WMw/tIZoGMhb89DH1PVBr3Dnv1PxMblNoL4AQWzU/TBou7Psi X-Gm-Gg: AY/fxX4Rhwyo+S61sZZSkLuru3vGT0Iub06m2PrLDDqubk7fUB5aPgLsPOIahGZToP0 /ZjDha/XaZJd5VbFMY0E2SBOxBS6TQhONYmSFTFDK8JVaTCQZz2UvCpclkalrzcy3NhI+T6Y+t6 G4wOvhgatviywtGvNnBOMd/xL4pYLRXE6/32b96g1D0mjOLEl4gjNO3TTMmnloliX4wEgfbqayb TGHfUbuP+E4NI5MD2afz2XrDB/RsjcPBbXgLMGaXIf5Gmpq3us0wccpX45UyLdh0zTZtqW4uiEA 29lFRTwJ6j219YPQ55wstS8ou6QtRr01U+aPB8o6V6Oid+8eBqRbeW0H9Uo+D43DJuinEqdDsBu Foayc/TypAKvEWjfIhLLQ/QS9NrMPOZDa73JZLON349BYsTNKPLhMVyxV0o1o5qWHiWW7CKAFzT wIcoCrhGPukfWKx0E/GW31vOmuh99liD+v1mDc X-Received: by 2002:a05:6871:4e4c:b0:3f5:4172:21d with SMTP id 586e51a60fabf-4040c0cbaeamr399585fac.56.1768355955607; Tue, 13 Jan 2026 17:59:15 -0800 (PST) Received: from frodo (c-98-38-17-99.hsd1.co.comcast.net. [98.38.17.99]) by smtp.googlemail.com with ESMTPSA id 586e51a60fabf-3ffa4e3a7bfsm15083510fac.8.2026.01.13.17.59.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 13 Jan 2026 17:59:15 -0800 (PST) From: Jim Cromie To: gregkh@linuxfoundation.org, linux-kernel@vger.kernel.org Cc: Jim Cromie , Jason Baron , =?UTF-8?q?=C5=81ukasz=20Bartosik?= , Louis Chauvet , Bagas Sanjaya , Dave Airlie , Daniel Vetter , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , dri-devel@lists.freedesktop.org, Petr Mladek , Shuah Khan , linux-doc@vger.kernel.org, Steven Rostedt , "Liam R. Howlett" Subject: [PATCH v8 08/31] dyndbg: drop NUM_TYPE_ARRAY Date: Tue, 13 Jan 2026 18:57:24 -0700 Message-ID: <20260114015815.1565725-9-jim.cromie@gmail.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260114015815.1565725-1-jim.cromie@gmail.com> References: <20260114015815.1565725-1-jim.cromie@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" ARRAY_SIZE works here, since array decl is complete. no functional change Reviewed-by: Louis Chauvet Signed-off-by: Jim Cromie --- include/linux/dynamic_debug.h | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/include/linux/dynamic_debug.h b/include/linux/dynamic_debug.h index 4b7c3b997657..c4ae79f934d9 100644 --- a/include/linux/dynamic_debug.h +++ b/include/linux/dynamic_debug.h @@ -131,11 +131,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__), \ + .length =3D ARRAY_SIZE(_var##_classnames), \ .class_names =3D _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.52.0 From nobody Sun Feb 8 07:58:43 2026 Received: from mail-oi1-f175.google.com (mail-oi1-f175.google.com [209.85.167.175]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 203522EC086 for ; Wed, 14 Jan 2026 01:59:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.175 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768355962; cv=none; b=JJlN/Q137Ya+WQ1H71OIjJinQQyIcCPzoceealKPzpEa+dMDh9O8EQzx78rAH2VzXITbloPYHhuRTVvxDsXjlN1bIGBSR9fXfmVcmB/Z47bOYeQhWN0+T279V/L1uk3uJSwlVd9KvEpbfLOKmfSpariB/JvneX2+lQAt2PZJ2sE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768355962; c=relaxed/simple; bh=By5iwCjaEqa2McMnoS7WlZkqnzNV5abBOXrSsH3vz5E=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=omhowYbKDncqnFvIIsarlua6MMfmRGzPPHIyV76dx7I9OuLkxP2SRM8sB1vreDAkHnwmXS7zm9VhiedgIcE4rFDvbQh9fwdB2OEL9YzTDLlioVp9Qg7ZgAmXPoj80BUxWAjc91IBiEMI+1qaqBFps9pCxm6t2y2DukMJfmpc9AE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=TNszZ/Z9; arc=none smtp.client-ip=209.85.167.175 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="TNszZ/Z9" Received: by mail-oi1-f175.google.com with SMTP id 5614622812f47-45391956bfcso6109659b6e.3 for ; Tue, 13 Jan 2026 17:59:20 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1768355960; x=1768960760; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=Elt5R/CoR9iQcckLm+LWmPbMBH4lmPXk70cWipXnli0=; b=TNszZ/Z9Nx1s5K9dcthILJt169iBdyEToIngxOMGk4g3HAJQpNIolnMSDuCO9mcmvx tc1RAZps1GBOEmQ7C5JdtWr6wYQpwfytZCilrtWw1wDkmsw8dGKrrIqDe1mimkc7+jtx 4tUMGTdhvY2pqbvk45KL+TGyVPrmppoaB6pygalvXV3mr01g+dv/4Q6vB0LP9fYrZ2nL UtlFMCzD4ukUSJ9WKweGvicjGbNTZZ4C2Zciw0H4p4O+ILP1kr0igv5fVWKqxinyB4SW AQ1+DlQcbR0kuXPF9OTjw1JrHQE58YDcKDiF/XzvCAoy0uWJYKE8OSKUdKCXLRdZDbQA p1+Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768355960; x=1768960760; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=Elt5R/CoR9iQcckLm+LWmPbMBH4lmPXk70cWipXnli0=; b=MwsfgKFbsxUKGCn4GEUW7GKjt0cQrM9J0dc9vDNJL+rY1+OfpS7mBnM/gzKcyFKDMe gVIDjgGzV1rW19wGqr7NVfzUHnXY4wd4iQpYNhUL6hSHCiHSvnmYyxH8u5V/d2rc887v 496b3Ksf0wZaLAD6spWBgLaKGNp1C8kJjrIPw0pPBczemMd11pRV6weeiHw+XYDYPrDi fUnrCyq6KIHZt+ztxWcckgCR3leE+UvMG5s6l6oivKBJcMO310TLyWjvRCP2GQQVRAdB uJhXmG/b4scQXx7EYj+5xTgbYR6I1XQlWpY2krWwAgO3u4QkYERWAV4+gVBDTJOcHxxi jpuA== X-Forwarded-Encrypted: i=1; AJvYcCXHy78sNWSQVUhAgm9pQBJY+m5Kvr1bNIBdoIfIwy9mbW2qDHI/WOCsq1Cajj1I6lHHLtmFzGOI6SasUm8=@vger.kernel.org X-Gm-Message-State: AOJu0YxIPnzSHdXPhJKZboKDXCoRESfbv3BagPuBgFHZg49KeK2tv5w5 Ojsinz8uWfomvJORuHtryDuXL2Dc82GZb5tiL1l5jR3AczMmKiZW87my X-Gm-Gg: AY/fxX6IrQFNu9lZRqaJHDWgGjfmsWAGUTf5/NCnYV0UcPmXtgxMrpxtXwEfTkbAdDZ mdFhQJpJc0EZ+LmE3uisZAw9VG1Phfsl+a2rr9DvOGNwUEJ0M7CladWar+cGxCZKBCPSlG3gNPz m/h4p6y1fdI01XUTvTCJJ6TMrs3X/f/WHyHNmD9AB1HGaODuOohZbIXwBEqdvmAfoOge38SqNNM Ts757ikgf+5JuFTMSRR9cXtR3q17Nk5pF7nPqrglsLOQgeGZXK2vPcpfFvPPLW/dbbF+ogMT3KV qkprEHwgI+rkKTyTbQ2BjsshZn7z80FTwX7X1CBro6OL4gROdUfHZxZxV6MCp5HewFD+cw7QWmS quvlIABu2ePenG4iRXebM+y58TlVpeKcewZTpqWihEcNNtQ9GJ4wDtXa+DVocExOuS9eyaxJjjV MhmO1BVoAItCro6lfw5odLdzS3oIeqf33Jayih X-Received: by 2002:a05:6808:f88:b0:43f:7287:a5e3 with SMTP id 5614622812f47-45c7144e90fmr760158b6e.28.1768355959868; Tue, 13 Jan 2026 17:59:19 -0800 (PST) Received: from frodo (c-98-38-17-99.hsd1.co.comcast.net. [98.38.17.99]) by smtp.googlemail.com with ESMTPSA id 46e09a7af769-7ce478d9c2esm17510187a34.21.2026.01.13.17.59.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 13 Jan 2026 17:59:19 -0800 (PST) From: Jim Cromie To: gregkh@linuxfoundation.org, linux-kernel@vger.kernel.org Cc: Jim Cromie , Jason Baron , =?UTF-8?q?=C5=81ukasz=20Bartosik?= , Louis Chauvet , Bagas Sanjaya , Dave Airlie , Daniel Vetter , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , dri-devel@lists.freedesktop.org, Petr Mladek , Shuah Khan , linux-doc@vger.kernel.org, Steven Rostedt , "Liam R. Howlett" Subject: [PATCH v8 09/31] dyndbg: tweak pr_fmt to avoid expansion conflicts Date: Tue, 13 Jan 2026 18:57:25 -0700 Message-ID: <20260114015815.1565725-10-jim.cromie@gmail.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260114015815.1565725-1-jim.cromie@gmail.com> References: <20260114015815.1565725-1-jim.cromie@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Disambiguate pr_fmt(fmt) arg, by changing it to _FMT_, to avoid naming confusion with many later macros also using that argname. no functional change Reviewed-by: Louis Chauvet Signed-off-by: Jim Cromie --- 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 d2ff203d0873..21c1db7e8705 100644 --- a/lib/dynamic_debug.c +++ b/lib/dynamic_debug.c @@ -11,7 +11,7 @@ * Copyright (C) 2013 Du, Changbin */ =20 -#define pr_fmt(fmt) "dyndbg: " fmt +#define pr_fmt(_FMT_) "dyndbg: " _FMT_ =20 #include #include --=20 2.52.0 From nobody Sun Feb 8 07:58:43 2026 Received: from mail-oo1-f43.google.com (mail-oo1-f43.google.com [209.85.161.43]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2D7212F4A05 for ; Wed, 14 Jan 2026 01:59:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.161.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768355971; cv=none; b=FcM154GEo9fvru0l1mPp8/5JyIzMLAmR5E8PgGs0t+JOFzrCtAhtMGIp1tKe+fiFsvOA7GvZDqJn+6dxHRXlXGaUErQZ66OvC3eJKGf6dOJaPOjGWASXElPUKhzVw/Wvgjn5jgefyQAaYXmFvaOZ4kyct0Tup0L9qrFrYU4K5C0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768355971; c=relaxed/simple; bh=a7QzjZykrf+nhpVu0FMe0jqhJkw6SImZcec8zbEQ0hM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=KfHHvDU+uAn7lEwDrgYoqRYsSVrSXxeMbhhhb5xkjCJM1rBlgqYKvRngMcpgTLU8D1G7yyhRKy8TSsOlkqbhRW3yE/94/R9LGSdjy3SjOSIvz4TmFjkXrshj0M9acDtscddjsBeKixxjmGyPAuqpj+cKyuOLek/6I4OOrN2nIvE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=OXR9e8gX; arc=none smtp.client-ip=209.85.161.43 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="OXR9e8gX" Received: by mail-oo1-f43.google.com with SMTP id 006d021491bc7-65cfddebfd0so4077891eaf.0 for ; Tue, 13 Jan 2026 17:59:26 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1768355964; x=1768960764; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=kB9XGvfi6ObodyigSZBf40IoYnb1xkrL/FFwh/sfSnM=; b=OXR9e8gXcY3x1YldMw97J7zXMnH04IszzQ2MvGxvvZsRtgk9rf2oSBYVe16QgFl4Gn D0RM7/p5yp2g66mX6YoWJ8EGBHdQEluUpbJTAVrtAq039lWoO2BCKPjCbUEDV336FW3X y5VpTQoEr0hsJQASSeiYhEKCngeTLTdf4/HJk5gojYDCleAPSCr5v0Ll1mE50CGJ4hZ7 QJsBkDlyHjzPSE1Jy8efBNtomC/LPAMiNRanTdQbngDgmg4sS6TVaCDXDIfKRExS5D0e eDXQ2pUQnUEtvw9jW+SsMGWo2khJFYsmT01d/W7OvLt7F185Er+pymEOzIdiI4xW9635 f15w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768355964; x=1768960764; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=kB9XGvfi6ObodyigSZBf40IoYnb1xkrL/FFwh/sfSnM=; b=rGp4mrWPS+pTTyTWhA5LiOukGJsV0YDJh15Tjvp/L77IGAccCNEoJHRKk3kIE0z9Yh OuW0swUe/H2iLoaQlbcU0I69GZksBXziPZTvDPSC0Y1CygMLMAu0vQNVDS8apYrMNJCl 65xj3wWEs5+gIQObdNSSV9h6FVdIOYMZ1GBNXr7rIMm/gpDYrWRA1PXb8siealh2nK1P 2Am5Mb5kMEnD3UwzhM5UWp8WSsGU7zBzlLbRUiEau2vAa/6dh+EciEDgEapKzZ5kQYVM vakyEolB5/vq8vz/gA/7SqTahtZTRdD/APwSg25xigMJyALLgRoCztQTATedNkhPK3Dr huBA== X-Forwarded-Encrypted: i=1; AJvYcCXJcFfIOc19h+wHEW/5dLcVTkEnZ4nsAyY5Gue69sC2J/UB/WpdlSWzPx4L+7MyY/dTC7q3ViugrqzyWDI=@vger.kernel.org X-Gm-Message-State: AOJu0YzPIqHAFeNuSwVfdWdbvVZW34Jv+uI3wiZFFiR/axunpIMbU97r 8Ga0S8/t6TBZyMUrd3URn9CdyAB/gA5zLzv+iLMAXG5UjDnhoAkyLXOC X-Gm-Gg: AY/fxX5/O06velNja7woEGp9eX14s7AO56htOSwts8NP/OD+IczqyEbr3MR6yL04ojv 1LD46t4MOQElXvw/u1QzT/6/ER3Ar/vBKamX6Ho1jB+20rdY/S3USR104LDkSQfOUGBOy4EOOOa 6Su3Im20+7MN3RVWaKyPEqe6e8aeOsW3Im6c6SYF50AXFjzNasxrkqyMqth9ZcQg5V6s0a/TK60 Qb6HpG+HMvowiY/GMONFuYBhO+e4n9XPAb7SjGogveneBPvsP9bRT/oQAnPDAowRq0TK2VRsMPx IhdSeTbUfk+WEjm2MVgmEiLaOfumyKnq+5pjz2OXv81MDh/iqpcmZnN16PM2yiKmzSliehq4rxN w73vdZUbGsw1OmMNLDeZccck4cJPKZ0OICdNxf6TFRtxqCEkKlo4GPc3S+swgBWTKWF6b97pbyZ bztnCwp66+wt3zeRIxszzFhYlRVK3E1j2B1uYf X-Received: by 2002:a05:6820:430e:b0:65d:4d4:e7c4 with SMTP id 006d021491bc7-661006d3539mr639488eaf.38.1768355963839; Tue, 13 Jan 2026 17:59:23 -0800 (PST) Received: from frodo (c-98-38-17-99.hsd1.co.comcast.net. [98.38.17.99]) by smtp.googlemail.com with ESMTPSA id 006d021491bc7-65f48ccf24esm9067492eaf.14.2026.01.13.17.59.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 13 Jan 2026 17:59:23 -0800 (PST) From: Jim Cromie To: gregkh@linuxfoundation.org, linux-kernel@vger.kernel.org Cc: Jim Cromie , Jason Baron , =?UTF-8?q?=C5=81ukasz=20Bartosik?= , Louis Chauvet , Bagas Sanjaya , Dave Airlie , Daniel Vetter , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , dri-devel@lists.freedesktop.org, Petr Mladek , Shuah Khan , linux-doc@vger.kernel.org, Steven Rostedt , "Liam R. Howlett" Subject: [PATCH v8 10/31] dyndbg: reduce verbose/debug clutter Date: Tue, 13 Jan 2026 18:57:26 -0700 Message-ID: <20260114015815.1565725-11-jim.cromie@gmail.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260114015815.1565725-1-jim.cromie@gmail.com> References: <20260114015815.1565725-1-jim.cromie@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" 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" mod:* dyndbg: split into words: "class" "DRM_UT_CORE" "+p" dyndbg: op=3D'+' flags=3D0x1 *flagsp=3D0x1 *maskp=3D0xffffffff 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 Also reduce 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. no functional change Reviewed-by: Louis Chauvet Signed-off-by: Jim Cromie --- lib/dynamic_debug.c | 21 ++++++--------------- 1 file changed, 6 insertions(+), 15 deletions(-) diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c index 21c1db7e8705..1db2f627237a 100644 --- a/lib/dynamic_debug.c +++ b/lib/dynamic_debug.c @@ -275,9 +275,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 @@ -510,7 +507,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--) { @@ -524,7 +520,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) { @@ -540,7 +535,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; } @@ -550,7 +545,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 - int nwords, nfound; + int nwords; char *words[MAXWORDS]; =20 nwords =3D ddebug_tokenize(query_string, words, MAXWORDS); @@ -568,10 +563,7 @@ static int ddebug_exec_query(char *query_string, const= char *modname) return -EINVAL; } /* actually go and implement the change */ - nfound =3D ddebug_change(&query, &modifiers); - vpr_info_dq(&query, nfound ? "applied" : "no-match"); - - return nfound; + return ddebug_change(&query, &modifiers); } =20 /* handle multiple queries in query string, continue on error, return @@ -1245,11 +1237,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(sizeof(*dt), GFP_KERNEL); if (dt =3D=3D NULL) { --=20 2.52.0 From nobody Sun Feb 8 07:58:43 2026 Received: from mail-oi1-f193.google.com (mail-oi1-f193.google.com [209.85.167.193]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 26EBD2F618B for ; Wed, 14 Jan 2026 01:59:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.193 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768355972; cv=none; b=GpAdG9gL5TatySPUip6UY6FMiDI0mKeV2Grh5lpgrGemEFAXB8emYaP3LZNw5L70kYMeXrWECrg2enh5qmw/Qh6rTnJ9oxm3BMJJSx5yQCbRoWviko+TwL1Kf+/JSYmpi4tAof9tcoaFL8la/rA4SWvK5VFGZjuos+8z74Wz3hE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768355972; c=relaxed/simple; bh=vg63sy7QbWL0kibdt/FXOXuPKUSSpfXUoQuv+kiBi1A=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Vlrf6kiLXu66vO+hZp21OH3lT7JanaP5hk4pJtemcJDRfx/5KeN5qLmyPfzALU85ZN3BcDu4NhMXMNsbRt5jwkLC1VG0NEUxDPum9hGFqOdJRsPLcFD5uH+KHcyeSpXsxJiCjf6doFR159erKjzsGodivBW0BWEJACTc5k3M21M= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=nV8P/HuE; arc=none smtp.client-ip=209.85.167.193 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="nV8P/HuE" Received: by mail-oi1-f193.google.com with SMTP id 5614622812f47-450be85b7d9so5310217b6e.0 for ; Tue, 13 Jan 2026 17:59:28 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1768355968; x=1768960768; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=esuoUN/X0OUOWwx+QdeV/Q9GgUdfEO6lTOhgSGNn33g=; b=nV8P/HuEzqcknIiO04Fujy7Q72VeDGf4pTNBZewXSMlLb+bn0eRzCPbQgpLv+PnwhA cmN5FzimgYsKh/I2zzHzLhvibhz5wFJYRIzHBOCQ2+7aJ3WZMbEab7pzZ8vZhHDLqIkb mZIhyXiQpv7RFtf9VlhmbYuDXZnUhONhtvgpr4FzELqd0A18HcP/U9iEF3j96w6emytf nXYPE4nTDrcy0TFDNRHOZaf+I0mGxIxmLMr2WpjF4o8L/+SyDDoC4dYd2FR5xS0kXkdw 9dn/D3IRj5+yUgYrFkLwaUWXb63ST2D0N2QXDpb6ePaQ53G7fdys3DUKLZQXEGjrgRtw Vz4w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768355968; x=1768960768; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=esuoUN/X0OUOWwx+QdeV/Q9GgUdfEO6lTOhgSGNn33g=; b=gkN1JBoJHX7XDeWFV/WOY4URkzZ3PjgYiFIikYndsym7VbVv3M30hb0f3wyiTwQ/st jC9pfpHXhwUoZLSYaf+tkUjzkgSpWPWgZt02j2SOzN3CB8u/6VG8WU2Slm32CVOcLv7U RK5wyrxj/8Y0i4BPq6+qCrcqX/xRqiYrxZQOTTSQjR4KPvemhPh++LJ8p8bmCLSyOJ1V qwc7a9NAla6SCi0AYTzHt2bCfKH09xtiIOQXl8pSX29xuimhQwHMhO590qsm5x6hyGRq 1yf011tZFNsQkIp5TGGNYqqw22A1vBgpr9FvBkAgHc/36LE+AVVRiOU/Gu0fYidcR9M0 rLSA== X-Forwarded-Encrypted: i=1; AJvYcCUClNZqSCDjgXdS6QJPGkokfcsr/izPy81WrqpF3ZUWG3vMgnN4lH5/SjBz0brkwanpvvP8Dju2gr+ogVo=@vger.kernel.org X-Gm-Message-State: AOJu0Yy9dpiEU7o4JkB/2GFinMSzjCiNAV1yJOkmFhYyqdcBpWJlb6Xh EPqmUIXsCeBqIi5XTnBNycFkm0QRA5hndDytarUn2a8/4nfT8FXhwgWS X-Gm-Gg: AY/fxX4lX5Nn1k7d3TgYD7lBao8p6ilRG3f+KimN/7gblFTSalMbrq8+6DMAUkjXkSX Jj8p7fysUjJeN64ltyGrJ5yo0ziZbkGoTTer96KAvfDjyrVccJ2anCcd+ZGC7ms0q7a/mTks4cu p3KH9GXQpmB35ot5OezXlAYgWmh7ytk6vYy7zZrRaiWUdpLts2cpzB8QWWfwzPPqMLrK8zQ9cvp CYDG8DVCmqpTUAGRhKv3jlhBTUiK2Al3ADFDIvgPO5mUYGntYhpOBshV699DX1QAo2LiLurH+is TikDoky5Gz1q1LM19fFhn09y1IWOv5sESI9OvNbW58emeftHDmU2baP0Es4yvlrA7XyOQtPC9y3 NYpDUE0PrCkmqxzo8QPN5mxMVklPzebPyx18cEVFALSfLcY5jf/VyGKFdIj3NpwzuzF9irFyLu7 BG4Bs/NxybWl/K1Om9C17+W3h+XK/Qb4Oe7Qk7 X-Received: by 2002:a05:6808:d52:b0:459:9358:ab70 with SMTP id 5614622812f47-45c714f27d6mr642429b6e.31.1768355967898; Tue, 13 Jan 2026 17:59:27 -0800 (PST) Received: from frodo (c-98-38-17-99.hsd1.co.comcast.net. [98.38.17.99]) by smtp.googlemail.com with ESMTPSA id 586e51a60fabf-3ffa4de539bsm14995190fac.4.2026.01.13.17.59.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 13 Jan 2026 17:59:27 -0800 (PST) From: Jim Cromie To: gregkh@linuxfoundation.org, linux-kernel@vger.kernel.org Cc: Jim Cromie , Jason Baron , =?UTF-8?q?=C5=81ukasz=20Bartosik?= , Louis Chauvet , Bagas Sanjaya , Dave Airlie , Daniel Vetter , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , dri-devel@lists.freedesktop.org, Petr Mladek , Shuah Khan , linux-doc@vger.kernel.org, Steven Rostedt , "Liam R. Howlett" Subject: [PATCH v8 11/31] dyndbg: refactor param_set_dyndbg_classes and below Date: Tue, 13 Jan 2026 18:57:27 -0700 Message-ID: <20260114015815.1565725-12-jim.cromie@gmail.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260114015815.1565725-1-jim.cromie@gmail.com> References: <20260114015815.1565725-1-jim.cromie@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Refactor callchain below param_set_dyndbg_classes(1) to allow mod-name specific settings. Split (1) into upper/lower fns, adding modname param to lower, and passing NULL in from upper. Below that, add the same param to ddebug_apply_class_bitmap(), and pass it thru to _ddebug_queries(), replacing NULL with the param. This allows the callchain to update the classmap in just one module, vs just all as currently done. While the sysfs param is unlikely to ever update just one module, the callchain will be used for modprobe handling, which should update only that just-probed module. In ddebug_apply_class_bitmap(), also check for actual changes to the bits before announcing them, to declutter logs. No functional change. Reviewed-by: Louis Chauvet Signed-off-by: Jim Cromie --- lib/dynamic_debug.c | 65 ++++++++++++++++++++++++++++----------------- 1 file changed, 40 insertions(+), 25 deletions(-) diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c index 1db2f627237a..64d69f5cba1b 100644 --- a/lib/dynamic_debug.c +++ b/lib/dynamic_debug.c @@ -604,9 +604,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]; @@ -614,7 +615,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)) @@ -623,12 +626,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 @@ -683,7 +690,7 @@ static int param_set_dyndbg_classnames(const char *inst= r, const struct kernel_pa continue; } curr_bits ^=3D BIT(cls_id); - totct +=3D ddebug_apply_class_bitmap(dcp, &curr_bits, dcp->bits); + totct +=3D ddebug_apply_class_bitmap(dcp, &curr_bits, dcp->bits, NULL); *dcp->bits =3D curr_bits; v2pr_info("%s: changed bit %d:%s\n", KP_NAME(kp), cls_id, map->class_names[cls_id]); @@ -693,7 +700,7 @@ static int param_set_dyndbg_classnames(const char *inst= r, const struct kernel_pa old_bits =3D CLASSMAP_BITMASK(*dcp->lvl); curr_bits =3D CLASSMAP_BITMASK(cls_id + (wanted ? 1 : 0 )); =20 - totct +=3D ddebug_apply_class_bitmap(dcp, &curr_bits, &old_bits); + totct +=3D ddebug_apply_class_bitmap(dcp, &curr_bits, &old_bits, NULL); *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); @@ -707,18 +714,9 @@ static int param_set_dyndbg_classnames(const char *ins= tr, const struct kernel_pa return 0; } =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. - */ -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; @@ -755,8 +753,8 @@ int param_set_dyndbg_classes(const char *instr, const s= truct 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); + v2pr_info("bits:0x%lx > %s.%s\n", inrep, mod_name ?: "*", KP_NAME(kp)); + totct +=3D ddebug_apply_class_bitmap(dcp, &inrep, dcp->bits, mod_name); *dcp->bits =3D inrep; break; case DD_CLASS_TYPE_LEVEL_NUM: @@ -769,7 +767,7 @@ int param_set_dyndbg_classes(const char *instr, const s= truct kernel_param *kp) old_bits =3D CLASSMAP_BITMASK(*dcp->lvl); 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); + totct +=3D ddebug_apply_class_bitmap(dcp, &new_bits, &old_bits, mod_name= ); *dcp->lvl =3D inrep; break; default: @@ -778,16 +776,33 @@ int param_set_dyndbg_classes(const char *instr, const= struct kernel_param *kp) vpr_info("%s: total matches: %d\n", KP_NAME(kp), totct); return 0; } + +/** + * param_set_dyndbg_classes - classmap kparam setter + * @instr: string echo>d to sysfs, input depends on map_type + * @kp: kp->arg has state: bits/lvl, map, map_type + * + * enable/disable all class'd pr_debugs in the classmap. For LEVEL + * map-types, enforce * relative levels by bitpos. + * + * Returns: 0 or <0 if error. + */ +int param_set_dyndbg_classes(const char *instr, const struct kernel_param = *kp) +{ + return param_set_dyndbg_module_classes(instr, kp, NULL); +} EXPORT_SYMBOL(param_set_dyndbg_classes); =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.52.0 From nobody Sun Feb 8 07:58:43 2026 Received: from mail-oa1-f68.google.com (mail-oa1-f68.google.com [209.85.160.68]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 08B512F5305 for ; Wed, 14 Jan 2026 01:59:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.160.68 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768355974; cv=none; b=p65LmUX45jZdqJhZJbcdqQwhvINerpxWtANjNd5mhorcH6JsTQLMQzAkSWKM4GxrbZSJWrMWHmHN5Ba4DLfnnpOFSJbbv55JqZnEf0UGQFf2nTEN1yljpJv6cuVVncuf2ShRWjr7ruOgYiENcZ5XOHINWx+jOImRyrh8Oubp+yg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768355974; c=relaxed/simple; bh=KZmY7t1nCms4fl3dBwXkSTLPAQxgaCZAAwmDCUvbFS0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=sxOgSeH09KiHr6JiITkHIwokVfb2PIkD1/857guqUhAHA/+im4s7HxTTrB64PggsUOtSs/tZikM/Hllgv8JoqpPj7bsbCKat+1y4XNaFkeaG0KbxzWEj3y8Tb7GvrwJN+i4ITW41FRFVl8essORtA0k2GG8FI6tpudHjG4f+mmM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=OICpYnHX; arc=none smtp.client-ip=209.85.160.68 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="OICpYnHX" Received: by mail-oa1-f68.google.com with SMTP id 586e51a60fabf-3e7f68df436so352949fac.1 for ; Tue, 13 Jan 2026 17:59:32 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1768355972; x=1768960772; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=OmSrywNj94qh5LuqDwB/XOVQgrfMaP0ThWQZPNx1I5w=; b=OICpYnHXVN3S6pro8unnb4NdqN87mprfPDO6A3tChIi5uBWOtghlkHpWYGqKb9/VQH JwWh22chh0StkkKIBBsr20sZXydI0ouAYcQ1vq2fWmF7Er6jfhGOVjN0isoWBanpmwHg LF/cM51guBSC/CfVmOEeOW0RX5wWYBJjGItt24XVQgK+8WapOi2gOzf+RXb5LnrZ0ZFR ReSooi4TCjb+CDKgPP8Mo05E+I2ZVFDLQ6wr7IsS/LJcLqwu18/HDbyqtPcXHwji4ekn B6RzK4oBU6NqehrI2PiEDSbfZna300MUrJ41VAQyL2h+LTstAMkW6S9mWcGXsgQZ4ZC+ AAug== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768355972; x=1768960772; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=OmSrywNj94qh5LuqDwB/XOVQgrfMaP0ThWQZPNx1I5w=; b=j8568SXeREkACIIgoIaAwCOFuQr75TTsK0LqSqzJa9Vx7ZVpL1I/9J0mmKBrQVjepI U0Yu5/gHwRUhEbXKTBhPTsBvKe5u0qgUhe5V70D5643sGJ7Vgbi4QKPfyv7NRLJNYfGU vWEK3mvQb4WCQMBnezrDqDN0W131xM57wTXonzEbw0uC+O7T/h4oOpIz32EyUHczIjoq CNI3RbCI32Cwqd/wjvzB2/O/K1cUoAJ1HKRrBlyeexH1Ua9UaVGKyua9tOM3burcAj/5 nRcstkzwwI1Jiv9N+iMWCch//2KsO7Yjjj2UyWSQJwp/TJHg9BTlX6jzru2iAbplFGVE v4WQ== X-Forwarded-Encrypted: i=1; AJvYcCUBIGh9Lj0higV+VOxHalEryjSRBU2of3aiXF2ahg9vO8fZGhdZFkbDPnLBEv1jxEiVtWGdNzd9yDMLR7w=@vger.kernel.org X-Gm-Message-State: AOJu0YyM+crHRW6yCvH7fEseemMM0aReMHHa6QL16Vzlup1Zacp/hif1 ul4F+TYe1UrUSvdLH70qBO0Smtlb5NrbirUlhtikT6SEcruaIIGYqqhm X-Gm-Gg: AY/fxX4fQXmE8NTO9JIMximYOpG5+9aaIT/Cmx8+oZyL/2IZdgvypqXIRG6xAXcm6QT Qiir+xuDpg183beSBCV/T3sw4kueAiIVED5eN5e43gBdQt/iNeH59PhpDDcQO2Auc+IU41yCM8K yRjWJRbvqZWDgdPIYytI1WA2vBxyRhn9m4dtgMaPnGgEoEX0L7ygJgxG4pjSa+c7CTFHxURfsvu HqKvQu4sjkXONxsmsXZRq9kz4/OjYQS6A2lUFSkNG+ucZD+RO22YAODImJODjIV5TO0E3m6SvIR Ou08Qys3BWY38v3lbAC5oeeXFw4HMRAq/Xz0XX2rLoGR+ODbpNEQ01J+5KFuYdxRgh9fIlg1iWe u09i9p4KBN7LM2FxVNvpwIdLkUUegAv//iaOow76xhhGT6PQzQKcpFa6tuhR/S9xGCQ5D3tI67m NjElMan/13Qk+vaC3VeTIX2ObIuYl7kJJlCzf/OTOkDE7RIoZF4cdX1bEBLg== X-Received: by 2002:a05:6871:2013:b0:3e8:9b72:5cda with SMTP id 586e51a60fabf-4006e417334mr2886940fac.11.1768355971874; Tue, 13 Jan 2026 17:59:31 -0800 (PST) Received: from frodo (c-98-38-17-99.hsd1.co.comcast.net. [98.38.17.99]) by smtp.googlemail.com with ESMTPSA id 586e51a60fabf-4040cba2d2asm342105fac.5.2026.01.13.17.59.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 13 Jan 2026 17:59:31 -0800 (PST) From: Jim Cromie To: gregkh@linuxfoundation.org, linux-kernel@vger.kernel.org Cc: Jim Cromie , Jason Baron , =?UTF-8?q?=C5=81ukasz=20Bartosik?= , Louis Chauvet , Bagas Sanjaya , Dave Airlie , Daniel Vetter , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , dri-devel@lists.freedesktop.org, Petr Mladek , Shuah Khan , linux-doc@vger.kernel.org, Steven Rostedt , "Liam R. Howlett" Subject: [PATCH v8 12/31] dyndbg: tighten fn-sig of ddebug_apply_class_bitmap Date: Tue, 13 Jan 2026 18:57:28 -0700 Message-ID: <20260114015815.1565725-13-jim.cromie@gmail.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260114015815.1565725-1-jim.cromie@gmail.com> References: <20260114015815.1565725-1-jim.cromie@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" old_bits arg is currently a pointer to the input bits, but this could allow inadvertent changes to the input by the fn. Disallow this. And constify new_bits while here. Reviewed-by: Louis Chauvet Signed-off-by: Jim Cromie --- lib/dynamic_debug.c | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c index 64d69f5cba1b..db0559763e60 100644 --- a/lib/dynamic_debug.c +++ b/lib/dynamic_debug.c @@ -606,7 +606,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 @@ -615,12 +616,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], @@ -632,9 +633,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_classnames(const char *inst= r, const struct kernel_pa continue; } curr_bits ^=3D BIT(cls_id); - totct +=3D ddebug_apply_class_bitmap(dcp, &curr_bits, dcp->bits, NULL); + totct +=3D ddebug_apply_class_bitmap(dcp, &curr_bits, *dcp->bits, NULL); *dcp->bits =3D curr_bits; v2pr_info("%s: changed bit %d:%s\n", KP_NAME(kp), cls_id, map->class_names[cls_id]); @@ -700,7 +701,7 @@ static int param_set_dyndbg_classnames(const char *inst= r, const struct kernel_pa old_bits =3D CLASSMAP_BITMASK(*dcp->lvl); curr_bits =3D CLASSMAP_BITMASK(cls_id + (wanted ? 1 : 0 )); =20 - totct +=3D ddebug_apply_class_bitmap(dcp, &curr_bits, &old_bits, NULL); + totct +=3D ddebug_apply_class_bitmap(dcp, &curr_bits, old_bits, NULL); *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); @@ -754,7 +755,7 @@ static int param_set_dyndbg_module_classes(const char *= instr, inrep &=3D CLASSMAP_BITMASK(map->length); } v2pr_info("bits:0x%lx > %s.%s\n", inrep, mod_name ?: "*", KP_NAME(kp)); - totct +=3D ddebug_apply_class_bitmap(dcp, &inrep, dcp->bits, mod_name); + totct +=3D ddebug_apply_class_bitmap(dcp, &inrep, *dcp->bits, mod_name); *dcp->bits =3D inrep; break; case DD_CLASS_TYPE_LEVEL_NUM: @@ -767,7 +768,7 @@ static int param_set_dyndbg_module_classes(const char *= instr, old_bits =3D CLASSMAP_BITMASK(*dcp->lvl); 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); *dcp->lvl =3D inrep; break; default: --=20 2.52.0 From nobody Sun Feb 8 07:58:43 2026 Received: from mail-ot1-f65.google.com (mail-ot1-f65.google.com [209.85.210.65]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0DF69302756 for ; Wed, 14 Jan 2026 01:59:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.65 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768355980; cv=none; b=ofw3Ozn+CzZpRkP87BwTr6z7xGkcRU0mDgrK2NEYIPXcLdeYLDhc4DRFdIKPIFRf0BkICVNuShIuUTQzp3tjQ8JrvlWoBDeO2hydBI8aG5kJLxJcpTohwPJK+rSMc45VU7kgXQBZpA82Xt2V2eSd+t6ac0RlRKrGCnYolRsPDY4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768355980; c=relaxed/simple; bh=MVevVZ31CxJkfQFZ+3wAubfOLMLENMAt3zvnrw7vgvs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=hw/3IEqcycBqvAR8uLAT6CRUR1mXUlnfc5RWFJ5LEsrO1L8URCVyCZj6hDw4PrjpIIdzXmc9gL09CsJ5PCPoWjdbSOc9DPWQz/IlOl843Ka4Nba2W8hm0Hp98+30Rc7FAjxb2wcMH07Duf/3bO0gti+1BzVHauJOuVwmoPyYl64= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=doE1jtmg; arc=none smtp.client-ip=209.85.210.65 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="doE1jtmg" Received: by mail-ot1-f65.google.com with SMTP id 46e09a7af769-7cdd651c884so329084a34.1 for ; Tue, 13 Jan 2026 17:59:36 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1768355976; x=1768960776; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=ivVObFpEMeRPBcsYoBwesJyCBQlJUgWhfwCq+iuBLo8=; b=doE1jtmg2ac41dcUEbPuiLzgu5rkU7qmMKcqtk8DIHlDuW/NQjDHaU8huDgqyvXanv 7PbJs3vbOQ1Y2Fun32jU2B/r1gA34Bh1OHSRpFsOaKNKpsvoXA+qMX7VOCKEonIVr/qG T+nVYehpV/NEcXFSVXqNa6XpIb5/RB4hfPllto7WJahGjAj2souVBqNiTBfWmhq8gLSj Ih2caU1crk390yvjW9p/oPMCyrSLqYrEF34aUbdvGrjxV2w/GWoZjyfsRyG2kCqMvpBA 8QISGSKR3YXYe2c0HAndGLoetQcf5W1+DoPUSCBoLUSjm7ZcvkThiSrDf3Z1i1PHVItU gnfw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768355976; x=1768960776; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=ivVObFpEMeRPBcsYoBwesJyCBQlJUgWhfwCq+iuBLo8=; b=bnEVgu7Hw0F5WN/SNpGE/Y1hVwE+uKBk/UpUi+STNlOA4aKfUBbsbDAHRq/k73PZ1c Owo721nWCWK6yabdoeboCiw8oL+GJ/VmiI9s728l6583XRjNAiy5mQ2+sDx+UCzkUXIp Xu0hrsxbjAQqmf82EU/Qa6EPS4kH3RQerB7ieDRXPm/Y6kgrc9Hx4BzPzCbYSL3jOHba yX7OZBG7Yx0TEVnUFXanFdqNkHPYLOTooup+EVKLB/OCb4o+42R/gZmr48Q75H7Mn7Vg TD/rohEzxsSqy4U5/sMNV1Vim/bz+rl0Ac0QlvPyGvS0WjGT/YlZgZZM+QuEIwrAnA3+ SI2A== X-Forwarded-Encrypted: i=1; AJvYcCWglX2c1E/kvD/t3hDX3gXm59xvtD8o8ci6IVsU0arl58GL0f0ZsMBEl7eQVBml5rnx2dZarEbzc5/jfEY=@vger.kernel.org X-Gm-Message-State: AOJu0YxMunTqnsz6JbzNOml9eAOHZk/1nElaXsDnqjIvnxByZx+DqGZc DdqA9ZKRh0AnqGGez0DgtINhlsS6/+OILiiUKhP1SgqGejNjmiFrjfXS X-Gm-Gg: AY/fxX739Ni6EpqSHpmVXrgmoedUNw4yKrKYaPgmeCcDZGfWob0bPAj6CT4BHitaPFy 6oU0cF1kr/UnrFSp1UuYKAcMcIHZxTGH410LzMsTbdIrbrLcNP0qdJWSSmRtlcLLWUojmYInPiN 3s/uVX1Fp7H7mP1JlgGvdQynhxiJyPwcymU3elXTvFM9NLiebD3QdCLjmjiMnHFRrATtAmCsFYn MX4ajagaBLk/VUh266stp+IvXCxwqIYYcGg0URBIurHBBxUAtVBxzv3y/ngKul8JAUdT+IDA2tA azAIR3+OJp57/W5sE1HrGpnf6E7KvQtNQMLHRRVrsM0Rv4IszLTFTe9hbnh/qUQrPf/H4gmBQZx TYtukgPewL9JE6k1O54Oym1sirkxX2s9NV8vzYY/U0vvMlKOXaUEEOkFo/naU6abOhXI4dOFVPo HRjnhoBiiNesn+mSgU6AKOevlFFeB3dcNWphmS X-Received: by 2002:a9d:6417:0:b0:7c7:6b2e:2c4c with SMTP id 46e09a7af769-7cfbe3db134mr2224026a34.2.1768355975902; Tue, 13 Jan 2026 17:59:35 -0800 (PST) Received: from frodo (c-98-38-17-99.hsd1.co.comcast.net. [98.38.17.99]) by smtp.googlemail.com with ESMTPSA id 46e09a7af769-7ce478af63bsm16441331a34.16.2026.01.13.17.59.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 13 Jan 2026 17:59:35 -0800 (PST) From: Jim Cromie To: gregkh@linuxfoundation.org, linux-kernel@vger.kernel.org Cc: Jim Cromie , Jason Baron , =?UTF-8?q?=C5=81ukasz=20Bartosik?= , Louis Chauvet , Bagas Sanjaya , Dave Airlie , Daniel Vetter , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , dri-devel@lists.freedesktop.org, Petr Mladek , Shuah Khan , linux-doc@vger.kernel.org, Steven Rostedt , "Liam R. Howlett" Subject: [PATCH v8 13/31] dyndbg: replace classmap list with a vector Date: Tue, 13 Jan 2026 18:57:29 -0700 Message-ID: <20260114015815.1565725-14-jim.cromie@gmail.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260114015815.1565725-1-jim.cromie@gmail.com> References: <20260114015815.1565725-1-jim.cromie@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Classmaps are stored in an elf section/array, but currently are individually list-linked onto dyndbg's per-module ddebug_table for operation. This is unnecessary. Just like dyndbg's descriptors, classes are packed in compile order; so even with many builtin modules employing multiple classmaps, each modules' maps are packed contiguously, and can be treated as a array-start-address & array-length. So this drops the whole list building operation done in ddebug_attach_module_classes(), and removes the list-head members. The "select-by-modname" condition is reused to find the start,end of the subrange. NOTE: This "filter-by-modname" on classmaps should really be done in ddebug_add_module(1); ie at least one step closer to ddebug_init(2), which already splits up pr-debug descriptors into subranges by modname, then calls (1) on each. (2) knows nothing of classmaps currently, and doesn't need to. For now, just add comment. Reviewed-by: Louis Chauvet Signed-off-by: Jim Cromie --- include/linux/dynamic_debug.h | 1 - lib/dynamic_debug.c | 62 ++++++++++++++++++----------------- 2 files changed, 32 insertions(+), 31 deletions(-) diff --git a/include/linux/dynamic_debug.h b/include/linux/dynamic_debug.h index c4ae79f934d9..51ed26e42032 100644 --- a/include/linux/dynamic_debug.h +++ b/include/linux/dynamic_debug.h @@ -83,7 +83,6 @@ enum 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 db0559763e60..e882e951d585 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 { @@ -148,12 +149,13 @@ static void vpr_info_dq(const struct ddebug_query *qu= ery, 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; @@ -164,7 +166,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 @@ -226,7 +227,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); @@ -1133,9 +1134,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 @@ -1219,30 +1221,31 @@ 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++; } } - 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 /* @@ -1274,10 +1277,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); @@ -1390,8 +1392,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.52.0 From nobody Sun Feb 8 07:58:43 2026 Received: from mail-ot1-f43.google.com (mail-ot1-f43.google.com [209.85.210.43]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id ED8402F2613 for ; Wed, 14 Jan 2026 01:59:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768355984; cv=none; b=UYTCUNaNBHn3DQfZFp2Qy5qvXxOz72BKKjGb0Agiz0OmF9ncOUGHlkbEjAubmgZRFAqNhfzybt0YxRJ/rgOqD0Ma9pKkkmwf8eIkDS8kmwV/wQ/0SHC+v2NTOtQIWl66ceB97vw2dBTsJxyTasS6h64OhCoUqRK9ukwDfhMWNeQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768355984; c=relaxed/simple; bh=TSXDdRzLQdSbpJpDeZuG1st+znW3KridOVeec5hbkSE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=o9d8IshBHikeiLxO2WUdGK5VN31PbjNfpiUodW/d5CzKpLaAscXYEHxNZ746o8YSKfR9DADfvto74PN7vCyx8UAZZjCnjOaMxH42iguFesEz1FMOPD5JxlOmMb4PJ/rTyXxVBhxIst4o2/ZNHFMlGuBJWBLAGxQ193uIUViJF1E= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=ienRRb1q; arc=none smtp.client-ip=209.85.210.43 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="ienRRb1q" Received: by mail-ot1-f43.google.com with SMTP id 46e09a7af769-7c6d3676455so4292634a34.2 for ; Tue, 13 Jan 2026 17:59:40 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1768355980; x=1768960780; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=BxdE6+GTYqwM0IzjlMegZ9h6k5RpMRRS5FRcIzbLHHk=; b=ienRRb1qcTbqN1VJvJZ3i1fYzXnpNLPDkdQE/zIIJ/rhMfSCCLW+5bMQI1VjXt4f85 2vyxJJSCjUoimVZwO26AUpIe/8wfpiQmGI4la8H1MFTFm07opL9fEUewOrSUYV4G3zmi 23A9ZOBNURrLPOdMG2gZF/21Vj0pnO3gKzT0w3aQFVJ5Ov4jT14oKL8cLtXjCjZ+MuKj O6G6JWXp+CNWl9WlMS5QU26/qtPUTyNoAJ386hP3LsRrVNliiHBtTBZpBGCFardm5aKC UwJ3WGiQlfjRh3POdmPfBYs8IumfTsxskJv351o2hdjtnxbmmxfc2Rb/n+iAV+tKgWyJ hgxg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768355980; x=1768960780; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=BxdE6+GTYqwM0IzjlMegZ9h6k5RpMRRS5FRcIzbLHHk=; b=iriNvZmBq7cZBY+AadfDFJ2mi71cahYlat3Ix2uBwQD90CoroPxATatD9dNlWKgKXQ BmJSGni+dUJVlIwWhMWdvXnqqnJ2rJ22wji9tth+/9AaHrqpQKm35v0QdhItqhWu0hIE 4TkdcMwo+z19My/zyr5Q6ZVQ49C0x9IuaBer9X00TSZ1hSFPlIboNdoBJqR9X3CTNBK+ Z/+sMDanITaNlxM8F0QdwY8Rg4XKWFHKNlYn4rL3/znpzI6BcClurzNRUxP7Yu4j5Iaj 3FOWe5M8YWWT+2FpEUjOGW5kVCB5u74py9cBZRKC9EJaL/BgdxJ/r/TTRhNMVN2RNeM4 ZZRQ== X-Forwarded-Encrypted: i=1; AJvYcCXQrTx2buBkk69tKVwEiurXp3IYp+IjnnaYua/mcmF5775bhe6c3L4BHFKw+e+/E24Hl5Ti2IphqQaOFtk=@vger.kernel.org X-Gm-Message-State: AOJu0Yxw5tStCx4fnfQM0XjlkyYcLEoqW4gFOQuI6/YaL4LFQQ28yOo6 /AqyShRtlHBXm0Du6glFpqTG9MJs5maWburLwWuPW4x6jkiraOx8jqW8 X-Gm-Gg: AY/fxX7nYG15ZYqwnMYzUNTNPMH0zzmtkGRXwz27llLsLD7f+y0QwwA6/4b5lcs5rML 32h/2ujnov82+KNksgD2WXIlstXvm8dDjhGn1/pMc9alt2w3O0jAxPvSQnWv5OIVNOHXvMPrWyE rNlSaWpUmBhjCQJNnwaixPAwahsApFnEqOKzjGhKjM7qQ5fe1A48/zruv08fsMhcxKvtR0QoiaD wgd9X62SwwKACLwJPhBvGJHLWxJhtI1T1PkDk8mL5EVFdv7nPjy8ye7DoyLEZoHC1p2c/NSAXJf UcGQ8hjxbzwBW7QuuVajpj4dQtdUiyy9BrK+5VbBLYfHrCWfbh+oLEuLr5g249ckBcYWg9jwn0O r25g0m8Q+rnLkk0tf7uWRZ7TM4szkPk+wWRjpuZ4bXsngncgRsNRND5g7dE/8gONF16R3ci+vGd WCnZhGoLhdoXKRyxovf3QSf/CfRtMp3SXt6tyj X-Received: by 2002:a05:6830:6a14:b0:7bc:626c:3b30 with SMTP id 46e09a7af769-7cfc8b69bdcmr827161a34.26.1768355979852; Tue, 13 Jan 2026 17:59:39 -0800 (PST) Received: from frodo (c-98-38-17-99.hsd1.co.comcast.net. [98.38.17.99]) by smtp.googlemail.com with ESMTPSA id 46e09a7af769-7ce47802966sm16830435a34.4.2026.01.13.17.59.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 13 Jan 2026 17:59:39 -0800 (PST) From: Jim Cromie To: gregkh@linuxfoundation.org, linux-kernel@vger.kernel.org Cc: Jim Cromie , Jason Baron , =?UTF-8?q?=C5=81ukasz=20Bartosik?= , Louis Chauvet , Bagas Sanjaya , Dave Airlie , Daniel Vetter , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , dri-devel@lists.freedesktop.org, Petr Mladek , Shuah Khan , linux-doc@vger.kernel.org, Steven Rostedt , "Liam R. Howlett" Subject: [PATCH v8 14/31] dyndbg: macrofy a 2-index for-loop pattern Date: Tue, 13 Jan 2026 18:57:30 -0700 Message-ID: <20260114015815.1565725-15-jim.cromie@gmail.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260114015815.1565725-1-jim.cromie@gmail.com> References: <20260114015815.1565725-1-jim.cromie@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" dynamic-debug currently has 2 __sections (__dyndbg, __dyndb_classes), struct _ddebug_info keeps track of them both, with 2 members each: _vec and _vec#_len. We need to loop over these sections, with index and record pointer, making ref to both _vec and _vec_len. This is already fiddly and error-prone, and will get worse as we add a 3rd section. Lets instead embed/abstract the fiddly-ness in the `for_subvec()` macro, and avoid repeating it going forward. This is a for-loop macro expander, so it syntactically expects to precede either a single statement or a { block } of them, and the usual typeof or do-while-0 tricks are unavailable to fix the multiple-expansion warning. The macro needs a lot from its caller: it needs 2 local vars, 1 of which is a ref to a contained struct with named members. To support these requirements, add: 1. __ASSERT_IS_LVALUE(_X): ie: ((void)sizeof((void)0, &(x))) 2. __ASSERT_HAS_VEC_MEMBERS(_X, _Y): compile-time check that the _Y "vector" exists ie: _X->_Y and _X->num##_Y are lvalues. The for_subvec() macro then invokes these before the for-loop itself; they disappear at runtime. They do cause a "complex macro" CHECK from checkpatch --strict. Signed-off-by: Jim Cromie --- lib/dynamic_debug.c | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c index e882e951d585..94d05d09a128 100644 --- a/lib/dynamic_debug.c +++ b/lib/dynamic_debug.c @@ -128,6 +128,28 @@ do { \ #define v3pr_info(fmt, ...) vnpr_info(3, fmt, ##__VA_ARGS__) #define v4pr_info(fmt, ...) vnpr_info(4, fmt, ##__VA_ARGS__) =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 __ASSERT_IS_LVALUE(x) ((void)sizeof((void)0, &(x))) +#define __ASSERT_HAS_VEC_MEMBER(_box, _vec) ({ \ + (void)sizeof((_box)->_vec); \ + (void)sizeof((_box)->num_##_vec); \ +}) +#define for_subvec(_i, _sp, _box, _vec) \ + __ASSERT_IS_LVALUE(_i); \ + __ASSERT_IS_LVALUE(_sp); \ + __ASSERT_HAS_VEC_MEMBER(_box, _vec); \ + for ((_i) =3D 0, (_sp) =3D (_box)->_vec; \ + (_i) < (_box)->num_##_vec; \ + (_i)++, (_sp)++) + static void vpr_info_dq(const struct ddebug_query *query, const char *msg) { /* trim any trailing newlines */ @@ -155,7 +177,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; @@ -1231,8 +1253,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.52.0 From nobody Sun Feb 8 07:58:43 2026 Received: from mail-oo1-f41.google.com (mail-oo1-f41.google.com [209.85.161.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 40DAE303A12 for ; Wed, 14 Jan 2026 01:59:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.161.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768355989; cv=none; b=sx1gPYjw2yEbWBqjwq56Ipz9/1kbZoTlCL8zNZMc1JmrMr58Nwwby4yGp9DCeFsTRISS4ozdrqTUivqVUHzoxa1akiD4sugPDXbzCVwcA8o9FfkJFs/FAA47vx6sNRLdm9Q4VOvyWgjS1hBW1ZIKepe7JlEqZoN5OcGY86LadqA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768355989; c=relaxed/simple; bh=2My1GCTvSvF9K2fM3ICVzqrwuqUoINM7B7YKTzhi2OQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=MCqowPGXEwQZ6p8upMDm0f0idYsOH++nBmnjDmDmigJRGfPaxDqLVJcEfo5pikGYYKPt1/qpBxPSsxpKOphQJW5q8GV4CvHpXslMrXTnWJfL7iO77wbUMVJOI1MzpesZqyO1+2xNFpLljVUkw3JBv+OtY9nzqiLDVhhgYMpwRtg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=iipWleSQ; arc=none smtp.client-ip=209.85.161.41 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="iipWleSQ" Received: by mail-oo1-f41.google.com with SMTP id 006d021491bc7-65ecd7fcf36so4684026eaf.1 for ; Tue, 13 Jan 2026 17:59:46 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1768355984; x=1768960784; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=UkB9s3pEBY6OaozwfpW+fCpyhPfnvmBoicvFLFhGPb4=; b=iipWleSQ1RGKj4dIDDEUIQFn8teC4/3WMN/+gaWGoDy9glW8m9ZW8lHoK3ken0TgC0 izvenEGZyNNnZqotwKXqRg4/FgyJWPGTxYjZrxXOV618leeVXiCeccpm8NDWluMj+r3v jSi/6eRkDgLPuk/dJh1zNF0hlaEPJHxgMfJpGI+2QJaE8NB17J367pcbQ1E8i03NvWoL B6+EkMwGNsL5KwzVXe/9ZszMPDMpxtxxd4wAtlqwVOil9EwPhSCkjiLfhJMjbtm23F6N pQhu3JRKT1gVr8ljC+37BWtFef2BOmKq3Zpz9E2vC2SLIFfm7d6AsYNnkB6KD14hwaZs qwyA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768355984; x=1768960784; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=UkB9s3pEBY6OaozwfpW+fCpyhPfnvmBoicvFLFhGPb4=; b=R3C9WVGa7S3UBlYZduHsukn8az+3iQEbJO+5u79XPZ4IrrWf8bvtgriPDkmbqH31DK RtgWus1ByTIHrL6UatO7s7Sk1lZwM7cso2myT9HrtL87XGCrVyPaEdTfhEQreJCvDiun yxQdOZCgi+XHmzKT5rca7fClghAtNfSdsNkooGdkcj8N+UQL1jshq/wgQ8B0VuROLsUV LWXD9Yc0042BgR7L2ZjW4TIKkhwS7ag6S6PdlmspsbER2neLm8zYDln7re+Y3IzIG11i /XAJtWvMYiuL0MBoqXXyJ5uY9E4f9pBYzRimCy8O4Lhj6bAzE8DuV7muEeRihfvKKoRF 98Bw== X-Forwarded-Encrypted: i=1; AJvYcCXQAom9vq7sZW8iLUO+EhQwmeCz2rTkKdgT91kBlHQuzQJh2l4h4pVSAJ8xTgOL3d3N4/38S2ItgqBj9Rk=@vger.kernel.org X-Gm-Message-State: AOJu0Yw2H7mxu4XVKg3MS8uhBeAmuw74riJFtH3GS9Y4hUm9BCiG1Rv8 C77pYyNhDQZg4TVKSyY2yB4ArtRfbP3drXC+zBbT4XTrXZxFDJ9qbyFC X-Gm-Gg: AY/fxX591+ii/PXitzU1xnBIkOiskV5WEl+H8dxk7NCYJhkZ6iJ1WQQsMH2ZNwk3qFs M8b6kD3Bby39bSjgJZ9iNjhN0MKMkipSRl5dBj9mHtJhGYZ2C7xIkRCL/S5lWUQDzcthzP8K45s 7r4eyw0/J7ThyAdZAxROX5/HAa1tBWsG9DRZIlxSEidRFEephO82YrJDm+x2ZfIQDSOAbvyIWUa NYmNbo8+B4WvDbjA6eOqvzeNV+Njg71ff83OlPSJoVHDiQJ2xzBX3VHnlYTi12FgrpU0ZtgAbBS 8SqBpRs9IrYHRxrDfIfpS1dGYHISvI1lUWlZY6bWUS5HRcK3PIucshIRSY9DzWxNfIfCIdPnNKe i56/AZN3SmHr1jFJluRtKNkhTNx+V7K6mug8QCC6vqTAPVTvudyatvN5VMaaTlWNeDkYCKZo8Hf 2DfEL2TAtXqg2ldVtyrVPz/bNeEHS/RiGrWQSp X-Received: by 2002:a05:6820:122:b0:65f:6601:b361 with SMTP id 006d021491bc7-66102afd3ddmr407436eaf.12.1768355983842; Tue, 13 Jan 2026 17:59:43 -0800 (PST) Received: from frodo (c-98-38-17-99.hsd1.co.comcast.net. [98.38.17.99]) by smtp.googlemail.com with ESMTPSA id 006d021491bc7-65f48cb131asm9588340eaf.9.2026.01.13.17.59.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 13 Jan 2026 17:59:43 -0800 (PST) From: Jim Cromie To: gregkh@linuxfoundation.org, linux-kernel@vger.kernel.org Cc: Jim Cromie , Jason Baron , =?UTF-8?q?=C5=81ukasz=20Bartosik?= , Louis Chauvet , Bagas Sanjaya , Dave Airlie , Daniel Vetter , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , dri-devel@lists.freedesktop.org, Petr Mladek , Shuah Khan , linux-doc@vger.kernel.org, Steven Rostedt , "Liam R. Howlett" Subject: [PATCH v8 15/31] dyndbg,module: make proper substructs in _ddebug_info Date: Tue, 13 Jan 2026 18:57:31 -0700 Message-ID: <20260114015815.1565725-16-jim.cromie@gmail.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260114015815.1565725-1-jim.cromie@gmail.com> References: <20260114015815.1565725-1-jim.cromie@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" 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 rid for_subvec() of its num##_vec paste-up. Also recompose struct ddebug_table to contain a _ddebug_info. This reinforces its use as a cursor into relevant data for a builtin module, and access to the full _ddebug state for modules. NOTES: 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. Fixup names: Normalize all struct names to "struct _ddebug_*" eliminating the minor/stupid variations created in classmaps-v1. Also normalize the __section names to "__dyndbg_*". 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 --- include/asm-generic/vmlinux.lds.h | 4 +- include/linux/dynamic_debug.h | 42 ++++++---- kernel/module/main.c | 12 +-- lib/dynamic_debug.c | 127 +++++++++++++++--------------- lib/test_dynamic_debug.c | 2 +- 5 files changed, 100 insertions(+), 87 deletions(-) diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinu= x.lds.h index e04d56a5332e..da15cf0c16d0 100644 --- a/include/asm-generic/vmlinux.lds.h +++ b/include/asm-generic/vmlinux.lds.h @@ -366,8 +366,8 @@ defined(CONFIG_AUTOFDO_CLANG) || defined(CONFIG_PROPELL= ER_CLANG) *(__tracepoints) \ /* implement dynamic printk debug */ \ . =3D ALIGN(8); \ - BOUNDED_SECTION_BY(__dyndbg_classes, ___dyndbg_classes) \ - BOUNDED_SECTION_BY(__dyndbg, ___dyndbg) \ + BOUNDED_SECTION_BY(__dyndbg_class_maps, ___dyndbg_class_maps) \ + BOUNDED_SECTION_BY(__dyndbg_descriptors, ___dyndbg_descs) \ CODETAG_SECTIONS() \ LIKELY_PROFILE() \ BRANCH_PROFILE() \ diff --git a/include/linux/dynamic_debug.h b/include/linux/dynamic_debug.h index 51ed26e42032..4775f66e96dd 100644 --- a/include/linux/dynamic_debug.h +++ b/include/linux/dynamic_debug.h @@ -82,30 +82,42 @@ enum class_map_type { */ }; =20 -struct ddebug_class_map { - struct module *mod; - const char *mod_name; /* needed for builtins */ +struct _ddebug_class_map { + struct module *mod; /* NULL for builtins */ + const char *mod_name; 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; }; =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; + int len; +}; + +struct _ddebug_class_maps { + struct _ddebug_class_map *start; + int len; +}; + struct _ddebug_info { - struct _ddebug *descs; - struct ddebug_class_map *classes; - unsigned int num_descs; - unsigned int num_classes; + struct _ddebug_descs descs; + struct _ddebug_class_maps maps; }; =20 -struct ddebug_class_param { +struct _ddebug_class_param { union { unsigned long *bits; unsigned long *lvl; }; char flags[8]; - const struct ddebug_class_map *map; + const struct _ddebug_class_map *map; }; =20 /* @@ -124,8 +136,8 @@ 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 { \ + static struct _ddebug_class_map __aligned(8) __used \ + __section("__dyndbg_class_maps") _var =3D { \ .mod =3D THIS_MODULE, \ .mod_name =3D KBUILD_MODNAME, \ .base =3D _base, \ @@ -159,7 +171,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_descriptors") name =3D { \ .modname =3D KBUILD_MODNAME, \ .function =3D __func__, \ .filename =3D __FILE__, \ @@ -242,7 +254,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 @@ -252,7 +264,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 c66b26184936..1ccc5d4399c3 100644 --- a/kernel/module/main.c +++ b/kernel/module/main.c @@ -2710,12 +2710,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_descriptors= ", + 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 94d05d09a128..c9377a444fc8 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 { @@ -135,20 +133,21 @@ do { \ * @_i: caller provided counter. * @_sp: cursor into _vec, to examine each item. * @_box: ptr to a struct containing @_vec member - * @_vec: name of a member in @_box + * @_vec: name of a a vector member in @_box */ + #define __ASSERT_IS_LVALUE(x) ((void)sizeof((void)0, &(x))) -#define __ASSERT_HAS_VEC_MEMBER(_box, _vec) ({ \ - (void)sizeof((_box)->_vec); \ - (void)sizeof((_box)->num_##_vec); \ +#define __ASSERT_HAS_VEC_MEMBER(_box, _vec) ({ \ + (void)sizeof((_box)->_vec.start); \ + (void)sizeof((_box)->_vec.len); \ }) #define for_subvec(_i, _sp, _box, _vec) \ __ASSERT_IS_LVALUE(_i); \ __ASSERT_IS_LVALUE(_sp); \ __ASSERT_HAS_VEC_MEMBER(_box, _vec); \ - for ((_i) =3D 0, (_sp) =3D (_box)->_vec; \ - (_i) < (_box)->num_##_vec; \ - (_i)++, (_sp)++) + for ((_i) =3D 0, (_sp) =3D (_box)->_vec.start; \ + (_i) < (_box)->_vec.len; \ + (_i)++, (_sp)++) /* { block } */ =20 static void vpr_info_dq(const struct ddebug_query *query, const char *msg) { @@ -170,14 +169,14 @@ static void vpr_info_dq(const struct ddebug_query *qu= ery, const char *msg) query->first_lineno, query->last_lineno, query->class_string); } =20 -static struct ddebug_class_map *ddebug_find_valid_class(struct ddebug_tabl= e const *dt, +static struct _ddebug_class_map *ddebug_find_valid_class(struct ddebug_tab= le const *dt, const char *class_string, int *class_id) { - struct ddebug_class_map *map; + 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; @@ -248,7 +247,7 @@ static int ddebug_change(const struct ddebug_query *que= ry, unsigned int newflags; unsigned int nfound =3D 0; struct flagsbuf fbuf, nbuf; - struct ddebug_class_map *map =3D NULL; + struct _ddebug_class_map *map =3D NULL; int valid_class; =20 /* search for matching ddebugs */ @@ -269,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; @@ -628,14 +627,14 @@ static int ddebug_exec_queries(char *query, const cha= r *modname) } =20 /* apply a new class-param setting */ -static int ddebug_apply_class_bitmap(const struct ddebug_class_param *dcp, +static int ddebug_apply_class_bitmap(const struct _ddebug_class_param *dcp, const unsigned long *new_bits, const unsigned long old_bits, const char *query_modname) { #define QUERY_SIZE 128 char query[QUERY_SIZE]; - const struct ddebug_class_map *map =3D dcp->map; + const struct _ddebug_class_map *map =3D dcp->map; int matches =3D 0; int bi, ct; =20 @@ -671,8 +670,8 @@ static int ddebug_apply_class_bitmap(const struct ddebu= g_class_param *dcp, /* 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; + 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; @@ -742,8 +741,8 @@ static int param_set_dyndbg_module_classes(const char *= instr, const struct kernel_param *kp, const char *mod_name) { - const struct ddebug_class_param *dcp =3D kp->arg; - const struct ddebug_class_map *map =3D dcp->map; + 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; int rc, totct =3D 0; =20 @@ -830,8 +829,8 @@ EXPORT_SYMBOL(param_set_dyndbg_classes); */ int param_get_dyndbg_classes(char *buffer, const struct kernel_param *kp) { - const struct ddebug_class_param *dcp =3D kp->arg; - const struct ddebug_class_map *map =3D dcp->map; + const struct _ddebug_class_param *dcp =3D kp->arg; + const struct _ddebug_class_map *map =3D dcp->map; =20 switch (map->map_type) { =20 @@ -1082,8 +1081,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 /* @@ -1104,10 +1103,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 /* @@ -1151,16 +1150,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; @@ -1193,7 +1195,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 @@ -1245,7 +1247,7 @@ static const struct proc_ops proc_fops =3D { =20 static void ddebug_attach_module_classes(struct ddebug_table *dt, struct _= ddebug_info *di) { - struct ddebug_class_map *cm; + struct _ddebug_class_map *cm; int i, nc =3D 0; =20 /* @@ -1253,18 +1255,18 @@ 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++; } } if (nc) { - dt->num_classes =3D nc; + dt->info.maps.len =3D nc; vpr_info("module:%s attached %d classes\n", dt->mod_name, nc); } } @@ -1277,10 +1279,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(sizeof(*dt), GFP_KERNEL); if (dt =3D=3D NULL) { @@ -1294,19 +1296,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 @@ -1453,10 +1454,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 @@ -1467,7 +1468,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; @@ -1477,16 +1478,16 @@ 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++) { =20 if (strcmp(modname, iter->modname)) { mod_ct++; - di.num_descs =3D mod_sites; - di.descs =3D iter_mod_start; + 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; @@ -1496,8 +1497,8 @@ static int __init dynamic_debug_init(void) iter_mod_start =3D iter; } } - di.num_descs =3D mod_sites; - di.descs =3D iter_mod_start; + 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; @@ -1507,8 +1508,8 @@ static int __init dynamic_debug_init(void) i, mod_ct, (int)((mod_ct * sizeof(struct ddebug_table)) >> 10), (int)((i * sizeof(struct _ddebug)) >> 10)); =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. diff --git a/lib/test_dynamic_debug.c b/lib/test_dynamic_debug.c index 396144cf351b..8434f70b51bb 100644 --- a/lib/test_dynamic_debug.c +++ b/lib/test_dynamic_debug.c @@ -41,7 +41,7 @@ module_param_cb(do_prints, ¶m_ops_do_prints, NULL, 06= 00); */ #define DD_SYS_WRAP(_model, _flags) \ static unsigned long bits_##_model; \ - static struct ddebug_class_param _flags##_model =3D { \ + static struct _ddebug_class_param _flags##_model =3D { \ .bits =3D &bits_##_model, \ .flags =3D #_flags, \ .map =3D &map_##_model, \ --=20 2.52.0 From nobody Sun Feb 8 07:58:43 2026 Received: from mail-ot1-f67.google.com (mail-ot1-f67.google.com [209.85.210.67]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8AEDC2F3622 for ; Wed, 14 Jan 2026 01:59:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.67 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768355991; cv=none; b=TnfrIM2xVNZsTKdD3Bq+d+Gufj7PnCudW1CTd9pS0QmPk/c0a9qSyVzeXrijwoo01yezrKGWm4gw4MVQ+1BWmOyldBmDq2llDPlQcJ9GJcGQwPzxUE8y0Xx4NPdC1yXQrsdzg3nTRynYe5UyFm9ArmLpFloGv6XgWLD/+rYjOdY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768355991; c=relaxed/simple; bh=lMCW/HO3dpm3FiqsuiIdY8qF5JU5ohZP1EB8BC3NbAE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=SyccUBgegBtP/b11emfngrkKfjr6Vq2VqkG1VO52laeB+KVEUzuMcRwtCdedEYM5pef4XSCZcp9Pt1TWAnrio2iuxJiWqiXQChHlQWL9qS5wqlMXEloO1w2Q4LkXep6Sq76nipE2U63kkh+vq2zvtFxY4gxUEdsu9fweBjAdAu4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=VptANuIs; arc=none smtp.client-ip=209.85.210.67 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="VptANuIs" Received: by mail-ot1-f67.google.com with SMTP id 46e09a7af769-7c7613db390so5004004a34.2 for ; Tue, 13 Jan 2026 17:59:48 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1768355988; x=1768960788; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=saj8Myj0AXkSu5hKZJBWN47Kb5BefKCe0HbhKcuaxLQ=; b=VptANuIsH8IZTKy0lN9A/LpjBIPkQRvpyFkJUgGPlQH11J/WdXwtalxz0Bt8A3O8rc cMwIyIXWqN0+fKoaH/H2okVmzZX1nB8eGBgspwB7YPBM8VoSB/mSDGTjSqX5Rs9LYJFN +d1AAJxM+qv+8DmYU8R+eUIc4kxyYW1BGaVtL3xrLiTBEadwagd6GjS+5XyeSh97oqQe G3eqDf1gIukBxVQz9lk1ubBIeNpjdnZoFFtVX2dFDtd4QuIt6jbXEaLYgrAkvFixsRF9 bz/dQtpMgSMDGsZk8+0QDX0WlgyhORzWYQhopH2d9Kz9tuCZ6iRLTmkbSTuUAi1GnVoO UATw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768355988; x=1768960788; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=saj8Myj0AXkSu5hKZJBWN47Kb5BefKCe0HbhKcuaxLQ=; b=Pixpu3W+ei7/aDVKibM1ZCcoV3Vt6oT+H1i2sh0Kp15eu9zwdUm3vnARUbSoraenK6 JAQ6rwzqf23RCUXbMAMAirbHjbHRfQaUa/CvTo1LAZYHRh/Exf/0e3q/9fySTvMyVvX5 TMaj/FUaAj3C8v9Rin/DViNio5npuJVnnTTqrY6NoUqBE0wpitR58smUezGz2Pnuj8pi WkkV89VHRVeq28Nu1MVRTKWFNM8Tmy2Y9dgWWDZQu9M8gSnMj/Mfngn0CxAB3GBv8505 /cp5JBEWZ5c5uu6AkFn9ZysqRXpkPGkLj+BcnAkf6pq/MxwycBSB3Qz+bUomiyJ8/0/w pW8Q== X-Forwarded-Encrypted: i=1; AJvYcCX4t2pYYD5xKNFPL+uqRVSsJ6zmcJv4YNGoXIA92yIJHRVlktDjb3jScwEsH1lYP51Ip469iwT6AgqpXZ4=@vger.kernel.org X-Gm-Message-State: AOJu0YxzCSh7G63PlDEjRim+uLltxkQ0YUaTiVwYAAJdKfCutikCxnHL avAL+cr+ZM9rhaUiZmaeNFaInhVQwIDS+CmY1jvVpQYtMRgNhiVsL1Hg X-Gm-Gg: AY/fxX6l8ap7W7rO487Sq5t2w8Tlu9+iOFCh3mnQsMJ1Mn2yPo5AjCrV7OcGuw5s216 1Q4y0zCQQaX7/zw6pm3n6qYZ0IKZOu+08srID3WVLQ0NPzHthTCTl3UkG3V3vlwfyTk9ZlyG7Sl 5p5S+vQKb+LhnHO9GLx2DgHif56vFQ1EaOdlqSEbyZhGn6z8A1X/Y7VOInWnRdf69n0S+cKpVK/ dhzHv5xRJ2Z4y0dW1snV4wPHi7eTT1+gMh2tmMWxSWxSqKhteFtwOjZTuK3TPCk/PXVm902uAJg ig9dK7MCwkJQTpjXMxkolv3xx5qp1PLwSkCTquglgJ/AiaNR3HcjCuVxMe6yEWigFNQMOMxMLIq WCWHlyXgjrVvkO1AshrEmYy5Rq16E0/YkJieg5bo+zOBm4oeeDRTSu8A26D9IqfD+QpGbk9ePza SM2ur4pjrl1Od5EgWAFipwvwMZDhufr2IbSxky X-Received: by 2002:a05:6830:90f:b0:7ca:c7b0:17eb with SMTP id 46e09a7af769-7cfcb5d58f9mr497841a34.10.1768355987913; Tue, 13 Jan 2026 17:59:47 -0800 (PST) Received: from frodo (c-98-38-17-99.hsd1.co.comcast.net. [98.38.17.99]) by smtp.googlemail.com with ESMTPSA id 46e09a7af769-7ce47820f06sm16693548a34.11.2026.01.13.17.59.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 13 Jan 2026 17:59:47 -0800 (PST) From: Jim Cromie To: gregkh@linuxfoundation.org, linux-kernel@vger.kernel.org Cc: Jim Cromie , Jason Baron , =?UTF-8?q?=C5=81ukasz=20Bartosik?= , Louis Chauvet , Bagas Sanjaya , Dave Airlie , Daniel Vetter , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , dri-devel@lists.freedesktop.org, Petr Mladek , Shuah Khan , linux-doc@vger.kernel.org, Steven Rostedt , "Liam R. Howlett" Subject: [PATCH v8 16/31] dyndbg: hoist classmap-filter-by-modname up to ddebug_add_module Date: Tue, 13 Jan 2026 18:57:32 -0700 Message-ID: <20260114015815.1565725-17-jim.cromie@gmail.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260114015815.1565725-1-jim.cromie@gmail.com> References: <20260114015815.1565725-1-jim.cromie@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The body of ddebug_attach_module_classes() is dominated by 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 --- reordered params to match kdoc --- lib/dynamic_debug.c | 57 ++++++++++++++++++++++++++------------------- 1 file changed, 33 insertions(+), 24 deletions(-) diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c index c9377a444fc8..d668140794ac 100644 --- a/lib/dynamic_debug.c +++ b/lib/dynamic_debug.c @@ -170,8 +170,8 @@ static void vpr_info_dq(const struct ddebug_query *quer= y, const char *msg) } =20 static struct _ddebug_class_map *ddebug_find_valid_class(struct ddebug_tab= le const *dt, - const char *class_string, - int *class_id) + const char *class_string, + int *class_id) { struct _ddebug_class_map *map; int i, idx; @@ -1247,30 +1247,35 @@ static const struct proc_ops proc_fops =3D { =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->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++; - } - } - if (nc) { - dt->info.maps.len =3D nc; - vpr_info("module:%s attached %d classes\n", dt->mod_name, nc); - } + vpr_info("module:%s attached %d classes\n", dt->mod_name, dt->info.maps.l= en); } =20 +/* + * Walk the @_box->@_vec member, over @_vec.start[0..len], and find + * the contiguous subrange of elements matching on ->mod_name. Copy + * the subrange into @_dst. This depends on vars defd by caller. + * + * @_i: caller provided counter var, init'd by macro + * @_sp: cursor into @_vec. + * @_box: contains member named @_vec + * @_vec: member-name of a type with: .start .len fields. + * @_dst: an array-ref: to remember the module's subrange + */ +#define dd_mark_vector_subrange(_i, _sp, _box, _vec, _dst) ({ \ + typeof(_dst) __dst =3D (_dst); \ + int __nc =3D 0; \ + for_subvec(_i, _sp, _box, _vec) { \ + if (!strcmp((_sp)->mod_name, (_dst)->mod_name)) { \ + if (!__nc++) \ + (__dst)->info._vec.start =3D (_sp); \ + } else { \ + if (__nc) \ + break; /* end of consecutive matches */ \ + } \ + } \ + (__dst)->info._vec.len =3D __nc; \ +}) + /* * Allocate a new ddebug_table for the given module * and add it to the global list. @@ -1278,6 +1283,8 @@ static void ddebug_attach_module_classes(struct ddebu= g_table *dt, struct _ddebug static int ddebug_add_module(struct _ddebug_info *di, const char *modname) { struct ddebug_table *dt; + struct _ddebug_class_map *cm; + int i; =20 if (!di->descs.len) return 0; @@ -1300,6 +1307,8 @@ static int ddebug_add_module(struct _ddebug_info *di,= const char *modname) =20 INIT_LIST_HEAD(&dt->link); =20 + dd_mark_vector_subrange(i, cm, di, maps, dt); + if (di->maps.len) ddebug_attach_module_classes(dt, di); =20 --=20 2.52.0 From nobody Sun Feb 8 07:58:43 2026 Received: from mail-oi1-f196.google.com (mail-oi1-f196.google.com [209.85.167.196]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C88332F3622 for ; Wed, 14 Jan 2026 01:59:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.196 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768355996; cv=none; b=W7vaWHivXG/5XwcAdCCuixbFdmxAFMKEaM53zd2KFwzUVnlitVXkyWXMJmAQGrz9a/pxzpKA0hy6+Cqwt1/+H8e9+GLMXucZ6jn5vtc0mlzmIiTU4SnESp3mjC/LQdWMqlv9rIu7bdDevwUI+O6CB4p95br2O7w4rIe67tmlmxE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768355996; c=relaxed/simple; bh=Sur1FbLe/TV5gZgSr7rckEnVtPl6CsAJr9HA1IILbJE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=jkelhIrugva1cDJyu/ZoBO+jBYmfDi/LpnyYFHmaVGjqCobumG5NAkO+PlSGi0pwHbk4fvs85l0zN0crn3WpDuc00IKhWzKkqPkMvGnNOsjUy6Pnzn3e1etuov7FfpX45p7fS5srntz3XxlCxGF0LJRYljKcIbGmgzRm1x7/3lc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=YkFgzkZ6; arc=none smtp.client-ip=209.85.167.196 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="YkFgzkZ6" Received: by mail-oi1-f196.google.com with SMTP id 5614622812f47-4511f736011so253438b6e.0 for ; Tue, 13 Jan 2026 17:59:52 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1768355992; x=1768960792; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=IgioQELFSWboGT8e1NJA/uyXbHTLXVSWlCnIL2Rpr+0=; b=YkFgzkZ6UxPId1Urcj4iDb+gwIzKx96bLN7zNyXYpFQMKJgm8/SwCp/9bmMTOmKcrt dfKeypXXzpPQ5dDA77rO642nY55mPydGRpI628s6I8b9L52M2SiA5fCSpXbMKaZG6pbN 841rJ6UUSld8BF2rhIP7/j6An1i1JzrKZoL30QSSzOeJb3bdTbZJQE6aNiasmxxsinci 777JE1Jpx3D8Nmd+8NW7tYZ3Q4QLFb45pkE6jlBo4s6wWHKbl0tvXAXUzgpSxPqYnKoQ UaF0+VqlhJDkGSAU4cF6eS0VenNbkQ04Zj7GMJYQvHGG/6Q/BQ9tFyiucD1n9g/7Ry71 8bjQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768355992; x=1768960792; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=IgioQELFSWboGT8e1NJA/uyXbHTLXVSWlCnIL2Rpr+0=; b=KjhzEtLYMMt9Zl+sS6LFg8BFaI8DnodlVHvDPM432TJU4F8ndtjM+Fvyq7GTicdqsT c4DyV3hlAq++HRUBEQzJn02N9NTevVyNfxTMhyYpjWgCIjmNZf/gg93s3lwB4vvoeY1x YMjVy0Z8RRwj0NS03sUxNacuGwiI5zp/GUv2A1Pu2etT7FECxc/DOR4nOJeqKY3Dr/Vu OhHZeZSb58wDNy+hyOQ3F1vGbXb1j1iDfwr+XnUCBQHQTVQ76+piJh33uWaTL7XkAhkU DSE3Kg2Jt+qoWGiJ5oygH2mlp7NlMri8/SULOXk2lpDZeZ/8RAOHnudCmN3jE4e2ixfk 3YGg== X-Forwarded-Encrypted: i=1; AJvYcCU4NWnmYpyGHm2zoaKRGaz06tx/zmWnZa4Vy1vn/xanjNJCbcN12hLkJ4v0IFK72rs87yedZOv/jAXITUg=@vger.kernel.org X-Gm-Message-State: AOJu0YxSmJJvar7JV9uwD+r1Q4QnUPUTNrwAdw3hKfsq8JdrARTjSV5Z mzxqSq9DSiy3am4vlmxGtBlILMsHIu+/lfhsvEOGYxrBMyDtU4VwLZIa X-Gm-Gg: AY/fxX6f+6lWTYZGgUiJjVEO/qxj0UH7fE5V2WWV/rB9UvVpAvs74BKvg5Ka7/JVf6h MrSlzPQ24hfyXzsmNe9qqdpvhpZAr8CalYKTRqgFgINdHefJ0Ao70UauL1Fg+57D21XPdSrbf9G 4NkEd7nP47PoOZBqm/SgLvCNttHQyHBfBlBhMrb4c++xCgpVLQnskoWCFcVyG5GL1xbW6wiQvtj CyV0knZMOLG3+aEyhi40at2fbRks5WG1QCCOhq2z9A9UTpqWqJESs1jpDUvQKX9qSOgoFYofpue 2mc5a+ib+TSng2iUBmMJaAJStawh9rlpvQEEFTCxUsOp73oh/Yv13fAhl9IjQutdiE/iVzP9HZX um0ZteuBq5nTPhD5cLVbTYy2Ud3rg4DMfCATJAOwuotLjRuMB0HoqJPXiMctEjhbJLjykvNxi+Z Ll42pTkI1Ql2jSnya6vQpz5K5/2QE5Enw8WRPzUNoYkTZaRNA= X-Received: by 2002:a05:6808:6602:b0:44f:f025:303e with SMTP id 5614622812f47-45c6210837bmr2726407b6e.6.1768355991634; Tue, 13 Jan 2026 17:59:51 -0800 (PST) Received: from frodo (c-98-38-17-99.hsd1.co.comcast.net. [98.38.17.99]) by smtp.googlemail.com with ESMTPSA id 46e09a7af769-7ce478d9f6dsm17343223a34.24.2026.01.13.17.59.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 13 Jan 2026 17:59:51 -0800 (PST) From: Jim Cromie To: gregkh@linuxfoundation.org, linux-kernel@vger.kernel.org Cc: Jim Cromie , Jason Baron , =?UTF-8?q?=C5=81ukasz=20Bartosik?= , Louis Chauvet , Bagas Sanjaya , Dave Airlie , Daniel Vetter , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , dri-devel@lists.freedesktop.org, Petr Mladek , Shuah Khan , linux-doc@vger.kernel.org, Steven Rostedt , "Liam R. Howlett" Subject: [PATCH v8 17/31] dyndbg: move mod_name down from struct ddebug_table to _ddebug_info Date: Tue, 13 Jan 2026 18:57:33 -0700 Message-ID: <20260114015815.1565725-18-jim.cromie@gmail.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260114015815.1565725-1-jim.cromie@gmail.com> References: <20260114015815.1565725-1-jim.cromie@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" 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 its users keep 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. Reviewed-by: Louis Chauvet Signed-off-by: Jim Cromie --- 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 4775f66e96dd..10f1a2a1bee4 100644 --- a/include/linux/dynamic_debug.h +++ b/include/linux/dynamic_debug.h @@ -107,6 +107,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 d668140794ac..77972da271ee 100644 --- a/lib/dynamic_debug.c +++ b/lib/dynamic_debug.c @@ -46,7 +46,6 @@ extern struct _ddebug_class_map __stop___dyndbg_class_map= s[]; =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; @@ -1156,12 +1156,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 @@ -1189,13 +1189,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 @@ -1247,7 +1247,7 @@ static const struct proc_ops proc_fops =3D { =20 static void ddebug_attach_module_classes(struct ddebug_table *dt, struct _= ddebug_info *di) { - vpr_info("module:%s attached %d classes\n", dt->mod_name, dt->info.maps.l= en); + vpr_info("module:%s attached %d classes\n", dt->info.mod_name, dt->info.m= aps.len); } =20 /* @@ -1265,7 +1265,7 @@ static void ddebug_attach_module_classes(struct ddebu= g_table *dt, struct _ddebug typeof(_dst) __dst =3D (_dst); \ int __nc =3D 0; \ for_subvec(_i, _sp, _box, _vec) { \ - if (!strcmp((_sp)->mod_name, (_dst)->mod_name)) { \ + if (!strcmp((_sp)->mod_name, (__dst)->info.mod_name)) { \ if (!__nc++) \ (__dst)->info._vec.start =3D (_sp); \ } else { \ @@ -1280,7 +1280,7 @@ static void ddebug_attach_module_classes(struct ddebu= g_table *dt, struct _ddebug * 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; struct _ddebug_class_map *cm; @@ -1289,20 +1289,19 @@ static int ddebug_add_module(struct _ddebug_info *d= i, const char *modname) 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(sizeof(*dt), GFP_KERNEL); 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); @@ -1316,7 +1315,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 @@ -1379,7 +1378,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; @@ -1399,7 +1398,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; @@ -1497,7 +1497,8 @@ static int __init dynamic_debug_init(void) mod_ct++; 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 @@ -1508,7 +1509,8 @@ static int __init dynamic_debug_init(void) } 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.52.0 From nobody Sun Feb 8 07:58:43 2026 Received: from mail-oi1-f195.google.com (mail-oi1-f195.google.com [209.85.167.195]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D2A452F49EB for ; Wed, 14 Jan 2026 01:59:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768355998; cv=none; b=VVhIw1RtBXXxaEParPmRlDIQ83Rfu3MA8eQ61Q8pa0sUfXetMJagtbfjDQK25gkJRdGrtByXgcukf1U5knaPCCGGvcwHrBjeNtlnLeJ3TDYVYfo9ulE5aqSbyRTbZFrQXKuqBYl65jLzDP1f3qVEkMASyYJaPYFw5f4xoPwSLkw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768355998; c=relaxed/simple; bh=LyQtU7IM5YItP83p43K3P/yrzodOII11I7s8oZBJaz8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=FXCSUVb+XRfg2mc2Y+ipURIPv8YSYIB1GJa1wEBKsiubeQQRv8oPO1tYsi8AgGvrukv62DOSwpoZGwYR5KaZI5SPRms1UuEWTUQIHDQjqaasxJbZJnz1GR7ArBbiEpiJGG2OUueykE5BFaMBhvqtKSkNayYnTqfC5bPVTiHzOvM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=UiUNc3EU; arc=none smtp.client-ip=209.85.167.195 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="UiUNc3EU" Received: by mail-oi1-f195.google.com with SMTP id 5614622812f47-45c758f516dso46914b6e.2 for ; Tue, 13 Jan 2026 17:59:56 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1768355996; x=1768960796; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=aqRxzgs/sv2u+HD2+/i3mu3+BXksiPWn4mbrBnRTf50=; b=UiUNc3EUusfZh/6JS/c4Zz2w2O5tPOW0HhEcHrljC2kjgRYz1/XibZAA8iOPPShif5 STYJ51STJgGfTtWJ51EFiE4+wgNmf+SQ6cThtun6Jtc/9kDrSCznKSjx6hHCOKoRjB44 yiJoJp72a6rf3Ui4+0r+e1qsD0/0W9SNgcLCVNHqP6P6bhJiex8es/enEmSG2eEMHeAw JfMo+OuxKXd99mgX1+sL8V1NVHyj9kniFKx+YTz0j4Kb25tLLIDtOfSY/ZUyUqDNP9MK W94Mf8k/S8CJli/pzBKeM5PraeLI97T712kKdPBRO/WiHbn0t9ODkWkiwqkrcVrRxxim CP6Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768355996; x=1768960796; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=aqRxzgs/sv2u+HD2+/i3mu3+BXksiPWn4mbrBnRTf50=; b=OTlM/KBlMMWl49iTgmnVhYJYIRCnQrMsm+ij8n/2b/rJErLmvP9nzVGqWr4cDAKfYu Gr06vaOv1+1ZsaRBSlEMqT71bwKBSxT7oeYhHiXhVoKI7HqDWiJKy//0SJW4je/dR5xk 3A8jmZmEy2ndSwY7a867iEhhD1hW1KFx6Xl+oF+YPgujxdSnkbf45lvO1tUg1JdBf43/ pAm+kvn75tGaI6Gm4kULxvZWmB0PkWF6PUil6I991Qv7RFzdQPtU7XyPaHXHKertj5LT C354TWCyX8fX1+HVhTZOW2E3WTuTdRQbCfKd5Ysod7YStazLx7uaBS7Ep/zT97DIsw+S QLTw== X-Forwarded-Encrypted: i=1; AJvYcCWsXv+A5bA4DTE52r2DiEMZW9sCf5udXMYvjg8wLzEAEZebFBA6PnGt0A+8LcUgCmKhdE3yX+FGDcLdHCc=@vger.kernel.org X-Gm-Message-State: AOJu0YysAesmdWiTpLF70NEDGAgmYKYGy4k2BfI4yGfkvf6gYKCCoXuO kzqAwHQbkqKs+xNPdhQAHqnCQU5abeZVXfL8HSIML4rGfzKzwhtMDVqu X-Gm-Gg: AY/fxX4dJz+TsCJU/PONcirpkJp9fRMlbrfxfeUlHnzYpJ1pGHBxSmrnweiJj3g7G4L dqeRjgPzOzbd8zZQED/9nvbYHi2rOIhHSAIdtqa7YdL1qk4mWFrzY+Wzqi0Y+rTP/TtwlqVQ8oR Ttguzot8cc+9F8WfRPNNL+BwKzu7lebP2ojXk25BkCtsHS0Wzgm9fiqh2ukqeuwZPYyjnTtT78t +SjC0qxgONR/GYdmzXJ3/3T80IFe8CrWnA6lgaYmlTOnFzc99GI2bVFiVWXAZlLEEhC/stNeS9M Z6TziJpMEOlzo9L6Q52Us/o2Tra9dHRfzgNoayTsVesFdapYOZGpixJbS/A+Lsbb+QjMLd0ci2A t/WzqghZpSf3sXSKyZFXo8i+37yP+jkmVDpT/rLG73Mdq2hUbK8z2KKvqxf5j5d27vnPZFE8if4 25Pmu4fi1vk6W3Uh0pGP75DUeFJvWWDoP5kcG/mpPrJZWwtAc= X-Received: by 2002:a05:6808:188f:b0:450:760b:cc98 with SMTP id 5614622812f47-45c7146359bmr686799b6e.14.1768355995686; Tue, 13 Jan 2026 17:59:55 -0800 (PST) Received: from frodo (c-98-38-17-99.hsd1.co.comcast.net. [98.38.17.99]) by smtp.googlemail.com with ESMTPSA id 5614622812f47-45a5e2894e0sm10346289b6e.13.2026.01.13.17.59.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 13 Jan 2026 17:59:55 -0800 (PST) From: Jim Cromie To: gregkh@linuxfoundation.org, linux-kernel@vger.kernel.org Cc: Jim Cromie , Jason Baron , =?UTF-8?q?=C5=81ukasz=20Bartosik?= , Louis Chauvet , Bagas Sanjaya , Dave Airlie , Daniel Vetter , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , dri-devel@lists.freedesktop.org, Petr Mladek , Shuah Khan , linux-doc@vger.kernel.org, Steven Rostedt , "Liam R. Howlett" Subject: [PATCH v8 18/31] dyndbg-API: remove DD_CLASS_TYPE_(DISJOINT|LEVEL)_NAMES and code Date: Tue, 13 Jan 2026 18:57:34 -0700 Message-ID: <20260114015815.1565725-19-jim.cromie@gmail.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260114015815.1565725-1-jim.cromie@gmail.com> References: <20260114015815.1565725-1-jim.cromie@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" 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 --- include/linux/dynamic_debug.h | 23 ++------ lib/dynamic_debug.c | 102 +++------------------------------- lib/test_dynamic_debug.c | 26 --------- 3 files changed, 14 insertions(+), 137 deletions(-) diff --git a/include/linux/dynamic_debug.h b/include/linux/dynamic_debug.h index 10f1a2a1bee4..d543b84d447e 100644 --- a/include/linux/dynamic_debug.h +++ b/include/linux/dynamic_debug.h @@ -58,27 +58,16 @@ 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 @@ -88,7 +77,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 /* diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c index 77972da271ee..63bfe1891a9e 100644 --- a/lib/dynamic_debug.c +++ b/lib/dynamic_debug.c @@ -667,76 +667,6 @@ static int ddebug_apply_class_bitmap(const struct _dde= bug_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, NULL); - *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, NULL); - *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; -} - static int param_set_dyndbg_module_classes(const char *instr, const struct kernel_param *kp, const char *mod_name) @@ -745,29 +675,17 @@ static int param_set_dyndbg_module_classes(const char= *instr, const struct _ddebug_class_map *map =3D dcp->map; unsigned long inrep, new_bits, old_bits; int rc, totct =3D 0; - - 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); - - 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); + char *nl; + + rc =3D kstrtoul(instr, 0, &inrep); + if (rc) { + nl =3D strchr(instr, '\n'); + if (nl) + *nl =3D '\0'; + pr_err("expecting numeric input, not: %s > %s\n", 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 */ @@ -833,12 +751,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, "%ld\n", *dcp->lvl); default: diff --git a/lib/test_dynamic_debug.c b/lib/test_dynamic_debug.c index 8434f70b51bb..9c3e53cd26bd 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 10, 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.52.0 From nobody Sun Feb 8 07:58:43 2026 Received: from mail-ot1-f44.google.com (mail-ot1-f44.google.com [209.85.210.44]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id AE70830648C for ; Wed, 14 Jan 2026 02:00:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768356007; cv=none; b=FSsMkM/lsK73DkO9FeaoDEBWfpuou18EC5Ed5H64z0qcodHDFMg1YDY6wyAOB4QQAppKbRZ3cA1YIMxLim501LM4OzbkxGZYEXLL0UHLCLHgRWtesmEtv1NerwLzDTUAKvq8sZ2vZ4+7N6V0h2KivOIXjzsw2uo294ix6GoAY9c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768356007; c=relaxed/simple; bh=rRne06YcXUO7f/fEvV70e5UzsjCrgx1Xb5oznBIpLz8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=FMFptouRPp4ZOtIZlLJRzHj8Jmh64dHs0zbxiivxgsVj/EpVr1UMjHHRr6aZlS0x+7IXmQVbjv39Iwld+BSR8azcHZcndc1NWusQ91owDlWJzFEbRISu29WcWRwQ6tK1jdrrJtiVSdtFCstEIP0lXbrBSmWFV0yvUHdK+W+lohs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=bHQGbF1F; arc=none smtp.client-ip=209.85.210.44 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="bHQGbF1F" Received: by mail-ot1-f44.google.com with SMTP id 46e09a7af769-7c7533dbd87so6414352a34.2 for ; Tue, 13 Jan 2026 18:00:00 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1768355999; x=1768960799; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=ovyRP+zhWssSbEtZSeCo8K/4cnbuTzMTJOmBOtbpopI=; b=bHQGbF1FJoeVgzJCqKVWxXgiK9PfyImZ76omvmlmf5QB8UhDw+2HIJ5YiKUOqkgZTI qX0CcWMduVtgt5gatVwt17aKNEGoS3DJxzGw6HT5TsabFtrseyyqDnIVIloviHNg6vcT aChpXhDyhwBMTzjCSNvEDkPMRQ6BsdpcKoZ7xAEkfPMDypDOOfMutrdlvyTHapNiSw6f wACQsOeoephLcBf3YOmHN8u2WSxtG54vn42DwluvVhlQP/AR1rN0rA7phzEgCaVggVsq CQFtKnitdHmNBgrcpsVqOFLv6DkoGjZJc73vTF/p/9BhRh7d9L93LYqS50dPIRotRAKX h3iA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768355999; x=1768960799; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=ovyRP+zhWssSbEtZSeCo8K/4cnbuTzMTJOmBOtbpopI=; b=Olc6n6k3U4W/ihtlWIIvAudB5dx0NzcS2XoQTgCHZOQ51rxuRU6wO7WT/jcr73uQ9q WtotDVADaYPzI3BoOz06H7RZZsQpMDq0HDBHrsuwcVuRJInKQL4s91FQ2BPRgGy1AHuY EcWE+pysog2bvf0vhRwFiQUYRrj7TY/4pv+0pfU/4fbho1l2SMnBq8V6+m1xe0WYvcOW PARXBmUBqwcEzNCsKG78ycxP0qQSTX+oYyFArE62cnTWddvken3q1XjV2bFFoIdM5WGV qR4s55zgrvV49mJRha1eiLS3Ku4N1R1xOMR6qvKMG9idXGK7TjNDjvjxUb0d3o8xAQPV pQFQ== X-Forwarded-Encrypted: i=1; AJvYcCXSX40HdzCgAKkcQg6eKsAH064yAnVUGS5UXo8gAxU5epGfGfgLJR/AKIDUufjQD2fuPhFzimxyAK4WWDs=@vger.kernel.org X-Gm-Message-State: AOJu0YxYVkz3USg67JnGVj8i5ERLAH+27cvxEdq+2JhL3pHxF86DiJjL pseDDDOttj628komenHoTaS45YHPzjDy0C/HZ4ICtWQ8qbMID7qtt6u0 X-Gm-Gg: AY/fxX7WfsG2s99ALPGhiOqAqMC69HoeXASqYHubWPRNL4rEx4sm6ENWMC8o/kcJLm8 tPPh3dxC4bKAibTcqQ2hxlpGj1J8w9Fm1c9Y1sK5UbQ/E4mHWNRGWdKFxW/JkgymqOhsBFpMFyY 7r/L6sFmsKH2Dk6S/MSofZXzndMJFugo+esdrJO/GSSYCk/ONSi0ghy/Oeo2m6ieex/kBYApq7w H3EIguECHSuNsfjqRP49YqHjphJcSBTn9YL2yGYLafnvx1TIO5o9xPkvf8FkwqsvRYN2SAonKEa KR6I5kcBVKjSN5Ol5RgsifwhIxLXSrmLqETZ6S3lO01mtNYH6HACwk6xpe4FiECOXSjIL4ejeuo xlHFMMaipzc6P/LrQnlO5HYXzngNdF2mrkjsxOqFmZ04GQhrZQsLNTGYDCFfxPZzebKFrP+xCkH XXiq2/E6b4OgWn11kUnolyiUyN9vnNcBLCt8Fm X-Received: by 2002:a05:6830:6787:b0:745:4823:df18 with SMTP id 46e09a7af769-7cfc8b39f9amr685231a34.28.1768355999449; Tue, 13 Jan 2026 17:59:59 -0800 (PST) Received: from frodo (c-98-38-17-99.hsd1.co.comcast.net. [98.38.17.99]) by smtp.googlemail.com with ESMTPSA id 46e09a7af769-7cfcc8428fesm75785a34.0.2026.01.13.17.59.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 13 Jan 2026 17:59:59 -0800 (PST) From: Jim Cromie To: gregkh@linuxfoundation.org, linux-kernel@vger.kernel.org Cc: Jim Cromie , Jason Baron , =?UTF-8?q?=C5=81ukasz=20Bartosik?= , Louis Chauvet , Bagas Sanjaya , Dave Airlie , Daniel Vetter , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , dri-devel@lists.freedesktop.org, Petr Mladek , Shuah Khan , linux-doc@vger.kernel.org, Steven Rostedt , "Liam R. Howlett" Subject: [PATCH v8 19/31] selftests-dyndbg: add a dynamic_debug run_tests target Date: Tue, 13 Jan 2026 18:57:35 -0700 Message-ID: <20260114015815.1565725-20-jim.cromie@gmail.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260114015815.1565725-1-jim.cromie@gmail.com> References: <20260114015815.1565725-1-jim.cromie@gmail.com> 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 Add a selftest script for dynamic-debug. The config requires CONFIG_TEST_DYNAMIC_DEBUG=3Dm and CONFIG_TEST_DYNAMIC_DEBUG_SUBMOD=3Dm, which tacitly requires either CONFIG_DYNAMIC_DEBUG=3Dy or CONFIG_DYNAMIC_DEBUG_CORE=3Dy ATM this has just basic_tests(), which modify pr_debug() flags in the builtin params module. This means they're available to manipulate and observe the effects in "cat control". This is backported from another feature branch; the support-fns (thx Lukas) have unused features at the moment, they'll get used shortly. The script enables simple virtme-ng testing: [jimc@gandalf b0-ftrace]$ vrun_t virtme-ng 1.32+115.g07b109d doing: vng --name v6.14-rc4-60-gd5f48427de0c \ --user root -v -p 4 -a dynamic_debug.verbose=3D3 V=3D1 \ -- ../tools/testing/selftests/dynamic_debug/dyndbg_selftest.sh virtme: waiting for virtiofsd to start .. And add dynamic_debug to TARGETS, so `make run_tests` sees it properly For the impatient, set TARGETS explicitly: [root@v6 selftests]# make TARGETS=3Ddynamic_debug run_tests make[1]: Nothing to be done for 'all'. TAP version 13 1..1 # timeout set to 45 # selftests: dynamic_debug: dyndbg_selftest.sh # # BASIC_TESTS 95.422122] dyndbg: query 0: 0"=3D_" mod:* ... NOTES check KCONFIG_CONFIG to avoid silly fails Several tests are dependent upon config choices. Lets avoid failing where that is noise. The KCONFIG_CONFIG var exists to convey the config-file around. If the var names a file, read it and extract the relevant CONFIG items, and use them to skip the dependent tests, thus avoiding the fails that would follow, and the disruption to whatever CI is running these selftests. If the envar doesn't name a config-file, ".config" is assumed. CONFIG_DYNAMIC_DEBUG=3Dy: basic-tests() and comma-terminator-tests() test for the presence of the builtin pr_debugs in module/main.c, which I deemed stable and therefore safe to count. That said, the test fails if only CONFIG_DYNAMIC_DEBUG_CORE=3Dy is set. It could be rewritten to test against test-dynamic-debug.ko, but that just trades one config dependence for another. CONFIG_TEST_DYNAMIC_DEBUG=3Dm As written, test_percent_splitting() modprobes test_dynamic_debug, enables several classes, and counts them. It could be re-written to work for the builtin module also, but builtin test modules are not a common or desirable build/config. Co-developed-by: =C5=81ukasz Bartosik Signed-off-by: =C5=81ukasz Bartosik Signed-off-by: Jim Cromie --- MAINTAINERS | 1 + tools/testing/selftests/Makefile | 1 + .../testing/selftests/dynamic_debug/Makefile | 9 + tools/testing/selftests/dynamic_debug/config | 7 + .../dynamic_debug/dyndbg_selftest.sh | 257 ++++++++++++++++++ 5 files changed, 275 insertions(+) create mode 100644 tools/testing/selftests/dynamic_debug/Makefile create mode 100644 tools/testing/selftests/dynamic_debug/config create mode 100755 tools/testing/selftests/dynamic_debug/dyndbg_selftest.sh diff --git a/MAINTAINERS b/MAINTAINERS index e8f06145fb54..b9d38a5b4f12 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -8772,6 +8772,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/Makefile b/tools/testing/selftests/Mak= efile index c46ebdb9b8ef..8a2542006e23 100644 --- a/tools/testing/selftests/Makefile +++ b/tools/testing/selftests/Makefile @@ -26,6 +26,7 @@ TARGETS +=3D drivers/net/team TARGETS +=3D drivers/net/virtio_net TARGETS +=3D drivers/platform/x86/intel/ifs TARGETS +=3D dt +TARGETS +=3D dynamic_debug TARGETS +=3D efivarfs TARGETS +=3D exec TARGETS +=3D fchmodat2 diff --git a/tools/testing/selftests/dynamic_debug/Makefile b/tools/testing= /selftests/dynamic_debug/Makefile new file mode 100644 index 000000000000..6d06fa7f1040 --- /dev/null +++ b/tools/testing/selftests/dynamic_debug/Makefile @@ -0,0 +1,9 @@ +# 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 + +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..0f906ff53908 --- /dev/null +++ b/tools/testing/selftests/dynamic_debug/config @@ -0,0 +1,7 @@ + +# basic tests ref the builtin params module +CONFIG_DYNAMIC_DEBUG=3Dm + +# more testing is possible with these +# 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..465fad3f392c --- /dev/null +++ b/tools/testing/selftests/dynamic_debug/dyndbg_selftest.sh @@ -0,0 +1,257 @@ +#!/bin/bash +# SPDX-License-Identifier: GPL-2.0-only + +V=3D${V:=3D0} # invoke as V=3D1 $0 for global verbose +RED=3D"\033[0;31m" +GREEN=3D"\033[0;32m" +YELLOW=3D"\033[0;33m" +BLUE=3D"\033[0;34m" +MAGENTA=3D"\033[0;35m" +CYAN=3D"\033[0;36m" +NC=3D"\033[0;0m" +error_msg=3D"" + +[ -e /proc/dynamic_debug/control ] || { + echo -e "${RED}: this test requires CONFIG_DYNAMIC_DEBUG=3Dy ${NC}" + exit 0 # nothing to test here, no good reason to fail. +} + +# need info to avoid failures due to untestable configs + +[ -f "$KCONFIG_CONFIG" ] || KCONFIG_CONFIG=3D".config" +if [ -f "$KCONFIG_CONFIG" ]; then + 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= $? + grep -q "CONFIG_TEST_DYNAMIC_DEBUG_SUBMOD=3Dm" $KCONFIG_CONFIG ; LACK_= TMOD_SUBMOD=3D$? + if [ $V -eq 1 ]; then + echo LACK_DD_BUILTIN: $LACK_DD_BUILTIN + echo LACK_TMOD: $LACK_TMOD + echo LACK_TMOD_SUBMOD: $LACK_TMOD_SUBMOD + fi +else + LACK_DD_BUILTIN=3D0 + LACK_TMOD=3D0 + LACK_TMOD_SUBMOD=3D0 +fi + +function vx () { + echo $1 > /sys/module/dynamic_debug/parameters/verbose +} + +function ddgrep () { + grep $1 /proc/dynamic_debug/control +} + +function doprints () { + cat /sys/module/test_dynamic_debug/parameters/do_prints +} + +function ddcmd () { + exp_exit_code=3D0 + num_args=3D$# + if [ "${@:$#}" =3D "pass" ]; then + num_args=3D$#-1 + elif [ "${@:$#}" =3D "fail" ]; then + num_args=3D$#-1 + exp_exit_code=3D1 + fi + args=3D${@:1:$num_args} + output=3D$((echo "$args" > /proc/dynamic_debug/control) 2>&1) + exit_code=3D$? + error_msg=3D$(echo $output | cut -d ":" -f 5 | sed -e 's/^[[:space:]]*= //') + handle_exit_code $BASH_LINENO $FUNCNAME $exit_code $exp_exit_code +} + +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" + [ $3 =3D=3D 1 ] && echo "Error: '$error_msg'" + exit + fi +} + +# $1 - pattern to match, pattern in $1 is enclosed by spaces for a match "= "\s$1\s" +# $2 - number of times the pattern passed in $1 is expected to match +# $3 - optional can be set either to "-r" or "-v" +# "-r" means relaxed matching in this case pattern provided in $1 is= passed +# as is without enclosing it with spaces +# "-v" prints matching lines +# $4 - optional when $3 is set to "-r" then $4 can be used to pass "-v" +function check_match_ct { + pattern=3D"\s$1\s" + exp_cnt=3D0 + + [ "$3" =3D=3D "-r" ] && pattern=3D"$1" + let cnt=3D$(ddgrep "$pattern" | wc -l) + if [ $V -eq 1 ] || [ "$3" =3D=3D "-v" ] || [ "$4" =3D=3D "-v" ]; then + echo -ne "${BLUE}" && ddgrep $pattern && echo -ne "${NC}" + fi + [ $# -gt 1 ] && exp_cnt=3D$2 + if [ $cnt -ne $exp_cnt ]; then + echo -e "${RED}: $BASH_SOURCE:$BASH_LINENO check failed expected $= exp_cnt on $1, got $cnt" + exit + else + echo ": $cnt matches on $1" + fi +} + +# $1 - trace instance name +# #2 - if > 0 then directory is expected to exist, if <=3D 0 then otherwise +# $3 - "-v" for verbose +function check_trace_instance_dir { + if [ -e /sys/kernel/tracing/instances/$1 ]; then + if [ "$3" =3D=3D "-v" ] ; then + echo "ls -l /sys/kernel/tracing/instances/$1: " + ls -l /sys/kernel/tracing/instances/$1 + fi + if [ $2 -le 0 ]; then + echo -e "${RED}: $BASH_SOURCE:$BASH_LINENO error trace instanc= e \ + '/sys/kernel/tracing/instances/$1' does exist" + exit + fi + else + if [ $2 -gt 0 ]; then + echo -e "${RED}: $BASH_SOURCE:$BASH_LINENO error trace instanc= e \ + '/sys/kernel/tracing/instances/$1' does not exist" + exit + fi + fi +} + +function tmark { + echo $* > /sys/kernel/tracing/trace_marker +} + +# $1 - trace instance name +# $2 - line number +# $3 - if > 0 then the instance is expected to be opened, otherwise +# the instance is expected to be closed +function check_trace_instance { + output=3D$(tail -n9 /proc/dynamic_debug/control | grep ": Opened trace= instances" \ + | xargs -n1 | grep $1) + if [ "$output" !=3D $1 ] && [ $3 -gt 0 ]; then + echo -e "${RED}: $BASH_SOURCE:$2 trace instance $1 is not opened" + exit + fi + if [ "$output" =3D=3D $1 ] && [ $3 -le 0 ]; then + echo -e "${RED}: $BASH_SOURCE:$2 trace instance $1 is not closed" + exit + fi +} + +function is_trace_instance_opened { + check_trace_instance $1 $BASH_LINENO 1 +} + +function is_trace_instance_closed { + check_trace_instance $1 $BASH_LINENO 0 +} + +# $1 - trace instance directory to delete +# $2 - if > 0 then directory is expected to be deleted successfully, if <= =3D 0 then otherwise +function del_trace_instance_dir() { + exp_exit_code=3D1 + [ $2 -gt 0 ] && exp_exit_code=3D0 + output=3D$((rmdir /sys/kernel/debug/tracing/instances/$1) 2>&1) + exit_code=3D$? + error_msg=3D$(echo $output | cut -d ":" -f 3 | sed -e 's/^[[:space:]]*= //') + handle_exit_code $BASH_LINENO $FUNCNAME $exit_code $exp_exit_code +} + +function error_log_ref { + # to show what I got + : echo "# error-log-ref: $1" + : echo cat \$2 +} + +function ifrmmod { + lsmod | grep $1 2>&1>/dev/null && rmmod $1 +} + +# $1 - text to search for +function search_trace() { + search_trace_name 0 1 $1 +} + +# $1 - trace instance name, 0 for global event trace +# $2 - line number counting from the bottom +# $3 - text to search for +function search_trace_name() { + if [ "$1" =3D "0" ]; then + buf=3D$(cat /sys/kernel/debug/tracing/trace) + line=3D$(tail -$2 /sys/kernel/debug/tracing/trace | head -1 | sed -e = 's/^[[:space:]]*//') + else + buf=3D$(cat /sys/kernel/debug/tracing/instances/$1/trace) + line=3D$(tail -$2 /sys/kernel/debug/tracing/instances/$1/trace | head= -1 | \ + sed -e 's/^[[:space:]]*//') + fi + if [ $2 =3D 0 ]; then + # whole-buf check + output=3D$(echo $buf | grep "$3") + else + output=3D$(echo $line | grep "$3") + fi + if [ "$output" =3D "" ]; then + echo -e "${RED}: $BASH_SOURCE:$BASH_LINENO search for '$3' fai= led \ + in line '$line' or '$buf'" + exit + fi + if [ $V =3D 1 ]; then + echo -e "${MAGENTA}: search_trace_name in $1 found: \n$output \nin:${= BLUE} $buf ${NC}" + fi +} + +# $1 - error message to check +function check_err_msg() { + if [ "$error_msg" !=3D "$1" ]; then + echo -e "${RED}: $BASH_SOURCE:$BASH_LINENO error message '$error_m= sg' \ + does not match with '$1'" + exit + fi +} + +function basic_tests { + echo -e "${GREEN}# BASIC_TESTS ${NC}" + if [ $LACK_DD_BUILTIN -eq 1 ]; then + echo "SKIP" + return + fi + ddcmd =3D_ # zero everything + check_match_ct =3Dp 0 + + # module params are builtin to handle boot args + check_match_ct '\[params\]' 4 -r + ddcmd module params +mpf + check_match_ct =3Dpmf 4 + + # multi-cmd input, newline separated, with embedded comments + cat <<"EOF" > /proc/dynamic_debug/control + module params =3D_ # clear params + module params +mf # set flags + module params func parse_args +sl # other flags +EOF + check_match_ct =3Dmf 3 + check_match_ct =3Dmfsl 1 + ddcmd =3D_ +} + +tests_list=3D( + basic_tests +) + +# Run tests + +ifrmmod test_dynamic_debug_submod +ifrmmod test_dynamic_debug + +for test in "${tests_list[@]}" +do + $test + echo "" +done +echo -en "${GREEN}# Done on: " +date +echo -en "${NC}" --=20 2.52.0 From nobody Sun Feb 8 07:58:43 2026 Received: from mail-ot1-f45.google.com (mail-ot1-f45.google.com [209.85.210.45]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 78FAF3064AF for ; Wed, 14 Jan 2026 02:00:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.45 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768356007; cv=none; b=eaKYW6GaU+RgW64xoThq3aq5d2aEd+2rCoWgidtMU1YQkoWdLmsLRnjyQYK5m3a4+yDmhk6WaXKhPLs/fZtGZ/eVfG3oGxRZZiOI7PIyr8tD8U3tu18w7n0YvHrNx0PLjKGQBLYlP/+SbpE9QOXLqCca8izafB+V/AfNpUGUPfs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768356007; c=relaxed/simple; bh=DLGYLqotnJ3r64tEQiOm4CWPKlpXwGXxjO6LBdcTYjk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=kr9blJIhZtbligKlvY//GO4TDzj4p9SzpaGTTK3SRDByCKu+6r+znyNQuAY8UJr3lCbJspH/0nf7MlnDOrcjmsjOB2FvAZ7NqcO1c5a/z4QHspaQmvvANoeiCp1QX4D0wUM4uadaFctlyCRwqqO9QCv2ewabqWO720+35TXljQk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=Mqovvhhb; arc=none smtp.client-ip=209.85.210.45 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Mqovvhhb" Received: by mail-ot1-f45.google.com with SMTP id 46e09a7af769-7cfcbe7d176so77233a34.3 for ; Tue, 13 Jan 2026 18:00:04 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1768356003; x=1768960803; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=kgJaffb+G8M2IXpwFpfYggq/3ogV1jI3bmNBB+yiGR4=; b=MqovvhhbylkAnav9RHhKAnsn+hGPK5GPZHSmhui58leN8/pfqXYZVn/21zNb5WgY8E uYi2dl9T7mLiLd8Ms2rLQgIcE0q+wiMDZUXYCffl3ZLQh371Vb8bwtWFxDzteRCOZvZx lha+UIqqQI55TTf37bZGidj8cPvouJx+EYL+vhVcPsRuAhwF/oPBFL8Zq3N7pIJ9PsZH YVRlDQGHDMgJbgnqL9FttVlMfLU6lnMfLjA5b3cd6wQKuIMDC3HehRX54nZk4RKEy+kU SjJkfuWMTzJ7TL7h+ieFA/1MUq9UBxTZ1+4VIh75ygdQZRUSDG2fTMnbx520vhuRutJU DuAg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768356003; x=1768960803; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=kgJaffb+G8M2IXpwFpfYggq/3ogV1jI3bmNBB+yiGR4=; b=fhmCRfjEG7XAaxAnhG3ZQlgQZM4PJrs/EmSSdCZLfOAYUg4GTJIGFbVDzOdBKwwysY kWRIcMLU5pxvPZisXk1imaeucQBx3vbxhS89FKM40SCyJEvLoJd+7Wns1dQSgxqw9F5o ghvWqe0DMXwG8i3kjp5MzHhqsm4FJvHZF6JJejoCc2YRicyfjSokjYhRYbYHRKZyh4BB OX62yloJJM4N0ALePcn8dwl2Y1rAMQOk2naHZivKv8DrPjvgjcE8YD/v10GYlq4AnTXv lirJean8t7QcRb3gFQKj86jM5V8G6ttXaPRI2vOZpuzlNQCJHkKPjb7Hnc4YzngVh/Ya ieYw== X-Forwarded-Encrypted: i=1; AJvYcCXOQFG4NWaatU2lJVamqOgz854QBOmXUexi5zvd6AW+pwEwejwFyEe8sTGZdhzPgsKn77HbTrB6jT/VTnk=@vger.kernel.org X-Gm-Message-State: AOJu0Yy7kfDuW0hAqZnR4VdeagWXC73v1b9TVmdx6jN10W1PCAkdmrRs GBJKa5hIgfiN9CcuKaMnC+SOhOxsTROCPARUJsetCtBpgCOuYOo3RMl1 X-Gm-Gg: AY/fxX59hpGmsqZ1QwV/9XnuCYPai83RCUQB2vKaVjG/ov+2XTt/enuAuixvmHQxOe0 CCSdzUELW7ct93Nglx318+xLUq1H0sDLTZ3PYNQ93lPrOauR1gfGwQwpEYYtZufE5gKXKHVt8i1 RCo8DcCNkItsuqMwtI/Q5IlcS+A6Ev/hi0/b/2kv4aSRjgMgKZj7Tl9Y99WqEnClxFKV/4Vq3ar Mdd2imF2t7heUOorZuS65/KdkU/lO/40FtS37cROlNcqhxBJtrvgNfYxImKeo7w9052QKZmdXo/ 1WVtwIq6f7ORP3dD32Bfc3JF7HuRtZnXL66l7h/CTQbANjNGRCi0fR6BuRVoloZIMdAhljCed3V l6N9Z1E4CUBNKC9/AP6w6JPRjrE2Oy/ZI1c40g7s9BJn7XlQYyXxY2fYfqGPgrfC2uuAgn2whFG GFUHgrf58Ug97uKBhJLw5Of2zP+IYABi4Zi8z4wzMouumsadM= X-Received: by 2002:a05:6830:3110:b0:7ca:f639:4be6 with SMTP id 46e09a7af769-7cfc8b29b3emr1059472a34.19.1768356003373; Tue, 13 Jan 2026 18:00:03 -0800 (PST) Received: from frodo (c-98-38-17-99.hsd1.co.comcast.net. [98.38.17.99]) by smtp.googlemail.com with ESMTPSA id 46e09a7af769-7ce478ede43sm16651614a34.27.2026.01.13.18.00.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 13 Jan 2026 18:00:02 -0800 (PST) From: Jim Cromie To: gregkh@linuxfoundation.org, linux-kernel@vger.kernel.org Cc: Jim Cromie , Jason Baron , =?UTF-8?q?=C5=81ukasz=20Bartosik?= , Louis Chauvet , Bagas Sanjaya , Dave Airlie , Daniel Vetter , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , dri-devel@lists.freedesktop.org, Petr Mladek , Shuah Khan , linux-doc@vger.kernel.org, Steven Rostedt , "Liam R. Howlett" Subject: [PATCH v8 20/31] dyndbg: change __dynamic_func_call_cls* macros into expressions Date: Tue, 13 Jan 2026 18:57:36 -0700 Message-ID: <20260114015815.1565725-21-jim.cromie@gmail.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260114015815.1565725-1-jim.cromie@gmail.com> References: <20260114015815.1565725-1-jim.cromie@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The Xe driver's XE_IOCTL_DBG macro calls drm_dbg() from inside an if (expression). This breaks when CONFIG_DRM_USE_DYNAMIC_DEBUG=3Dy because the invoked macro has a do-while-0 wrapper, and is not an expression. if (cond && (drm_dbg("expr-form"),1)) { ... do some more stuff } Fix for this usage by changing __dynamic_func_call_cls{,_no_desc} macros into expressions, by replacing the do-while-0s with a ({ }) wrapper. In the common usage, the trailing ';' converts the expression into a statement. drm_dbg("statement form"); Reviewed-by: Louis Chauvet Signed-off-by: Jim Cromie --- include/linux/dynamic_debug.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/include/linux/dynamic_debug.h b/include/linux/dynamic_debug.h index d543b84d447e..c4ebbccca5d1 100644 --- a/include/linux/dynamic_debug.h +++ b/include/linux/dynamic_debug.h @@ -217,20 +217,20 @@ 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_func_call_cls(id, cls, fmt, func, ...) ({ \ DEFINE_DYNAMIC_DEBUG_METADATA_CLS(id, cls, fmt); \ if (DYNAMIC_DEBUG_BRANCH(id)) \ func(&id, ##__VA_ARGS__); \ -} while (0) +}) #define __dynamic_func_call(id, fmt, func, ...) \ __dynamic_func_call_cls(id, _DPRINTK_CLASS_DFLT, fmt, \ func, ##__VA_ARGS__) =20 -#define __dynamic_func_call_cls_no_desc(id, cls, fmt, func, ...) do { \ +#define __dynamic_func_call_cls_no_desc(id, cls, fmt, func, ...) ({ \ DEFINE_DYNAMIC_DEBUG_METADATA_CLS(id, cls, fmt); \ if (DYNAMIC_DEBUG_BRANCH(id)) \ func(__VA_ARGS__); \ -} while (0) +}) #define __dynamic_func_call_no_desc(id, fmt, func, ...) \ __dynamic_func_call_cls_no_desc(id, _DPRINTK_CLASS_DFLT, \ fmt, func, ##__VA_ARGS__) --=20 2.52.0 From nobody Sun Feb 8 07:58:43 2026 Received: from mail-oi1-f195.google.com (mail-oi1-f195.google.com [209.85.167.195]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E9F832FE075 for ; Wed, 14 Jan 2026 02:00:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768356013; cv=none; b=A6tzvra/hg8GIaADfsLe3uS8NeioBdeRCxrJOLDMlbKCjgJINyFbvql0FbrEyw878eaHXQ6esynRchVgV/e+M0tOlxBO2riOyvXYqz3HTFq2VOtyqBxeyhFlx1IyvZ02M2tCQ+eAcIi8haI7wsI7CA6ll2oyl+ZDPhyrsW1A7Vg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768356013; c=relaxed/simple; bh=SFmIwung+KmetmeOG+Sn3CSgNEWnjBVurb152QCMlYI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=LJweIQv5EuO6jnffb5VBrad/uHoC/L66HjdkmPARdlaNERPc+p0vRgfdkzb4xewAeCXUZ7fqEWeP8l4+RDO5BImS0HbflQjOvkBP+cZKhna37kY2G1uEoKDWe1jb/aYjNopO6KOApEVE5E/Krh89vh4RNeDSc+sT4Bqb4Kmh74w= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=h4fd4Hil; arc=none smtp.client-ip=209.85.167.195 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="h4fd4Hil" Received: by mail-oi1-f195.google.com with SMTP id 5614622812f47-45090ef26c6so2886524b6e.2 for ; Tue, 13 Jan 2026 18:00:10 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1768356008; x=1768960808; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=3Z66i+AHHvIhY1KTibyhFSzNFwzyjSzDFqjhSjOu8JE=; b=h4fd4HilZudwC/uNmzw9MZ9uSWrRR+3LWjcgRkqyQO/sj8phqcaTXANjjlldTNHYGm NDcEaAeyvZw4slpVDvYNxZGxEkSTuTyduasRa+kL1mFGWOglDGMFDxBCdsEPcUqty3Zc yx4TaPd/M/NOD03jU0FBsWHa8BVb0QFPRkiGNReD3kIOz7NllZyEpiNpdFClzN245GBj ac2xMuwv8dIelW2FAKWmhhEqGwNJ+FhRuOSpX0omOr85fJk/fKbY8R73IQoXi0ZdCRTy wd2WBhRexm1HMAbt7rhryKLJGBE6uJRehSWy5PAZDBZlYPv95goLz647g4w8q1a0Psbr fKdA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768356008; x=1768960808; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=3Z66i+AHHvIhY1KTibyhFSzNFwzyjSzDFqjhSjOu8JE=; b=MceL3ECuxvwVhJwdSEeyK1UkWG+TMsGr8hw9tEjiy/QJfVDswP116xbcD40qw2yAU+ LXMNB29Y1tSyiFF8cNxdnw05Q/gPx6cQ6gjHCOlrHYrL0LSZthSGbfQObxKcnn2HJyo4 /cyvxpIsjoODGjLmI0XAjzZyqrKY+Pysrw9yG2iLyxM6lu6HjfWX8+B6q5D7ZZgVJRYL 1VX1aZ2LpWo/wOZ3U4ODeY2xHdAiRZkdy0yTsRjDhblSLFfEgoX+AvV/9+50XhfxyFtS UkEKALSG1TTwjweOYy5lLGP/6884t9AdAfoQFjufLErclHTNjcOtxxMLx37M0ur6BL07 kprw== X-Forwarded-Encrypted: i=1; AJvYcCX7+sM+J98RAnTLd5yLNXymqmZ27WHI/bTPIUpy0XRHL1ayXmH0v21/hnfZEeDR1scFWLNi6FhJODTN94U=@vger.kernel.org X-Gm-Message-State: AOJu0YynV4iAIBUhxCw4W0RyKAJ/1XTHnMISIkNXWBoDxK7xRHTjf9s4 TTm00ZHIi2I+e9sO3WAnDf2w2G7RYJ06Rpq20H7mlYNWIyMQQXNR/CCO X-Gm-Gg: AY/fxX6qCtu9F811HGAbLRwJiisXtzpRjG7oezm+rhZ3vPIFE8qx45bQTI/xkXziF1v EF+0OcaQRcla/8+Ccph/OT2SiQ/ElvPnf58xJYy7c2uK7P3JKyK7o8brdFmgTXi/KPlJVnb70oE QIHKYkWgE5ZTtrAwJ6M2rlfrvjv5DvWObyyu5dbM2UMMMH+xEdy5oOAfQys21GDLn/kduYxChJw QwEe20b4XhwgbzMbsB5XdSnYUqE8XEdAmMFdEYVTvvdgBgphJxwSL9DTgOrODG8TvUFxES3qZ2Q ahYnJNkS4Gy8y+zKzFhCSisao0/Zv9BJpEk8rdxncntcAJprR2BJms0Cqk222mMKln+0+WnTaBk 1Aq/gwnIv79vKeyQXPfx/Rs14BAXz0VSCTgs3ADdhvuAfHQlP9wAXW8muyEkRrAhgragfDvCaKS EsdD6XRkzsE1DDFXVFuPtgwgYYGcuNZp7xYdFIpUc9Ie0IqcA= X-Received: by 2002:a05:6808:538f:b0:450:bb4e:8395 with SMTP id 5614622812f47-45c7153ecd3mr631693b6e.53.1768356007468; Tue, 13 Jan 2026 18:00:07 -0800 (PST) Received: from frodo (c-98-38-17-99.hsd1.co.comcast.net. [98.38.17.99]) by smtp.googlemail.com with ESMTPSA id 5614622812f47-45a5e2b74e0sm10319162b6e.16.2026.01.13.18.00.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 13 Jan 2026 18:00:06 -0800 (PST) From: Jim Cromie To: gregkh@linuxfoundation.org, linux-kernel@vger.kernel.org Cc: Jim Cromie , Jason Baron , =?UTF-8?q?=C5=81ukasz=20Bartosik?= , Louis Chauvet , Bagas Sanjaya , Dave Airlie , Daniel Vetter , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , dri-devel@lists.freedesktop.org, Petr Mladek , Shuah Khan , linux-doc@vger.kernel.org, Steven Rostedt , "Liam R. Howlett" Subject: [PATCH v8 21/31] dyndbg-API: replace DECLARE_DYNDBG_CLASSMAP Date: Tue, 13 Jan 2026 18:57:37 -0700 Message-ID: <20260114015815.1565725-22-jim.cromie@gmail.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260114015815.1565725-1-jim.cromie@gmail.com> References: <20260114015815.1565725-1-jim.cromie@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" commit aad0214f3026 ("dyndbg: add DECLARE_DYNDBG_CLASSMAP macro") DECLARE_DYNDBG_CLASSMAP() has a design error; its usage fails a basic K&R rule: "define once, refer many times". When CONFIG_DRM_USE_DYNAMIC_DEBUG=3Dy, it is used across DRM core & drivers; each invocation allocates/inits the classmap understood by that module. They *all* must match for the DRM modules to respond consistently when drm.debug categories are enabled. This is at least a maintenance hassle. Worse, its the root-cause of the CONFIG_DRM_USE_DYNAMIC_DEBUG=3DY regression; its use in both core & drivers obfuscates the 2 roles, muddling the design, yielding an incomplete initialization when modprobing drivers: 1st drm.ko loads, and dyndbg initializes its drm.debug callsites, then a drm-driver loads, but too late for the drm.debug enablement. And that gave us: commit bb2ff6c27bc9 ("drm: Disable dynamic debug as broken") So retire it, replace with 2 macros: DYNAMIC_DEBUG_CLASSMAP_DEFINE - invoked once from core - drm.ko DYNAMIC_DEBUG_CLASSMAP_USE - from all drm drivers and helpers. NB: name-space de-noise DYNAMIC_DEBUG_CLASSMAP_DEFINE: this reworks DECLARE_DYNDBG_CLASSMAP, basically by dropping the static qualifier on the classmap, and exporting it instead. DYNAMIC_DEBUG_CLASSMAP_USE: then refers to the exported var by name: used from drivers, helper-mods lets us drop the repetitive "classname" declarations fixes 2nd-defn problem creates a ddebug_class_user record in new __dyndbg_class_users section new section is scanned "differently" DECLARE_DYNDBG_CLASSMAP is preserved temporarily, to decouple DRM adaptation work and avoid compile-errs before its done. The DEFINE,USE distinction, and the separate classmap-use record, allows dyndbg to initialize the driver's & helper's drm.debug callsites separately after each is modprobed. Basically, the classmap initial scan is repeated for classmap-users. dyndbg's existing __dyndbg_classes[] section does: . catalogs the module's classmaps . tells dyndbg about them, allowing >control . DYNAMIC_DEBUG_CLASSMAP_DEFINE creates section records. . we rename it to: __dyndbg_class_maps[] this patch adds __dyndbg_class_users[] section: . catalogs users of classmap definitions from elsewhere . authorizes dyndbg to >control user's class'd prdbgs . DYNAMIC_DEBUG_CLASSMAP_USE() creates section records. Now ddebug_add_module(etal) can handle classmap-uses similar to (and after) classmaps; when a dependent module is loaded, if it has classmap-uses (to a classmap-def in another module), that module's kernel params are scanned to find if it has a kparam that is wired to dyndbg's param-ops, and whose classmap is the one being ref'd. To support this, theres a few data/header changes: new struct ddebug_class_user contains: user-module-name, &classmap-defn it records drm-driver's use of a classmap in the section, allowing lookup struct ddebug_info gets 2 new fields for the new sections: class_users, num_class_users. set by dynamic_debug_init() for builtins. or by kernel/module/main:load_info() for loadable modules. vmlinux.lds.h: new BOUNDED_SECTION for __dyndbg_class_users. this creates start,len C symbol-names for the section. TLDR ? dynamic_debug.c: 2 changes from ddebug_add_module() & ddebug_change(): ddebug_add_module(): ddebug_attach_module_classes() is reworked/renamed/split into debug_apply_class_maps(), ddebug_apply_class_users(), which both call ddebug_apply_params(). ddebug_apply_params(new fn): It scans module's/builtin kernel-params, calls ddebug_match_apply_kparam for each to find any params/sysfs-nodes which may be wired to a classmap. ddebug_match_apply_kparam(new fn): 1st, it tests the kernel-param.ops is dyndbg's; this guarantees that the attached arg is a struct ddebug_class_param, which has a ref to the param's state, and to the classmap defining the param's handling. 2nd, it requires that the classmap ref'd by the kparam is the one we've been called for; modules can use many separate classmaps (as test_dynamic_debug does). Then apply the "parent" kparam's setting to the dependent module, using ddebug_apply_class_bitmap(). ddebug_change(and callees) also gets adjustments: ddebug_find_valid_class(): This does a search over the module's classmaps, looking for the class FOO echo'd to >control. So now it searches over __dyndbg_class_users[] after __dyndbg_classes[]. ddebug_class_name(): return class-names for defined OR used classes. test_dynamic_debug.c, test_dynamic_debug_submod.c: This demonstrates the 2 types of classmaps & sysfs-params, following the 4-part recipe: 0. define an enum for the classmap's class_ids drm.debug gives us DRM_UT_<*> (aka ) multiple classmaps in a module(s) must share 0-62 classid space. 1. DYNAMIC_DEBUG_CLASSMAP_DEFINE(classmap_name, .. "") names the classes, maps them to consecutive class-ids. convention here is stringified ENUM_SYMBOLS these become API/ABI if 2 is done. 2. DYNAMIC_DEBUG_CLASSMAP_PARAM* (classmap_name) adds a controlling kparam to the class 3. DYNAMIC_DEBUG_CLASSMAP_USE(classmap_name) for subsystem/group/drivers to use extern created by 1. Move all the enum declarations together, to better explain how they share the 0..62 class-id space available to a module (non-overlapping subranges). reorg macros 2,3 by name. This gives a tabular format, making it easy to see the pattern of repetition, and the points of change. And extend the test to replicate the 2-module (parent & dependent) scenario which caused the CONFIG_DRM_USE_DYNAMIC_DEBUG=3Dy regression seen in drm & drivers. The _submod.c is a 2-line file: #define _SUBMOD, #include parent. This gives identical complements of prdbgs in parent & _submod, and thus identical print behavior when all of: >control, >params, and parent->_submod propagation are working correctly. It also puts all the parent/_submod declarations together in the same source; the new ifdef _SUBMOD block invokes DYNAMIC_DEBUG_CLASSMAP_USE for the 2 test-interfaces. I think this is clearer. These 2 modules are both tristate, allowing 3 super/sub combos: Y/Y, Y/M, M/M (not N/Y, since this is disallowed by dependence). Y/Y, Y/M testing once exposed a missing __align(8) in the _METADATA macro, which M/M didn't see, probably because the module-loader memory placement constrained it from misalignment. Fixes: aad0214f3026 ("dyndbg: add DECLARE_DYNDBG_CLASSMAP macro") cc: linux-doc@vger.kernel.org Signed-off-by: Jim Cromie --- replace di with &dt->info, since di becomes stale fix dd_mark_vector_subrange macro param ordering to match kdoc s/base/offset/ in _ddebug_class_user, to reduce later churn --- MAINTAINERS | 2 +- include/asm-generic/vmlinux.lds.h | 1 + include/linux/dynamic_debug.h | 138 +++++++++++++++++++++--- kernel/module/main.c | 3 + lib/Kconfig.debug | 24 ++++- lib/Makefile | 5 + lib/dynamic_debug.c | 172 +++++++++++++++++++++++++----- lib/test_dynamic_debug.c | 132 ++++++++++++++++------- lib/test_dynamic_debug_submod.c | 14 +++ 9 files changed, 412 insertions(+), 79 deletions(-) create mode 100644 lib/test_dynamic_debug_submod.c diff --git a/MAINTAINERS b/MAINTAINERS index b9d38a5b4f12..b6c549cc27e6 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -8771,7 +8771,7 @@ M: Jim Cromie S: Maintained F: include/linux/dynamic_debug.h F: lib/dynamic_debug.c -F: lib/test_dynamic_debug.c +F: lib/test_dynamic_debug*.c F: tools/testing/selftests/dynamic_debug/* =20 DYNAMIC INTERRUPT MODERATION diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinu= x.lds.h index da15cf0c16d0..c7d85b857997 100644 --- a/include/asm-generic/vmlinux.lds.h +++ b/include/asm-generic/vmlinux.lds.h @@ -367,6 +367,7 @@ defined(CONFIG_AUTOFDO_CLANG) || defined(CONFIG_PROPELL= ER_CLANG) /* implement dynamic printk debug */ \ . =3D ALIGN(8); \ BOUNDED_SECTION_BY(__dyndbg_class_maps, ___dyndbg_class_maps) \ + BOUNDED_SECTION_BY(__dyndbg_class_users, ___dyndbg_class_users) \ BOUNDED_SECTION_BY(__dyndbg_descriptors, ___dyndbg_descs) \ CODETAG_SECTIONS() \ LIKELY_PROFILE() \ diff --git a/include/linux/dynamic_debug.h b/include/linux/dynamic_debug.h index c4ebbccca5d1..ad3dc10ff03a 100644 --- a/include/linux/dynamic_debug.h +++ b/include/linux/dynamic_debug.h @@ -71,8 +71,11 @@ 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 struct module *mod; /* NULL for builtins */ const char *mod_name; const char **class_names; const int length; @@ -80,10 +83,18 @@ struct _ddebug_class_map { enum ddebug_class_map_type map_type; }; =20 +struct _ddebug_class_user { + char *mod_name; + struct _ddebug_class_map *map; + const int offset; /* user offset to re-number the used map */ +}; + /* - * @_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; @@ -95,10 +106,16 @@ struct _ddebug_class_maps { 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 { @@ -117,12 +134,81 @@ 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 - * @_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 + * 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 KBUILD_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__ }; \ @@ -136,6 +222,25 @@ struct _ddebug_class_param { .class_names =3D _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. + */ +#define DYNAMIC_DEBUG_CLASSMAP_USE(_var) \ + DYNAMIC_DEBUG_CLASSMAP_USE_(_var, 0, __UNIQUE_ID(_ddebug_class_user)) +#define DYNAMIC_DEBUG_CLASSMAP_USE_(_var, _offset, _uname) \ + extern struct _ddebug_class_map _var; \ + static struct _ddebug_class_user __aligned(8) __used \ + __section("__dyndbg_class_users") _uname =3D { \ + .mod_name =3D KBUILD_MODNAME, \ + .map =3D &(_var), \ + .offset =3D _offset \ + } + extern __printf(2, 3) void __dynamic_pr_debug(struct _ddebug *descriptor, const char *fmt, ...); =20 @@ -287,12 +392,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 @@ -300,6 +411,8 @@ 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 DEFINE_DYNAMIC_DEBUG_METADATA(name, fmt) #define DYNAMIC_DEBUG_BRANCH(descriptor) false #define DECLARE_DYNDBG_CLASSMAP(...) @@ -346,8 +459,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 1ccc5d4399c3..ee35238d2d0a 100644 --- a/kernel/module/main.c +++ b/kernel/module/main.c @@ -2716,6 +2716,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 713cc94caa02..9bc6f76830a6 100644 --- a/lib/Kconfig.debug +++ b/lib/Kconfig.debug @@ -2979,12 +2979,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 1ab2c4be3b66..63ed5fabada2 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -82,6 +82,9 @@ 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 +obj-$(CONFIG_TEST_PRINTF) +=3D test_printf.o +obj-$(CONFIG_TEST_SCANF) +=3D test_scanf.o =20 obj-$(CONFIG_TEST_BITMAP) +=3D test_bitmap.o ifeq ($(CONFIG_CC_IS_CLANG)$(CONFIG_KASAN),yy) @@ -204,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 63bfe1891a9e..c60c2142f8ac 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; @@ -168,20 +171,37 @@ static void vpr_info_dq(const struct ddebug_query *qu= ery, const char *msg) query->first_lineno, query->last_lineno, query->class_string); } =20 -static struct _ddebug_class_map *ddebug_find_valid_class(struct ddebug_tab= le const *dt, - const char *class_string, - int *class_id) +#define vpr_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_info const *di, const char *query_c= lass, 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) { + vpr_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) { + vpr_di_info(di, "class-ref: %s -> %s.%s ", + cli->mod_name, cli->map->mod_name, query_class); + *class_id =3D idx + cli->map->base; + return cli->map; + } + } *class_id =3D -ENOENT; return NULL; } @@ -238,8 +258,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 +279,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 { @@ -590,7 +610,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) { @@ -721,7 +741,7 @@ static int param_set_dyndbg_module_classes(const char *= instr, /** * param_set_dyndbg_classes - classmap kparam setter * @instr: string echo>d to sysfs, input depends on map_type - * @kp: kp->arg has state: bits/lvl, map, map_type + * @kp: kp->arg has state: bits/lvl, classmap, map_type * * enable/disable all class'd pr_debugs in the classmap. For LEVEL * map-types, enforce * relative levels by bitpos. @@ -758,6 +778,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 @@ -1073,12 +1094,17 @@ static bool ddebug_class_in_range(const int class_i= d, const struct _ddebug_class 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_class_in_range(dp->class_id, cli->map)) + return cli->map->class_names[dp->class_id - cli->map->base]; + return NULL; } =20 @@ -1159,9 +1185,85 @@ 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) +#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]); \ + }) + +static void ddebug_sync_classbits(const struct kernel_param *kp, const cha= r *modname) +{ + const struct _ddebug_class_param *dcp =3D kp->arg; + + /* clamp initial bitvec, mask off hi-bits */ + if (*dcp->bits & ~CLASSMAP_BITMASK(dcp->map->length)) { + *dcp->bits &=3D CLASSMAP_BITMASK(dcp->map->length); + v2pr_info("preset classbits: %lx\n", *dcp->bits); + } + /* force class'd prdbgs (in USEr module) to match (DEFINEr module) class-= param */ + ddebug_apply_class_bitmap(dcp, dcp->bits, ~0, modname); + ddebug_apply_class_bitmap(dcp, dcp->bits, 0, modname); +} + +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 (map =3D=3D dcp->map) { + v2pr_info(" kp:%s.%s =3D0x%lx", 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 = char *mod_name) +{ + const struct kernel_param *kp; +#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_maps(const struct _ddebug_info *di) { - vpr_info("module:%s attached %d classes\n", dt->info.mod_name, dt->info.m= aps.len); + struct _ddebug_class_map *cm; + int i; + + for_subvec(i, cm, di, maps) + ddebug_apply_params(cm, cm->mod_name); + + vpr_di_info(di, "attached %d class-maps to ", i); +} + +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); + + vpr_di_info(di, "attached %d class-users to ", i); } =20 /* @@ -1190,6 +1292,22 @@ static void ddebug_attach_module_classes(struct ddeb= ug_table *dt, struct _ddebug (__dst)->info._vec.len =3D __nc; \ }) =20 +static int __maybe_unused +ddebug_class_range_overlap(struct _ddebug_class_map *cm, + u64 *reserved_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. @@ -1198,6 +1316,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) @@ -1210,26 +1329,29 @@ static int ddebug_add_module(struct _ddebug_info *d= i) pr_err("error adding module: %s\n", di->mod_name); return -ENOMEM; } + INIT_LIST_HEAD(&dt->link); /* - * 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-> referents live in .*data and are + * immortal. For loaded modules, di points at the dyndbg_info + * member of its struct module, which lives at least as + * long as this struct ddebug_table. */ dt->info =3D *di; - - INIT_LIST_HEAD(&dt->link); - - dd_mark_vector_subrange(i, cm, di, maps, dt); - - if (di->maps.len) - ddebug_attach_module_classes(dt, di); + dd_mark_vector_subrange(i, cm, &dt->info, maps, dt); + dd_mark_vector_subrange(i, cli, &dt->info, users, dt); + /* now di is stale */ =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.maps.len) + ddebug_apply_class_maps(&dt->info); + 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 @@ -1379,8 +1501,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 9c3e53cd26bd..6c4548f63512 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) @@ -29,24 +48,39 @@ static const struct kernel_param_ops param_ops_do_print= s =3D { }; module_param_cb(do_prints, ¶m_ops_do_prints, NULL, 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 DD_SYS_WRAP(_model, _flags) \ - static unsigned long bits_##_model; \ - static struct _ddebug_class_param _flags##_model =3D { \ +#define CLASSMAP_BITMASK(width, base) (((1UL << (width)) - 1) << (base)) + +/* sysfs param wrapper, proto-API */ +#define DYNAMIC_DEBUG_CLASSMAP_PARAM_(_model, _flags, _init) \ + static unsigned long 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 +94,51 @@ 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. V0 is > D2_DRMRES */ +enum cat_level_num { V0 =3D 16, V1, 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, + V0, "V0", "V1", "V2", "V3", "V4", "V5", "V6", "V7"); + +/* + * now add the sysfs-params + */ + +DYNAMIC_DEBUG_CLASSMAP_PARAM(disjoint_bits, p); +DYNAMIC_DEBUG_CLASSMAP_PARAM(level_num, p); + +#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); + +#endif =20 /* stand-in for all pr_debug etc */ #define prdbg(SYM) __pr_debug_cls(SYM, #SYM " msg\n") @@ -115,6 +174,7 @@ static void do_levels(void) =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.52.0 From nobody Sun Feb 8 07:58:43 2026 Received: from mail-ot1-f68.google.com (mail-ot1-f68.google.com [209.85.210.68]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DF2D6309DD2 for ; Wed, 14 Jan 2026 02:00:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.68 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768356014; cv=none; b=i+oFJKcrnN7VQtu6jkXvluH5byBpm43SFPvxIKQ2fM7kj6bjGboe7Hmibej3lF2HNtGEPjFsVof7csZXCq73VaTO3ErXZsc356+yujdEm903LBQW75x7FbnLxv/aVFMkz49YrIwrD7V61rDEcfTi5bevAlo/595m2zOmYggANWg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768356014; c=relaxed/simple; bh=1sM428IcCo3LF0ivOmThhJmgO0lyRvaBC5WHALmVNys=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=AGCFuTVCK9RrsAkGpQZtN9O73YO4ZplEYcE6OZMxRFsvJoNgE4ULHlRcs8LL9b45K5bRjLj4UovhB6VjMqDhf4AFN5r6Zd1LiF06q1WcBcwEzD703ZnnGD1VKC6S6wlxI74Nuynum1Yo7UCoBSfezqwtBhOioVT/OmKrtLbV0xY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=BMiIfe/4; arc=none smtp.client-ip=209.85.210.68 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="BMiIfe/4" Received: by mail-ot1-f68.google.com with SMTP id 46e09a7af769-7c95936e43cso3185036a34.0 for ; Tue, 13 Jan 2026 18:00:12 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1768356012; x=1768960812; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=m6OB9Pa9Gle2V+EOSWrg2iFtsBZdBFQQ3jPBPibwDk8=; b=BMiIfe/4rNwL/GniPiW2ar2IwANZhjPN+PKflpPEZ9SFem+T93FK1IotmTLl09tedl i91bOi32ng0tcsyAQ5kDPO8rbAlETRlNGdbg8V0EKThCH4Z/wg1UyLk4MYl4WNf0NpCf vuZ5y4p8C7rw2sUbj9VBDa/6RMnZcN18BZbJCSLCATYRxD/LKfHvt0lqLMTpL2Xx4SkY qvwC+1VLLIJTstz5DYoxjsJPKVeVne72tBFTUPdtjDQHzcSXMEvjH9pxp79373FeSHd8 8/qn8OE7LtwGgyoons1SuIPadKJdQ27nRMxMwNY4SpK0i23jBXevXVLVS1XIx43B+KBI x4Ww== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768356012; x=1768960812; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=m6OB9Pa9Gle2V+EOSWrg2iFtsBZdBFQQ3jPBPibwDk8=; b=SNnq1g6v2HsrTnHb60R7fJyKCyb2Z6sy0hiipxwk1WNKstYnnmr29Nz1pQ3Mt5oTid S/AlwAk1rSvcbgvMho0cUpO7grZ6Uwc0wXYVYuLCzfklhjva47bSOMcGQI2d23xvGpcw +R5taMcVdX80xkudsZG4uoXt7wqFmtkhH/9h4Yt1uZ4JEmyqMJsnF1O6ADZSrhK7JxwE K/R0NczvQBOA5lNT8COp7xBJGIx3A3GyLCW3BWYPLe4UsWY6UAB1kWKK3mGPid5T4iKh kggpG8LyMAL8j7xjW4abX7ytojSVFycXpJKwSk4dJ0ZX0F7J402/0qogSFudVhw/tClu oElw== X-Forwarded-Encrypted: i=1; AJvYcCUZLPJ1wxHYmq7EY3MAqTrOG7dYOoZ6/LoLZExqARrBRaQRbt6eaYrl5O8B/ZLBpVGP5Z1kkB9W3NWGmdI=@vger.kernel.org X-Gm-Message-State: AOJu0Yw20tsVz9iX4K6BlMZnDrOQhE+fif5P1JB+VkKa1ylTM+pPxFT4 Me9RX5F5dSw28ix6qIHVBMDW9XOf+X79dmjVdSdudFgL2aXXiaczVZoS X-Gm-Gg: AY/fxX7N0sigDxEr/QYGK883/sZzquVMBtKCTR0F+ryKK8zB/hciVroA70ozCnpT7+T wgpSFfGLom0Cek/lAOsGwzJ07vkzMGxTUAZ6gMa0UnQspg+P/WMbTVdfMuYpJIXZ9EhFz2lkYuB IicjeCY3zk9/6SbTxkMw1n64dbuxx31D/aPXVKowcyWhi3j/WjD6zzwFdQV7ZZYiPz+wcshOMK7 KILyQbXyYfgWzqKvjZKP1si8kTA7BgbOOxNrvvUVV/D8peaE3RJKSH4QlntAb9h0FSRYDdum0Xi dcryxawKDaQVaFN2ZpBdT1Ic9NYSLxUGDbYQTctNGaSxvPZNKnrDtQWfZJwFUjwBm2hq9BlEFxu o8MyQsLMOeKD0DdFtuY5iWc2vu5HQhzinLAQsNPEJmsP5UEuv6z+cwKndKi5lwkKMCNkbj8yqSq +ou9i9iXwMlntUMh2GEawBNeFedK05Fv6rQo5+ynmQe0lsxtM= X-Received: by 2002:a05:6830:4393:b0:7ca:e8bf:8c4a with SMTP id 46e09a7af769-7cfc8a7b27emr879644a34.12.1768356011430; Tue, 13 Jan 2026 18:00:11 -0800 (PST) Received: from frodo (c-98-38-17-99.hsd1.co.comcast.net. [98.38.17.99]) by smtp.googlemail.com with ESMTPSA id 46e09a7af769-7ce478af813sm17036674a34.19.2026.01.13.18.00.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 13 Jan 2026 18:00:11 -0800 (PST) From: Jim Cromie To: gregkh@linuxfoundation.org, linux-kernel@vger.kernel.org Cc: Jim Cromie , Jason Baron , =?UTF-8?q?=C5=81ukasz=20Bartosik?= , Louis Chauvet , Bagas Sanjaya , Dave Airlie , Daniel Vetter , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , dri-devel@lists.freedesktop.org, Petr Mladek , Shuah Khan , linux-doc@vger.kernel.org, Steven Rostedt , "Liam R. Howlett" Subject: [PATCH v8 22/31] dyndbg: detect class_id reservation conflicts Date: Tue, 13 Jan 2026 18:57:38 -0700 Message-ID: <20260114015815.1565725-23-jim.cromie@gmail.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260114015815.1565725-1-jim.cromie@gmail.com> References: <20260114015815.1565725-1-jim.cromie@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" 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 Signed-off-by: Jim Cromie --- lib/dynamic_debug.c | 10 ++++++++++ lib/test_dynamic_debug.c | 8 ++++++++ 2 files changed, 18 insertions(+) diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c index c60c2142f8ac..e5a18a7d3780 100644 --- a/lib/dynamic_debug.c +++ b/lib/dynamic_debug.c @@ -1317,6 +1317,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) @@ -1341,6 +1342,11 @@ static int ddebug_add_module(struct _ddebug_info *di) dd_mark_vector_subrange(i, cli, &dt->info, users, dt); /* now di is stale */ =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); @@ -1353,6 +1359,10 @@ static int ddebug_add_module(struct _ddebug_info *di) vpr_info("%3u debug prints in module %s\n", dt->info.descs.len, dt->info.mod_name); return 0; +cleanup: + WARN_ONCE("dyndbg multi-classmap conflict in %s\n", di->mod_name); + kfree(dt); + return -EINVAL; } =20 /* helper for ddebug_dyndbg_(boot|module)_param_cb */ diff --git a/lib/test_dynamic_debug.c b/lib/test_dynamic_debug.c index 6c4548f63512..1ba4be9a403a 100644 --- a/lib/test_dynamic_debug.c +++ b/lib/test_dynamic_debug.c @@ -128,6 +128,14 @@ DYNAMIC_DEBUG_CLASSMAP_DEFINE(map_level_num, DD_CLASS_= TYPE_LEVEL_NUM, DYNAMIC_DEBUG_CLASSMAP_PARAM(disjoint_bits, p); DYNAMIC_DEBUG_CLASSMAP_PARAM(level_num, p); =20 +#ifdef FORCE_CLASSID_CONFLICT +/* + * Enable with -Dflag on compile to test overlapping class-id range + * detection. This should warn on modprobes. + */ +DYNDBG_CLASSMAP_DEFINE(classid_range_conflict, 0, D2_CORE + 1, "D3_CORE"); +#endif + #else /* TEST_DYNAMIC_DEBUG_SUBMOD */ =20 /* --=20 2.52.0 From nobody Sun Feb 8 07:58:43 2026 Received: from mail-ot1-f66.google.com (mail-ot1-f66.google.com [209.85.210.66]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4604B30C353 for ; Wed, 14 Jan 2026 02:00:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.66 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768356018; cv=none; b=pkKmalx/MoYcitPh82aawwqr6qU7+Q+fWhwaPm2wG3c/0dYUnrloktKr4BJyczlboi8Sg2BPKu8HRgfxZQe+taPfKOFolr/8ko0TS9lpsvlhfHF4RdmRLxtmdfQsEla06aRefiqFEyE3zuOaw0l27NcTGpsZaJdgtpWOp80ReHY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768356018; c=relaxed/simple; bh=Odcd6YwIhhQurU/smbiY8MbtQ0MmiwPiMOaa2h2/m5Y=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=pfjuL8fljRlWzdDSfeXNc7oFmUgO+2yg7Mm5TyBD/0pq7b6/zaBq9bo7WSIuD3mIE0G0ZKdsjKNbLa1DcUpkygVN6Asqa11E281exV3Ne+5jAbIYYXwdXeEFTjHazBRARB7YF5V2b4+aLy/bLc/SoXKPwEefYpWL9l+Juuz66DU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=k/IKgAfg; arc=none smtp.client-ip=209.85.210.66 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="k/IKgAfg" Received: by mail-ot1-f66.google.com with SMTP id 46e09a7af769-7c750b10e14so3517256a34.2 for ; Tue, 13 Jan 2026 18:00:16 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1768356015; x=1768960815; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=ekbNT1OfK8aGhMhy2w3gZ5CU/UUE92pgkgzIatZ/Ils=; b=k/IKgAfgIhbh26gP8KBdnhuqdkAjwlY/VdMEv/VeqQA9zBJTreXdzrW5PMlmq7gvRR aAzpWJsjZR4LAVxw4QqpjYKzNusZDMhwUN/tQI9nrZXsqAcPIq/GxQ+jdXVbP4o8us8k TNIS93ITUhPMr7Wqai+y+7QXXs4SVhsIUaTK+wotWGmCavjUVFIBaH3CLOaGdO/kt91h Q4NRcdPiIUIambyZ6E4vxgen0SkJyJ2P697l3sx2rSDTh2egKmd71qvV3igz0qZzTeoX CrfzYKmtYN0IgsgANLU/Gy1ahIm7JuGZHXhYlpXHSuU1VR2VfOaHJ29GPdyRhITPzQ0B PwKw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768356015; x=1768960815; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=ekbNT1OfK8aGhMhy2w3gZ5CU/UUE92pgkgzIatZ/Ils=; b=MKNpnu8Cln44uYOQWe0eVHDOqZ0fxDTaP60CTrImonZ6EeOBoUCBgLoh/AMEnlshc+ Bunh3cFnzGnVTYLM0iPGuUSMP8NpNBotQeI5Z0+AB3aEipls/lWqJJnRF9iYFVYyw+wo Wn1Irk21aqaeO9FU38rjx7GN2AsdMpLHsJGNAisNtIJyDm2wumeiamSisXfHoiUjbea8 526XQAHyjNrdNmwMu3DltuGw0alIvK7IfHok13heP4Ex/ZCszEDFStwwc0twNhcR594i bP9J451iUEOyU4kqYjdFE5OPu1OkD35CBBHox0eRcwspSfiD3iHyMDDOCiDP8gl0+YiJ i8QQ== X-Forwarded-Encrypted: i=1; AJvYcCXNc6ACCp/9ukridHJy3fZ11k+Gnw+vUasIyAIiKkBEuDlt70imxrm4VqD5u7Wa/G8euzncWNpRlDiUgpI=@vger.kernel.org X-Gm-Message-State: AOJu0YxarXw+vnrKOoxtGvC/ygHmm3qQd67vXKryfWFFX8D/MIFjCB0J hQVld4cUyxDlhmU3LHCd/6pb7zaRiatTwK2+VlpT9xo2W7Q57d9xf39E X-Gm-Gg: AY/fxX4OZ9JJ4jqCRySm2kmwiY5Yl7zL9heWQXlUwSeXvs+rQYDXlQfj5oXUNz6ILoE AgxDwajeoP9VZrgyf44d8B/DHXofpzfKsImmtSaH7zu6lnvGib4/NqfvaKEJwtAiPea1FnHCS1C g1tUjfrJ7pG31BEt8AzAtcA6CQZCGKhUdGItqu7lCNrmaX6/UD7Gwv0tCCmWpwef9igfVkgPYgK eZ5nyJRtiuM/vtMArM0MPb1FxmeRKCGtY+Xf6B2e/QcQKuORad/QhxkuUp3H2pCY0O8Fx6KMywl 02OoKRwQAQyOruJOdNf3gllPc5CEYlfx5HT+h+LtnshFKYyjZPX+i5IuPXEHGlYX8at4cNzQcQb 2GjEc4+1hthaJjyCh2FcDR08QzauF+zkbnpcqJ9SxzY9IBvHySpOpgp0Vdu0zHvX1Y5h00Sikzc N3DL9yDfLa7TlZEHCsbKRV7x1L5GXHO2mjPXgYap2Bg7aisGM= X-Received: by 2002:a05:6830:4c82:b0:7ce:2b34:deca with SMTP id 46e09a7af769-7cfcb66f5fdmr225302a34.28.1768356015134; Tue, 13 Jan 2026 18:00:15 -0800 (PST) Received: from frodo (c-98-38-17-99.hsd1.co.comcast.net. [98.38.17.99]) by smtp.googlemail.com with ESMTPSA id 46e09a7af769-7ce478ee883sm17634530a34.28.2026.01.13.18.00.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 13 Jan 2026 18:00:14 -0800 (PST) From: Jim Cromie To: gregkh@linuxfoundation.org, linux-kernel@vger.kernel.org Cc: Jim Cromie , Jason Baron , =?UTF-8?q?=C5=81ukasz=20Bartosik?= , Louis Chauvet , Bagas Sanjaya , Dave Airlie , Daniel Vetter , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , dri-devel@lists.freedesktop.org, Petr Mladek , Shuah Khan , linux-doc@vger.kernel.org, Steven Rostedt , "Liam R. Howlett" Subject: [PATCH v8 23/31] dyndbg: check DYNAMIC_DEBUG_CLASSMAP_DEFINE args at compile-time Date: Tue, 13 Jan 2026 18:57:39 -0700 Message-ID: <20260114015815.1565725-24-jim.cromie@gmail.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260114015815.1565725-1-jim.cromie@gmail.com> References: <20260114015815.1565725-1-jim.cromie@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" 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 + _base) < 63 These compile-time checks will prevent several simple misuses, and will issue obvious errors if violated. 4 such examples are added to test_dynamic_debug_submod.ko, and will fail compilation if -DDD_MACRO_ARGCHECK is added to cflags. This wouldn't be a useful CONFIG_ item, since it breaks the build. Signed-off-by: Jim Cromie --- include/linux/dynamic_debug.h | 9 +++++++++ lib/test_dynamic_debug.c | 13 ++++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/include/linux/dynamic_debug.h b/include/linux/dynamic_debug.h index ad3dc10ff03a..d8bfd19efde6 100644 --- a/include/linux/dynamic_debug.h +++ b/include/linux/dynamic_debug.h @@ -180,6 +180,14 @@ struct _ddebug_class_param { * __pr_debug_cls(22, "no such class"); compiles but is not reachable */ =20 +#define __DYNAMIC_DEBUG_CLASSMAP_CHECK(_clnames, _base) \ + static_assert(((_base) >=3D 0 && (_base) < _DPRINTK_CLASS_DFLT), \ + "_base must be in 0..62"); \ + static_assert(ARRAY_SIZE(_clnames) > 0, \ + "classnames array size must be > 0"); \ + static_assert((ARRAY_SIZE(_clnames) + (_base)) < _DPRINTK_CLASS_DFLT, \ + "_base + classnames.length exceeds range") + /** * DYNAMIC_DEBUG_CLASSMAP_DEFINE - define debug classes used by a module. * @_var: name of the classmap, exported for other modules coordinated u= se. @@ -193,6 +201,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)); \ extern struct _ddebug_class_map _var; \ struct _ddebug_class_map __aligned(8) __used \ __section("__dyndbg_class_maps") _var =3D { \ diff --git a/lib/test_dynamic_debug.c b/lib/test_dynamic_debug.c index 1ba4be9a403a..b2bdfdfb6ba1 100644 --- a/lib/test_dynamic_debug.c +++ b/lib/test_dynamic_debug.c @@ -133,7 +133,7 @@ DYNAMIC_DEBUG_CLASSMAP_PARAM(level_num, p); * Enable with -Dflag on compile to test overlapping class-id range * detection. This should warn on modprobes. */ -DYNDBG_CLASSMAP_DEFINE(classid_range_conflict, 0, D2_CORE + 1, "D3_CORE"); +DYNAMIC_DEBUG_CLASSMAP_DEFINE(classid_range_conflict, 0, D2_CORE + 1, "D3_= CORE"); #endif =20 #else /* TEST_DYNAMIC_DEBUG_SUBMOD */ @@ -146,8 +146,19 @@ DYNDBG_CLASSMAP_DEFINE(classid_range_conflict, 0, D2_C= ORE + 1, "D3_CORE"); DYNAMIC_DEBUG_CLASSMAP_USE(map_disjoint_bits); DYNAMIC_DEBUG_CLASSMAP_USE(map_level_num); =20 +#if defined(DD_MACRO_ARGCHECK) +/* + * 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 */); #endif =20 +#endif /* TEST_DYNAMIC_DEBUG_SUBMOD */ + /* stand-in for all pr_debug etc */ #define prdbg(SYM) __pr_debug_cls(SYM, #SYM " msg\n") =20 --=20 2.52.0 From nobody Sun Feb 8 07:58:43 2026 Received: from mail-ot1-f49.google.com (mail-ot1-f49.google.com [209.85.210.49]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2D9333043DC for ; Wed, 14 Jan 2026 02:00:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.49 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768356021; cv=none; b=qLihy8aMhmr1FK1QfOlaIJF7/Y7I+bzEx6c5Ym58dTbipfyOrgQnmi9nmz5rKX0CbIjn8RicHkgCT7JxKQJ/odWjOXrMun+y6qAiKY+1y7QEdTxtd0XbyxlKmTobMJdxW4/op4nUSYQHgsJxWsesr9KjxHvbdYCcx4f6mNDmBjo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768356021; c=relaxed/simple; bh=ZBKwFw/eHYoONtVKVezRTboDnUoeSjSt8KmXn5wFi9c=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Ug5JiU1Ia2dcN54Bv7T3VmaTkBI7BgOSf5Zam6yOeataoYireOdW4vc4OpzxJPbLLRHN2BDOvcJwc/F/M/qAljLWZ+PfV5j8wktQlbQ6jai7n0fnvEsuDEoA9ioHM9e1jvS2Qh4HidaodVZLDvEx+VFBHK0hDGaMHpZ+GrXrGU4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=iRAPh4Po; arc=none smtp.client-ip=209.85.210.49 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="iRAPh4Po" Received: by mail-ot1-f49.google.com with SMTP id 46e09a7af769-7c76f65feb5so6653138a34.0 for ; Tue, 13 Jan 2026 18:00:20 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1768356019; x=1768960819; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=FrG1isq17Lyb0bJFCu5jKcbVF320nGGDAVNnMWnzxZY=; b=iRAPh4Pou+oGtrI/Vh34ynSK+YgwQbgzGH9FmAcWGGdbuGlpQNdCMpt2TqoU4O7A9z m0TZ6a96gYM/dY86C/pokSKVIl4U29pVaGo+XScYYTqgX9xPH7ag+9aRBTcVsq65rNSn PclwQIKbibITl52zdDRmDdwCB8JJQ1YfuZr4m63amFJ2200QjgOWHEygd3u4gZDbA6PE IUaGHsckD71NusaE5+PPsEj91LnL6bP95cMYggUWsx6EFdXIdkjhk2Mg/lQXwcH3Incu eTiIj4EG+jGmVNB4tBMDLYMjLXDU0mIFgm+44jd6Yvc7D67GXqF+GjF2an5384PeMMaa 76oA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768356019; x=1768960819; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=FrG1isq17Lyb0bJFCu5jKcbVF320nGGDAVNnMWnzxZY=; b=cnRLLx3NXZcTa8QvYW/naE/UHl2z1f1ngM+e1+1xrWx1qVvFi4l9hO8QS2PbZEVqqb Je59zcoYJPR3TdfR+BsgfUIGv5op9PLI96RFib/aky/G3Z910dBbmwL5f2pjRCqEcpRL vacY8q4147WUGr/JiHQ2E7IAamB85m8O+xYrV2wm+clYB8VnGVdNk+1y/lW17JD9kpwY hewnN9hD9q1j7O7+jURqxvhB6CElS0xY+talyjIQT7Rt+NH/KD/H7YlGBIunb+OAtcjo ls/pe465xGv8FsF47zl2i3tBgZ5q6JrOAYQYzEFjCq5vbZ7Fg8YyCp+cuiye/DfbE+CA hluA== X-Forwarded-Encrypted: i=1; AJvYcCXveQ7IW80OpHMRhJqWZcl3vNTUOWaNDhFuY1PYyldXpd2X44WxyXraAzAfn+QcrjdSX5YrYJjadE7d98M=@vger.kernel.org X-Gm-Message-State: AOJu0YzX9a9UlCpq3wpErDxTQzS5LE0SZYY+BxxVR/Gz85yGScGPuLJp a1+c3WZFyYWEzJTluKO809Qo8XYb8YvvrzDMermk7eTUA7zgia3oLjQu X-Gm-Gg: AY/fxX6Rkj6kHf4Xhro0z+ppglSJjigb2yJL+9XBppLLHSYZH+gYfp5cVsEz5gUHQgy oMYTEdSfilik75OrlP0PpO6zRDTxvbMe0QOCjJGa8B3mGJ+0+/uGFKiIMduU3FY7IIZA+/58tp8 g5ZqBMPIAdOyWBHfnsoW0+DqHwvZpZ9nn8Kr1y5kxxvI1G2hJsqIGVjSIBpu+c4cP9bKeAlIIJj K45d8VmUHNB10RNVkb3WVftvOahx9XFKYcvsWvOTFW502NOQrSLl8ih2VOPq/tFpQNLVU1vEpwq YhN92ygJmUlENAdu9JabuFwN6KLvNXEaq3sg5bG8a4DGbt3Rt0jeVDQiwrRfcwQ3cSl99nzbrAf jhUI8WW1Un7z7nwsW1ss29IzIE6DLlKroiVD/qncTbv13KEB9uQELKNnEES9QcobYjzaqnsOU+E NtUuPD2uxtOvMTHKrvyJrkSELjCp80/9C/5xLo X-Received: by 2002:a05:6830:449f:b0:7c7:2cd3:5baa with SMTP id 46e09a7af769-7cfc8bab822mr907389a34.34.1768356019220; Tue, 13 Jan 2026 18:00:19 -0800 (PST) Received: from frodo (c-98-38-17-99.hsd1.co.comcast.net. [98.38.17.99]) by smtp.googlemail.com with ESMTPSA id 46e09a7af769-7cfc9894ae0sm731526a34.25.2026.01.13.18.00.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 13 Jan 2026 18:00:18 -0800 (PST) From: Jim Cromie To: gregkh@linuxfoundation.org, linux-kernel@vger.kernel.org Cc: Jim Cromie , Jason Baron , =?UTF-8?q?=C5=81ukasz=20Bartosik?= , Louis Chauvet , Bagas Sanjaya , Dave Airlie , Daniel Vetter , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , dri-devel@lists.freedesktop.org, Petr Mladek , Shuah Khan , linux-doc@vger.kernel.org, Steven Rostedt , "Liam R. Howlett" Subject: [PATCH v8 24/31] dyndbg-test: change do_prints testpoint to accept a loopct Date: Tue, 13 Jan 2026 18:57:40 -0700 Message-ID: <20260114015815.1565725-25-jim.cromie@gmail.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260114015815.1565725-1-jim.cromie@gmail.com> References: <20260114015815.1565725-1-jim.cromie@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" echo 1000 > /sys/module/test_dynamic_debug/parameters/do_prints This allows its use as a scriptable load generator, to generate dynamic-prefix-emits for flag combinations vs undecorated messages. This will make it easy to assess the cost of the prefixing. Reading the ./do_prints node also prints messages (once) to the-log. Signed-off-by: Jim Cromie --- lib/test_dynamic_debug.c | 32 +++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/lib/test_dynamic_debug.c b/lib/test_dynamic_debug.c index b2bdfdfb6ba1..fa81177e8089 100644 --- a/lib/test_dynamic_debug.c +++ b/lib/test_dynamic_debug.c @@ -29,18 +29,25 @@ =20 #include =20 -/* re-gen output by reading or writing sysfs node: do_prints */ - -static void do_prints(void); /* device under test */ +/* re-trigger debug output by reading or writing sysfs node: do_prints */ +static void do_prints(unsigned int); /* device under test */ static int param_set_do_prints(const char *instr, const struct kernel_para= m *kp) { - do_prints(); + int rc; + unsigned int ct; + + rc =3D kstrtouint(instr, 0, &ct); + if (rc) { + pr_err("expecting numeric input, using 1 instead\n"); + ct =3D 1; + } + do_prints(ct); return 0; } static int param_get_do_prints(char *buffer, const struct kernel_param *kp) { - do_prints(); - return scnprintf(buffer, PAGE_SIZE, "did do_prints\n"); + do_prints(1); + return scnprintf(buffer, PAGE_SIZE, "did 1 do_prints\n"); } static const struct kernel_param_ops param_ops_do_prints =3D { .set =3D param_set_do_prints, @@ -191,17 +198,20 @@ static void do_levels(void) prdbg(V7); } =20 -static void do_prints(void) +static void do_prints(unsigned int ct) { - pr_debug("do_prints:\n"); - do_cats(); - do_levels(); + /* maybe clamp this */ + pr_debug("do-prints %d times:\n", ct); + for (; ct; ct--) { + do_cats(); + do_levels(); + } } =20 static int __init test_dynamic_debug_init(void) { pr_debug("init start\n"); - do_prints(); + do_prints(1); pr_debug("init done\n"); return 0; } --=20 2.52.0 From nobody Sun Feb 8 07:58:43 2026 Received: from mail-ot1-f68.google.com (mail-ot1-f68.google.com [209.85.210.68]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5D78230E82C for ; Wed, 14 Jan 2026 02:00:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.68 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768356026; cv=none; b=pyWk4V4muBwaxCzxwyFcGHT8m3Kzvfeettk1+664VFBM1SS9/fRUN3f97o+Mjoy4JXLP9yozXhJWMSA9oKGbjCXuJXJ4g7LTgPnxTx1MwupEUr6ycm2iYZYEZ9dkEpaUBulalMx8XYj0IsXx4sMweZ/Tuj4dnIbtPS2qu/TFS4M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768356026; c=relaxed/simple; bh=JrGalG79A/QWjWPcf3LPTT59mySQJZb6UBfFsfux6S8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=m4LSM34TOPBCd6nzqmtxPAgkRZ46l5gL01qBpAR+7x8Tm8DEASI5Y6aOQyHYLvkRFE5CjjrxLmOdgiJSIMBejBniMFjsaS9+Txy0mLxk2pPM001mW6orOmJCxLaN0BuG0TeRUbUAVNQxf8xhPQLiHDimyXo/RDdfsQ1t16PsSc8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=B3HqeMe+; arc=none smtp.client-ip=209.85.210.68 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="B3HqeMe+" Received: by mail-ot1-f68.google.com with SMTP id 46e09a7af769-7c7aee74dceso3563656a34.2 for ; Tue, 13 Jan 2026 18:00:24 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1768356023; x=1768960823; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=9X4+baehajHgihOIW9M34uS7QXrUAN7AiCz60UiFvS4=; b=B3HqeMe+bBRUUHG1608EaKSC/0McfBvIHCSONsEYgca/fOertZg55A2ufSv4954cTn wV6nH3YumiuwaYwgEeh14D60ak1qR6ufzfobZlZPWYigHyUdx9YT21fR3k3rWCt4qWyf QAaWnVrZtFMwdRdaTS2OGMi/lquHT0lzAlPfz3K7nsRt2aMSU0nqyyPluhd2vm9arxNy 323BxyqfYseDacYuz5KNiw17tzPxZCkOt6YOLBw36t07oJAGQHM4cxb6iKAnZGet+BPM P5dxLkmrTXvQvyoDtG8mZqzFLZdGwJfCemsfOjS/D89pGABBTKcAPoM/AJd1HZwHCYiz 8Wwg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768356023; x=1768960823; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=9X4+baehajHgihOIW9M34uS7QXrUAN7AiCz60UiFvS4=; b=fUfh1dQOpCR2RkTaUw427GZI1h5xyRj7uifp8FWURlfcdinPvqv9kUAPiEUTQ1sfYf jlEWdt7/FBqr2Ni/zfn+DRyHP8S6P5ajb8tCHp8rpq7Zpr9jvA2BAeeyZ8AboGbzmTNJ TRc2SFep79YZ4/R4ZxUUkv9grHQSZ58fJ3Fb6IbP5FlP9OhlWNSIIwIvBNgnA6n3fb1k 4OAflQPnb6Ja8tfk5GgehuYumvnklMpMMhFGBY4wC0Nq56epoXPt6dSxkdVBbCHJ6qif L4G7od5dvOreRRUYgmwIx+IlxVgk3mjmpzLWUFjRdsFV/y5u1fVoFaSMqZJaTmTxehxM 8f4Q== X-Forwarded-Encrypted: i=1; AJvYcCXK9ogWAYLeEOtCtu/xGSLNxrMY/npxLfhXYJgaSh2AO7c6NoNwAqhoa5Y49CmbYf/xRNsqR/R/casktYg=@vger.kernel.org X-Gm-Message-State: AOJu0YwktoHFvLGs6hk5NScrg/ePE06lwPuA93ZqeX23N5LnAMpA/Yl6 aEygOgGMSStgRgJDEOMYPWB+AXvBFpb1Lye+nMotHtyckBfziTai/jzJ X-Gm-Gg: AY/fxX6dUbd909qW0Ywwk7wvFRI2UPLrw1whPygiUIQYyHUda0iXW3F8wibqBA3+FKf 1qryWwRh3UV5IPM+x9zcE4D6RsUuO/Lox1GG+EYVC6v5kUnJA1i5ZTupCH4wNdfcLqsgFhW7t7w NOmjPyXVWfNd5GFnodFzJ132s3jmeLeVchol6ZopgVP37wNS1eeR9SV9yCviDdLr1I8t8KgKSjo rMxOK2YNsnx2JlF/Gmff21qKfeWbCHUJJVYr5e1iz09+illf4IFxEVPyUCi+yDpXcNXdroE0Szx 5rFjq/zrfYsGi4ThLcxlY/kume0C2vVymmJya792HB9SQhz3OqbbqmvX+nzF9dRQR1UsmLp1gzp dqclLi8po7RqyspSpUB+ARDB69DpPhL80sHVi5Peq3dg//C5AvPyIiRE1CyH6oKqwiWxyd4fxhd aqzqVkdSXuWcJpjRWeGe3+SLscV86XJu12QZoK X-Received: by 2002:a05:6830:c94:b0:7c5:3798:fa4e with SMTP id 46e09a7af769-7cfc8b176eamr802119a34.17.1768356023226; Tue, 13 Jan 2026 18:00:23 -0800 (PST) Received: from frodo (c-98-38-17-99.hsd1.co.comcast.net. [98.38.17.99]) by smtp.googlemail.com with ESMTPSA id 46e09a7af769-7ce478d9f54sm17646037a34.23.2026.01.13.18.00.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 13 Jan 2026 18:00:22 -0800 (PST) From: Jim Cromie To: gregkh@linuxfoundation.org, linux-kernel@vger.kernel.org Cc: Jim Cromie , Jason Baron , =?UTF-8?q?=C5=81ukasz=20Bartosik?= , Louis Chauvet , Bagas Sanjaya , Dave Airlie , Daniel Vetter , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , dri-devel@lists.freedesktop.org, Petr Mladek , Shuah Khan , linux-doc@vger.kernel.org, Steven Rostedt , "Liam R. Howlett" Subject: [PATCH v8 25/31] dyndbg-API: promote DYNAMIC_DEBUG_CLASSMAP_PARAM to API Date: Tue, 13 Jan 2026 18:57:41 -0700 Message-ID: <20260114015815.1565725-26-jim.cromie@gmail.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260114015815.1565725-1-jim.cromie@gmail.com> References: <20260114015815.1565725-1-jim.cromie@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" 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, decls a static long unsigned int to store the bitvec. __DYNAMIC_DEBUG_CLASSMAP_PARAM bottom layer - allocate,init a ddebug-class-param, module-param-cb. Modify ddebug_sync_classbits() argtype deref inside the fn, to give access to all kp members. 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 --- include/linux/dynamic_debug.h | 40 ++++++++++++++++++++++ lib/dynamic_debug.c | 60 ++++++++++++++++++++++----------- lib/test_dynamic_debug.c | 47 ++++++++++---------------- lib/test_dynamic_debug_submod.c | 9 ++++- 4 files changed, 106 insertions(+), 50 deletions(-) diff --git a/include/linux/dynamic_debug.h b/include/linux/dynamic_debug.h index d8bfd19efde6..d9d906fd6343 100644 --- a/include/linux/dynamic_debug.h +++ b/include/linux/dynamic_debug.h @@ -250,6 +250,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 unsigned long _name##_bvec; \ + __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 unsigned long 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 @@ -422,6 +460,8 @@ void __dynamic_ibdev_dbg(struct _ddebug *descriptor, =20 #define DYNAMIC_DEBUG_CLASSMAP_DEFINE(_var, _mapty, _base, ...) #define DYNAMIC_DEBUG_CLASSMAP_USE(_var) +#define DYNAMIC_DEBUG_CLASSMAP_PARAM(_name, _var, _flags) +#define DYNAMIC_DEBUG_CLASSMAP_PARAM_REF(_name, _var, _flags) #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 e5a18a7d3780..1da2de7b1769 100644 --- a/lib/dynamic_debug.c +++ b/lib/dynamic_debug.c @@ -687,6 +687,30 @@ static int ddebug_apply_class_bitmap(const struct _dde= bug_class_param *dcp, =20 #define CLASSMAP_BITMASK(width) ((1UL << (width)) - 1) =20 +static void ddebug_class_param_clamp_input(unsigned long *inrep, const str= uct 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%lx exceeds mask: 0x%lx, 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:%ld exceeds max:%d, clamping\n", + KP_NAME(kp), *inrep, map->length); + *inrep =3D map->length; + } + break; + } +} static int param_set_dyndbg_module_classes(const char *instr, const struct kernel_param *kp, const char *mod_name) @@ -705,26 +729,15 @@ static int param_set_dyndbg_module_classes(const char= *instr, pr_err("expecting numeric input, not: %s > %s\n", 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%lx exceeds mask: 0x%lx, masking\n", - KP_NAME(kp), inrep, CLASSMAP_BITMASK(map->length)); - inrep &=3D CLASSMAP_BITMASK(map->length); - } v2pr_info("bits:0x%lx > %s.%s\n", inrep, mod_name ?: "*", KP_NAME(kp)); totct +=3D ddebug_apply_class_bitmap(dcp, &inrep, *dcp->bits, mod_name); *dcp->bits =3D 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", - KP_NAME(kp), inrep, map->length); - inrep =3D map->length; - } old_bits =3D CLASSMAP_BITMASK(*dcp->lvl); new_bits =3D CLASSMAP_BITMASK(inrep); v2pr_info("lvl:%ld bits:0x%lx > %s\n", inrep, new_bits, KP_NAME(kp)); @@ -1195,15 +1208,24 @@ static const struct proc_ops proc_fops =3D { static void ddebug_sync_classbits(const struct kernel_param *kp, const cha= r *modname) { const struct _ddebug_class_param *dcp =3D kp->arg; + unsigned long new_bits; =20 - /* clamp initial bitvec, mask off hi-bits */ - if (*dcp->bits & ~CLASSMAP_BITMASK(dcp->map->length)) { - *dcp->bits &=3D CLASSMAP_BITMASK(dcp->map->length); - v2pr_info("preset classbits: %lx\n", *dcp->bits); + ddebug_class_param_clamp_input(dcp->bits, kp); + + switch (dcp->map->map_type) { + case DD_CLASS_TYPE_DISJOINT_BITS: + v2pr_info(" %s: classbits: 0x%lx\n", KP_NAME(kp), *dcp->bits); + ddebug_apply_class_bitmap(dcp, dcp->bits, 0UL, modname); + break; + case DD_CLASS_TYPE_LEVEL_NUM: + new_bits =3D CLASSMAP_BITMASK(*dcp->lvl); + v2pr_info(" %s: lvl:%ld bits:0x%lx\n", KP_NAME(kp), *dcp->lvl, new_bits= ); + ddebug_apply_class_bitmap(dcp, &new_bits, 0UL, modname); + break; + default: + pr_err("bad map type %d\n", dcp->map->map_type); + return; } - /* force class'd prdbgs (in USEr module) to match (DEFINEr module) class-= param */ - ddebug_apply_class_bitmap(dcp, dcp->bits, ~0, modname); - ddebug_apply_class_bitmap(dcp, dcp->bits, 0, modname); } =20 static void ddebug_match_apply_kparam(const struct kernel_param *kp, diff --git a/lib/test_dynamic_debug.c b/lib/test_dynamic_debug.c index fa81177e8089..83c4d571a8c9 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 @@ -57,24 +58,6 @@ module_param_cb(do_prints, ¶m_ops_do_prints, NULL, 0= 600); =20 #define CLASSMAP_BITMASK(width, base) (((1UL << (width)) - 1) << (base)) =20 -/* sysfs param wrapper, proto-API */ -#define DYNAMIC_DEBUG_CLASSMAP_PARAM_(_model, _flags, _init) \ - static unsigned long 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. * @@ -105,12 +88,15 @@ enum cat_disjoint_bits { /* numeric verbosity, V2 > V1 related. V0 is > D2_DRMRES */ enum cat_level_num { V0 =3D 16, V1, V2, V3, V4, V5, V6, V7 }; =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, @@ -129,11 +115,13 @@ DYNAMIC_DEBUG_CLASSMAP_DEFINE(map_level_num, DD_CLASS= _TYPE_LEVEL_NUM, V0, "V0", "V1", "V2", "V3", "V4", "V5", "V6", "V7"); =20 /* - * now add the sysfs-params + * 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. */ =20 -DYNAMIC_DEBUG_CLASSMAP_PARAM(disjoint_bits, p); -DYNAMIC_DEBUG_CLASSMAP_PARAM(level_num, p); +DYNAMIC_DEBUG_CLASSMAP_PARAM(p_disjoint_bits, map_disjoint_bits, p); +DYNAMIC_DEBUG_CLASSMAP_PARAM(p_level_num, map_level_num, p); =20 #ifdef FORCE_CLASSID_CONFLICT /* @@ -144,12 +132,10 @@ 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. + * the +1 members of a multi-module group refer to the classmap + * DEFINEd (and exported) above. */ - DYNAMIC_DEBUG_CLASSMAP_USE(map_disjoint_bits); DYNAMIC_DEBUG_CLASSMAP_USE(map_level_num); =20 @@ -224,6 +210,7 @@ static void __exit test_dynamic_debug_exit(void) module_init(test_dynamic_debug_init); module_exit(test_dynamic_debug_exit); =20 +MODULE_DESCRIPTION("test/demonstrate dynamic-debug features"); MODULE_AUTHOR("Jim Cromie "); MODULE_DESCRIPTION("Kernel module for testing dynamic_debug"); 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"); --=20 2.52.0 From nobody Sun Feb 8 07:58:43 2026 Received: from mail-ot1-f48.google.com (mail-ot1-f48.google.com [209.85.210.48]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3E5433064A2 for ; Wed, 14 Jan 2026 02:00:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768356029; cv=none; b=OB0aY97axleK5oCSR2oIQiUtC/M4Jp89lM3JNYvGlmoIpjk7+vKxiedl9wHGdgeaqDVh6987mb9uHIlC53jE3BXrp/t+zS1qIqHbcDy9BmUaOaEyTVilO/6+AL4zyj39jsLMQnB3JuPbB0xMRiJlelDgLClOl5B0X1kSBRa+D5s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768356029; c=relaxed/simple; bh=9ih6W8Y/5V2V98AP03k684uMSvrAzs/VQOAmnnbAdf0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=SUul4ccjJ4GiJYEVlgrCBta0A9B9792T/FierNWgAKPIrjRFx8tD2nG/VDasCLAcDvQBzYsFnCJze4DZylVSghIFEepjT2fSg3qFU0SZ9YBC/1qN5bGRYQHEj0V//J8JytbXMt1Hq/fhH/Ub3PS8dlcQ/RqoCCTeWemntG2bR0Y= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=aCdsd1t1; arc=none smtp.client-ip=209.85.210.48 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="aCdsd1t1" Received: by mail-ot1-f48.google.com with SMTP id 46e09a7af769-7c701097a75so5022378a34.3 for ; Tue, 13 Jan 2026 18:00:28 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1768356027; x=1768960827; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=WDCSt59K+10ZOKnakaeCilFtSVyquWS+P/cFe/a6uAg=; b=aCdsd1t1bpjo9kktuakmkzMMneXG6iL0Zx/ZOSfFoQvfNwu5vjgkk7A2rX6Uz6laXO dQb7+CNRwtYJZEgqIyEQhXMKvaUE16uHMNaurej8Eoi6qLuuoCkKpXHbcwYw/K4NGp4N zreIne/rUJ3ImpHWh/CHMpdjXDIgKYVbkB+VQqKnS2UWmfjvYbp/6W9HMwWokez4gUuP 1PSLd1nZzHCZ2OdgNnJvjzmUBKZmYnPnZnXjpDNt4oO7DNkZO1L9XAzxg2VXkaO0W75H 6Ti4wn+6n6k/FC/osMNZXi3L2NazYT3KU2OCJGmQasQMZnuipzJ9gK18a7O0CG43Wn6i fTpQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768356027; x=1768960827; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=WDCSt59K+10ZOKnakaeCilFtSVyquWS+P/cFe/a6uAg=; b=DC3j9e6NNxLGTfeNnrveatijd4EKbf5SVAq/POkON2H71TMwPiHsZyCFV2VLrlUusa XQdy92W0lgYgFYo1nKTi1tWgrGyjk7jyd+R+8DqrXT2eAORCCht04IlcLOgCNr2ai65w QrEZRNrjOuthF3X4G0zkVEmb9vNwzqKyY2EGvrmv5xvXfFHsmLdYaT89pDpw3R/Xa5Sp mDjHBtS4p4vWueLKdYxYMST2JjBDt/HkQnL//IZ+z+58khcMHscJ9HyBt8mhIoEkSpGg SdC7Do6AwrIStjTouk9n6ygN7OJCJw0uClCFvBbv1QTmwJ0sPshJf/XbfqKqwQGWPlxG 8R4A== X-Forwarded-Encrypted: i=1; AJvYcCUOvE8LJd5ckxcgX56wefvqSEw5jMBxET+bfnUFt0i25tWXI52HPVP8xH4YdlXnaZTl5cdzuRQBmxpTGF8=@vger.kernel.org X-Gm-Message-State: AOJu0YxZTFb7GWAKuTgLQPtMUA64VfKaRiJ+W81RbIaCSZoywx+23vqC XHW8Bjim/kqLzOZtT+zXNm/OAumh2sDvPYX83m9Z97bKEnq9ODlmpmVt X-Gm-Gg: AY/fxX4GkjfTX4vWhN5KlhVmD6H4RLU0GR46A3oo6s74hoTHPXs6qta/clZ0Cio5NU5 aijmGX6nmOZllSKuvjonZh0/BNZCSoTZMjTopP6l3UBn2DXhwtkIOcMexZe+DxFQRv3RYla/Pwd mZNiH3M0DYV/Ah7/t8zBefZoEH/IR54L1Z5PT7yaLqOTiK4P03RQtwt3cXFgyk0pnkyTmUPOMu6 CUc+boYz2BKuunSYvGmCYVCJpmLaoVGVqU42A1MK7/4P7Ej0Itysere/oPG+32MonbdZkrtrL7T Hjp7uWYc0JFKmrYsmILbLJaZQKNe/REkKOZNqa7U6Mm/4g7zV0DO21nFuD4bOCmYvPNk1jvqBT5 8T8Xn5I4Yt9kl1Ut42cj/i+cv9ngBRQwF7FHt+Dy0ScjIFsDTqvbapBcA0nkMzyHqLMuPpn0giw 6Bf89kOY5gq3k13IIdch4boHaaVAvpJWl10FX0 X-Received: by 2002:a05:6830:4c8b:b0:7b2:aba7:f4e with SMTP id 46e09a7af769-7cfc8a99a10mr780858a34.10.1768356026972; Tue, 13 Jan 2026 18:00:26 -0800 (PST) Received: from frodo (c-98-38-17-99.hsd1.co.comcast.net. [98.38.17.99]) by smtp.googlemail.com with ESMTPSA id 46e09a7af769-7ce478ee668sm17747037a34.29.2026.01.13.18.00.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 13 Jan 2026 18:00:26 -0800 (PST) From: Jim Cromie To: gregkh@linuxfoundation.org, linux-kernel@vger.kernel.org Cc: Jim Cromie , Jason Baron , =?UTF-8?q?=C5=81ukasz=20Bartosik?= , Louis Chauvet , Bagas Sanjaya , Dave Airlie , Daniel Vetter , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , dri-devel@lists.freedesktop.org, Petr Mladek , Shuah Khan , linux-doc@vger.kernel.org, Steven Rostedt , "Liam R. Howlett" Subject: [PATCH v8 26/31] dyndbg: treat comma as a token separator Date: Tue, 13 Jan 2026 18:57:42 -0700 Message-ID: <20260114015815.1565725-27-jim.cromie@gmail.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260114015815.1565725-1-jim.cromie@gmail.com> References: <20260114015815.1565725-1-jim.cromie@gmail.com> 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 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 or as a boot arg: drm.dyndbg=3Dclass,DRM_UT_CORE,+p # todo: support multi-query here Given the many ways a boot-line +args can be assembled and then passed in/down/around shell based tools, this may allow side-stepping all sorts of quoting hassles thru those layers. existing query format: modprobe test_dynamic_debug dyndbg=3D"class D2_CORE +p" new format: modprobe test_dynamic_debug dyndbg=3Dclass,D2_CORE,+p ALSO selftests-dyndbg: add comma_terminator_tests New fn validates parsing and effect of queries using combinations of commas and spaces to delimit the tokens. It manipulates pr-debugs in builtin module/params, so might have deps I havent foreseen on odd configurations. Co-developed-by: =C5=81ukasz Bartosik Signed-off-by: =C5=81ukasz Bartosik Signed-off-by: Jim Cromie --- .../admin-guide/dynamic-debug-howto.rst | 9 +++++--- lib/dynamic_debug.c | 17 +++++++++++---- .../dynamic_debug/dyndbg_selftest.sh | 21 ++++++++++++++++++- 3 files changed, 39 insertions(+), 8 deletions(-) diff --git a/Documentation/admin-guide/dynamic-debug-howto.rst b/Documentat= ion/admin-guide/dynamic-debug-howto.rst index e76ccd987704..350d93834e19 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``:: @@ -167,9 +168,11 @@ module The given string is compared against the module name of each callsite. The module name is the string as seen in ``lsmod``, i.e. without the directory or the ``.ko`` - suffix and with ``-`` changed to ``_``. Examples:: + suffix and with ``-`` changed to ``_``. =20 - module sunrpc + Examples:: + + module,sunrpc # with ',' as token separator module nfsd module drm* # both drm, drm_kms_helper =20 diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c index 1da2de7b1769..5ac7248d51bb 100644 --- a/lib/dynamic_debug.c +++ b/lib/dynamic_debug.c @@ -320,6 +320,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, @@ -333,8 +341,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 '#') @@ -350,7 +358,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, @@ -622,7 +630,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 465fad3f392c..c7bf521f36ee 100755 --- a/tools/testing/selftests/dynamic_debug/dyndbg_selftest.sh +++ b/tools/testing/selftests/dynamic_debug/dyndbg_selftest.sh @@ -216,7 +216,7 @@ function check_err_msg() { function basic_tests { echo -e "${GREEN}# BASIC_TESTS ${NC}" if [ $LACK_DD_BUILTIN -eq 1 ]; then - echo "SKIP" + echo "SKIP - test requires params, which is a builtin module" return fi ddcmd =3D_ # zero everything @@ -238,8 +238,27 @@ EOF ddcmd =3D_ } =20 +function comma_terminator_tests { + echo -e "${GREEN}# COMMA_TERMINATOR_TESTS ${NC}" + if [ $LACK_DD_BUILTIN -eq 1 ]; then + echo "SKIP - test requires params, which is a builtin module" + return + fi + # try combos of spaces & commas + check_match_ct '\[params\]' 4 -r + ddcmd module,params,=3D_ # commas as spaces + ddcmd module,params,+mpf # turn on module's pr-debugs + check_match_ct =3Dpmf 4 + ddcmd ,module ,, , params, -p + check_match_ct =3Dmf 4 + ddcmd " , module ,,, , params, -m" # + check_match_ct =3Df 4 + ddcmd =3D_ +} + tests_list=3D( basic_tests + comma_terminator_tests ) =20 # Run tests --=20 2.52.0 From nobody Sun Feb 8 07:58:43 2026 Received: from mail-oo1-f44.google.com (mail-oo1-f44.google.com [209.85.161.44]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 07AB830EF6F for ; Wed, 14 Jan 2026 02:00:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.161.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768356034; cv=none; b=dE6UtUdycN/SRt4oijOJtqWgEHBGBdtVSIRQ+xD8TrSGuw10+b25igi1g2MJmxvJU1Oy1Li7QJTHD1N6pa/v6aJnsTV1gobC0uZas/Is19L04XAOGlc4Gj6BoPywwguRADopTYT+vvWxEKg+K0+WnZwVCMzZYXZQgOfqkIrkpWI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768356034; c=relaxed/simple; bh=NiDfgm9IIZPO7vTOaAaoNFPcWN2xiAR0IE0jA7B36/8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=bvXUYiOOWa6WUKPQHdEjpK5ZmWeLi4boMuo1TkOy7ReuQbSo7tw3NlQ4/JfuVSLele8OP5qbSx7QePQ9B5CI3Zx7PSNdL94pdAKYnm32frQIN4fOrAAenUli+y3qjVIJ2IYElS+DFLHEmIpQbiNPneqapUI0Hi2I5aQuAPiZu9k= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=KD9aZrc6; arc=none smtp.client-ip=209.85.161.44 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="KD9aZrc6" Received: by mail-oo1-f44.google.com with SMTP id 006d021491bc7-657044fea68so235162eaf.0 for ; Tue, 13 Jan 2026 18:00:32 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1768356032; x=1768960832; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=Ii1VafhOMs6l+h1e+D2giL8132vNQ2TDoma8/MEoG3Y=; b=KD9aZrc6LziXFGGc2giGdpGlzQJewqWKn9hpf61nKw0cM+byzX5OLnWsva/aCrVo0q ngk8gw6ppxE449l6SGQ9fSOXjw4IaUb2WMSB69RgO1mBL3k062kfY6U5yfhvNzBU4wK/ c+l4NkVk6XEsL7gXl16IWTegAxMKdPQD3PKekb+iNpnlk+bp6jKPNWgphDlz/tx5ve17 rLj8PYV1IvIgcdBv+iG9Hip9TYhAW72N2hIy/M+hU/6UaaLUgbdqN+maNGbEUbzq3FsB mjBvH4tHLCmNiwl38o70p5IcHWLIDfqtgTuBU/GlPoAiVUOTSvCTl97HSQ5rXvRoFX93 jY9Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768356032; x=1768960832; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=Ii1VafhOMs6l+h1e+D2giL8132vNQ2TDoma8/MEoG3Y=; b=nDF/KLDabRI4DSOvXzWQ7MQ7KuWZpVtN9vUrPEad+4rKa4/URh8nGBYz+aN9tCE9Zo 18+6aP9rL6wTr855gc4tVH8k1oT2azcc+a1QlNzymoRrml3gTqhktJJwjvKa+39otac8 wOf3hSnwxPN0DkmSRgSTtDpf4t/WBtNHEDQP0m94mf3gITkyM6RlTnfM8nbEBxnYW/Rq nyfFQy2hGe43qq05QytuyYVP8y4w1okJcBwpzKpDf8FZEIPoRx3tpxDS7INfy7mepJeU 1tGuMJivhb9UApdwbS06y1jONfO8fAq1NplKjPpWQCfgiX9L/+9HNaSf3IxRQrG+Mw4O bUhw== X-Forwarded-Encrypted: i=1; AJvYcCVL3NTY/tfJM6yFs0VgaTXIx9Wgk3IfGYti8D/rDoJNmNq7E6ajq9V54gHR7guIHz2QMfVprlhy3Hy5V7Y=@vger.kernel.org X-Gm-Message-State: AOJu0YymE+YlpR58QlUvOD+7aXPToNTntATCZeNerbNGoG5Ao4vybzc3 FyWgABzplm05AZJk4PQx7O8D+WBdN+jReqi1wqulDxmtIbKLH4wz5hbadqrBNGhLEIg= X-Gm-Gg: AY/fxX4mLhKUl22T/etWhVDpNEavd7LbFaexfghGRQ8Jr7NRVbPWOM1Us6FZaTqvM92 n0G1IkBZ8P+YJ4ofh7zIjzjOhKUBnKr5+KmmPMALbZFMkqgqdgsWAhM4ROvcY8G2ID9FViSwKDg IzF07VuTf8FWDl8Cp+hv+nZkPAoAdSuSwaCkv0ef8zK6mTx9fMg8NLsPDlq7SMni5fM0Hs0N2Ro M9qefxcRLGaI1P14buP/D0Fkg17vFiHPNda4WxqbcaaeuDG1CLhi8Teq3CikrTzq4dumI97KybX T+bTh4hkRfEiFH+zgTvHDjJv/i4WpT8eByYfL3cbugPVhOL2IbxqE8CFXoaz2vqxA8vXPIshreH l3jSeX4D/lC1IdgpKA+IxSLBf3Sv9Cxf6YrRnUFwT2G2eeyahcGkou9Xd0/U673Ne+E1W7nLtiv 33GO69ic9eH9zKc+H6yZF2xdxPTBO6jCAL0uTp X-Received: by 2002:a05:6820:c00e:b0:661:45:9b7f with SMTP id 006d021491bc7-661010be2a1mr505522eaf.39.1768356031942; Tue, 13 Jan 2026 18:00:31 -0800 (PST) Received: from frodo (c-98-38-17-99.hsd1.co.comcast.net. [98.38.17.99]) by smtp.googlemail.com with ESMTPSA id 006d021491bc7-65f48cb03d4sm9629865eaf.12.2026.01.13.18.00.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 13 Jan 2026 18:00:31 -0800 (PST) From: Jim Cromie To: gregkh@linuxfoundation.org, linux-kernel@vger.kernel.org Cc: Jim Cromie , Jason Baron , =?UTF-8?q?=C5=81ukasz=20Bartosik?= , Louis Chauvet , Bagas Sanjaya , Dave Airlie , Daniel Vetter , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , dri-devel@lists.freedesktop.org, Petr Mladek , Shuah Khan , linux-doc@vger.kernel.org, Steven Rostedt , "Liam R. Howlett" Subject: [PATCH v8 27/31] dyndbg: split multi-query strings with % Date: Tue, 13 Jan 2026 18:57:43 -0700 Message-ID: <20260114015815.1565725-28-jim.cromie@gmail.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260114015815.1565725-1-jim.cromie@gmail.com> References: <20260114015815.1565725-1-jim.cromie@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Since commit 85f7f6c0edb8 ("dynamic_debug: process multiple debug-queries on a line") Multi-query commands have been allowed: modprobe drm dyndbg=3D"class DRM_UT_CORE +p; class DRM_UT_KMS +p" modprobe drm dyndbg=3D< [ 203.902703] dyndbg: query parse failed [ 203.902871] dyndbg: processed 2 queries, with 0 matches, 2 errs bash: echo: write error: Invalid argument The '%' splits the input into 2 queries, and both fail. Given the limited utility of matching against the working parts of a format string "foo: %d bar %s", nothing is actually lost here. selftests-dyndbg: test_percent_splitting This does basic testing of classmaps using '%' separated multi-queries. It modprobes test_dynamic_debug with several classes enabled, and counts to verify that the expected sites show the enablement in the control file. Reviewed-by: Louis Chauvet Signed-off-by: Jim Cromie --- .../admin-guide/dynamic-debug-howto.rst | 8 ++++--- lib/dynamic_debug.c | 2 +- .../dynamic_debug/dyndbg_selftest.sh | 24 +++++++++++++++++++ 3 files changed, 30 insertions(+), 4 deletions(-) diff --git a/Documentation/admin-guide/dynamic-debug-howto.rst b/Documentat= ion/admin-guide/dynamic-debug-howto.rst index 350d93834e19..89ee15d7ae58 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 5ac7248d51bb..c50836c262b4 100644 --- a/lib/dynamic_debug.c +++ b/lib/dynamic_debug.c @@ -626,7 +626,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 strpbrk(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 c7bf521f36ee..513f6cb1db1d 100755 --- a/tools/testing/selftests/dynamic_debug/dyndbg_selftest.sh +++ b/tools/testing/selftests/dynamic_debug/dyndbg_selftest.sh @@ -256,9 +256,33 @@ function comma_terminator_tests { ddcmd =3D_ } =20 +function test_percent_splitting { + echo -e "${GREEN}# TEST_PERCENT_SPLITTING - multi-command splitting on= % ${NC}" + if [ $LACK_TMOD -eq 1 ]; then + echo "SKIP - test requires test-dynamic-debug.ko" + return + fi + ifrmmod test_dynamic_debug_submod + ifrmmod test_dynamic_debug + ddcmd =3D_ + modprobe test_dynamic_debug dyndbg=3Dclass,D2_CORE,+pf%class,D2_KMS,+p= t%class,D2_ATOMIC,+pm + check_match_ct =3Dpf 1 + check_match_ct =3Dpt 1 + check_match_ct =3Dpm 1 + check_match_ct test_dynamic_debug 23 -r + # add flags to those callsites + ddcmd class,D2_CORE,+mf%class,D2_KMS,+lt%class,D2_ATOMIC,+ml + check_match_ct =3Dpmf 1 + check_match_ct =3Dplt 1 + check_match_ct =3Dpml 1 + check_match_ct test_dynamic_debug 23 -r + ifrmmod test_dynamic_debug +} + tests_list=3D( basic_tests comma_terminator_tests + test_percent_splitting ) =20 # Run tests --=20 2.52.0 From nobody Sun Feb 8 07:58:43 2026 Received: from mail-oi1-f182.google.com (mail-oi1-f182.google.com [209.85.167.182]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1496E30FC13 for ; Wed, 14 Jan 2026 02:00:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.182 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768356039; cv=none; b=EnLKzJcYrGNBCz3KY0M7s+kkWF50xOmqM5FJHWe6x2YaWqEJXpOYk2OzjXlf//v0TopVj2oVH5Z20pzUO7VbUf5tka5yHl2Qe3kck4EFBi2F/XNKqSmadLZDFbxSv/8wrYW6GkqlapF95QKtN4QrT/7XlncGzWtqNA+cZWf8dcU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768356039; c=relaxed/simple; bh=Y6op64SH3HVRwLLGtoxME3mldm3/W0c1FqQmgPaP16k=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=hlW7K+xghsE1rnh0xxsCPyA5TG7av0f4UR0rmvMditt/BZ2h2vvp18EeoJlvuyXTAnBjrFL8n2FD1fCbag2BnMlo9gXd8KDdal8WNPA02yGw8uwX9sxxuzCQD4cBPqEs2fBjUvSM5C294o3ERqEMBSXSQzlsgt7NckS3Q76Fu5I= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=nYXGM8RH; arc=none smtp.client-ip=209.85.167.182 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="nYXGM8RH" Received: by mail-oi1-f182.google.com with SMTP id 5614622812f47-45a7db48c57so3378860b6e.2 for ; Tue, 13 Jan 2026 18:00:37 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1768356037; x=1768960837; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=M3hNaVpAB+vi7bZ5p4r2BEr0xFTlYHYJVlfyEjZdNd0=; b=nYXGM8RHTeOBYjUFRG1DXn/1gdgzU6y1E1aRq8u4ksASTpidCfCqG7rtCpKepO7iDu Ch4uiXWXg3zT61tK71VTY/uFpjtspAn1XUTFHKA8QRgJvcpiNn8kPd1lrK9D5weqHJti /ua2yO7M52QFR63ompFgfiUhHfSiXkHWKWFgs/pZ04wcvdk+gAg3z4rQQOQT25SvaPNF fBksaQLVd6MjzlilWdQYHAtYHEF3hsL7rBlI8R2MzNXV9udYUOwKPDa2S5AMoiOxBpBZ RYXpIUuSqmW3xv2L+crf2eWlxrMJ0LhmsAtV+Cd6GVX0VJt/4mC8rAN/xIxXos+QSNi6 dCzQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768356037; x=1768960837; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=M3hNaVpAB+vi7bZ5p4r2BEr0xFTlYHYJVlfyEjZdNd0=; b=D0nc+H0vnfV62z0lbJ3RJQsscfMnXlkiELB+1k4TwLQttKiWlZnGYAhIbBE2RFOqjH mqrjwOASufQrqd0st4yTlhHCjNpRdhHTMPMzivDgZ0JD3rpDJxGM/R140p3y4Dl/ome4 Ie4DdQnzJY5Q+mZxX6Nlz2/HTkKqzg/6q/SReuam8NcOCuvOb7PyhLctJ30CiC+8gZn0 n7M3GHG7jMlilWUjHzmCcW3fAH11Rvkv8FJBMsV2u+XEagEDvkLBeKV5jkCS/6SVk0/1 hWNeQ928gkcjOSlAwemkcIQTZMDF2VgVQY+Xxn4zv8x9MNzfseEgm+VsgXAQ19nM4PPN TLOA== X-Forwarded-Encrypted: i=1; AJvYcCVFbpxQkxwqp7IrmirbyVHplfiJmurUh328mZ+YTkuihuAbqZyX/PuWz/VAWacotwBpYfu9o3XDVlr7Gw8=@vger.kernel.org X-Gm-Message-State: AOJu0YwcAQuT/n7iWRpovOdELiAw8FadERnL6ly/rtf6uFqUltvbgTyw 6pi2PIJcBcHzfzOlXiKnIeXEL2+Jb229Jh7dyR45H/6frgp+CiE9+YRY X-Gm-Gg: AY/fxX5HhBN4jOsmmXeL0G/9pPXa7qLGkKiu3/cMsG4nSIvWXH4RONL1b67eBWJglvM MnuH34Xn4DA3X7FMkaGYyY4uVSyM+lO2MGR5ECHQxdxUB9zrdAzAiayb+dQUxS1JCHwkaHuXcpG mxpBQajIzCpP0kbCiewrCLsNvPN61NOIG+hi7lD5aecXCXvwi7ovGicmlMR4obIz47vp2fXEwGk kjzIjhH0tjBWCw8QRvF6Z1di6CmJ16ThJMDKXaJ0OziAWDIoyFP1rj+I9H8hnpeGEgBz6wIi30u GVCIapYaFgBVvkDWxTxvjyGRTWzx//QLEY9SgxqdiCTVRb+YNgh4R2/yx13Y+wwAyIxUdTA2DxU p0N/VfrWITkSEXD/K0gN9f6sl5HgG4dJhYIAlqW7zWmghG/y+cpiXu25fMpEjvULYHgWhidAxUX VPsrg85IKpU9jDsUY4r5yr6nsXPK3RoKonNpa9hoy80DIWHYs= X-Received: by 2002:a05:6808:178c:b0:45a:55e6:12aa with SMTP id 5614622812f47-45c7157ac7emr579179b6e.53.1768356036240; Tue, 13 Jan 2026 18:00:36 -0800 (PST) Received: from frodo (c-98-38-17-99.hsd1.co.comcast.net. [98.38.17.99]) by smtp.googlemail.com with ESMTPSA id 5614622812f47-45a5e2894e0sm10347195b6e.13.2026.01.13.18.00.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 13 Jan 2026 18:00:35 -0800 (PST) From: Jim Cromie To: gregkh@linuxfoundation.org, linux-kernel@vger.kernel.org Cc: Jim Cromie , Jason Baron , =?UTF-8?q?=C5=81ukasz=20Bartosik?= , Louis Chauvet , Bagas Sanjaya , Dave Airlie , Daniel Vetter , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , dri-devel@lists.freedesktop.org, Petr Mladek , Shuah Khan , linux-doc@vger.kernel.org, Steven Rostedt , "Liam R. Howlett" Subject: [PATCH v8 28/31] selftests-dyndbg: add test_mod_submod Date: Tue, 13 Jan 2026 18:57:44 -0700 Message-ID: <20260114015815.1565725-29-jim.cromie@gmail.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260114015815.1565725-1-jim.cromie@gmail.com> References: <20260114015815.1565725-1-jim.cromie@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This new test-fn runs 3 module/submodule modprobe scenarios, variously using both the generic dyndbg=3D modprobe arg, and the test-module's classmap-params to manipulate the test-mod*'s pr_debugs. In all cases, the current flag-settings are counted and tested vs expectations. The 3rd scenario recapitulates the DRM_USE_DYNAMIC_DEBUG=3Dy failure. 1. 2 modprobes (super then sub), with separate dyndbg=3Dclass-settings check module specific flag settings 2. modprobe submod, supermod is auto-loaded set supermod class-params check expected enablements in super & submod 3. modprobe super, with param=3Dsetting (like drm.debug=3D0x1ef) modprobe submod validate submod's class'd pr_debugs get properly enabled The test uses multi-queries, with both commas and percents (to avoid spaces and quoting). This is the main reason the test wasn't earlier in the patchset, closer to the classmap patches its validating. With some tedium, the tests could be refactored to split out early tests which avoid multi-cmds, and test only the class-params. Reviewed-by: Louis Chauvet Signed-off-by: Jim Cromie --- .../dynamic_debug/dyndbg_selftest.sh | 73 +++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/tools/testing/selftests/dynamic_debug/dyndbg_selftest.sh b/too= ls/testing/selftests/dynamic_debug/dyndbg_selftest.sh index 513f6cb1db1d..09937dca3056 100755 --- a/tools/testing/selftests/dynamic_debug/dyndbg_selftest.sh +++ b/tools/testing/selftests/dynamic_debug/dyndbg_selftest.sh @@ -279,10 +279,83 @@ function test_percent_splitting { ifrmmod test_dynamic_debug } =20 +function test_mod_submod { + echo -e "${GREEN}# TEST_MOD_SUBMOD ${NC}" + if [ $LACK_TMOD -eq 1 ]; then + echo "SKIP - test requires test-dynamic-debug.ko" + return + fi + ifrmmod test_dynamic_debug_submod + ifrmmod test_dynamic_debug + ddcmd =3D_ + + # modprobe with class enablements + modprobe test_dynamic_debug \ + dyndbg=3Dclass,D2_CORE,+pf%class,D2_KMS,+pt%class,D2_ATOMIC,+pm + + check_match_ct '\[test_dynamic_debug\]' 23 -r + check_match_ct =3Dpf 1 + check_match_ct =3Dpt 1 + check_match_ct =3Dpm 1 + + modprobe test_dynamic_debug_submod + check_match_ct test_dynamic_debug_submod 23 -r + check_match_ct '\[test_dynamic_debug\]' 23 -r + check_match_ct test_dynamic_debug 46 -r + + # no enablements propagate here + check_match_ct =3Dpf 1 + check_match_ct =3Dpt 1 + check_match_ct =3Dpm 1 + + # change classes again, this time submod too + ddcmd class,D2_CORE,+mf%class,D2_KMS,+lt%class,D2_ATOMIC,+ml "# add so= me prefixes" + check_match_ct =3Dpmf 1 + check_match_ct =3Dplt 1 + check_match_ct =3Dpml 1 + # submod changed too + check_match_ct =3Dmf 1 + check_match_ct =3Dlt 1 + check_match_ct =3Dml 1 + + # now work the classmap-params + # fresh start, to clear all above flags (test-fn limits) + ifrmmod test_dynamic_debug_submod + ifrmmod test_dynamic_debug + modprobe test_dynamic_debug_submod # get supermod too + + echo 1 > /sys/module/test_dynamic_debug/parameters/p_disjoint_bits + echo 4 > /sys/module/test_dynamic_debug/parameters/p_level_num + # 2 mods * ( V1-3 + D2_CORE ) + check_match_ct =3Dp 8 + echo 3 > /sys/module/test_dynamic_debug/parameters/p_disjoint_bits + echo 0 > /sys/module/test_dynamic_debug/parameters/p_level_num + # 2 mods * ( D2_CORE, D2_DRIVER ) + check_match_ct =3Dp 4 + echo 0x16 > /sys/module/test_dynamic_debug/parameters/p_disjoint_bits + echo 0 > /sys/module/test_dynamic_debug/parameters/p_level_num + # 2 mods * ( D2_DRIVER, D2_KMS, D2_ATOMIC ) + check_match_ct =3Dp 6 + + # recap DRM_USE_DYNAMIC_DEBUG regression + ifrmmod test_dynamic_debug_submod + ifrmmod test_dynamic_debug + # set super-mod params + modprobe test_dynamic_debug p_disjoint_bits=3D0x16 p_level_num=3D5 + check_match_ct =3Dp 7 + modprobe test_dynamic_debug_submod + # see them picked up by submod + check_match_ct =3Dp 14 + ifrmmod test_dynamic_debug_submod + ifrmmod test_dynamic_debug +} + tests_list=3D( basic_tests + # these require test_dynamic_debug*.ko comma_terminator_tests test_percent_splitting + test_mod_submod ) =20 # Run tests --=20 2.52.0 From nobody Sun Feb 8 07:58:43 2026 Received: from mail-oo1-f66.google.com (mail-oo1-f66.google.com [209.85.161.66]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BE14A3090DC for ; Wed, 14 Jan 2026 02:00:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.161.66 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768356044; cv=none; b=lzXKtOjQqTwJzXrmcbGRGkdXtkGQ7wrg7FWTDNj072btMBF8hYu2YQ5oVdbTTYk7Q9CaM3kjuS/xqIA0tU+0GmioLbmbze8MhfVz8ktkhh1iyoRD6fjdKYY2/g4rKm+97XCFrrAv9TBnAme2v/+knr7YJ/ySU7GZrQDpyoxCTB8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768356044; c=relaxed/simple; bh=yLv8iMrgi6e1dIL1tLXcjw+3zALNwBwVpk9zbywxACA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=tZEBbfQpLFiGtiZXRCzesPihdY7hb/1hW/j4E6KJa8YbeQkwbqkVlNZtysEt5PDuReo2qAgIdyj0Bo5Z8RZEYxLIJA5ZIGwBcd1nHr3XrMaW6f3V0G1am4jHkin6gqqJ1YYfmzEzaci78ZY3r7PGPzA7cQQkRsO5XiB+J3BJZCE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=nj5sLzOI; arc=none smtp.client-ip=209.85.161.66 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="nj5sLzOI" Received: by mail-oo1-f66.google.com with SMTP id 006d021491bc7-65e9430489eso2921514eaf.0 for ; Tue, 13 Jan 2026 18:00:42 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1768356042; x=1768960842; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=SBjZDftQ7sMS8thzii/h/UVYeVfLOMgNx3ViKoOFlAc=; b=nj5sLzOIAfIrXHBjk/n6kz1i/SVHkMmDfvsuKRnFygAV0DmztKcGtg9g1KbGblj9fH c5IqLvoLq9h3aNN3Qd5cZ3Ht50VyWvKe0hRBEjnMkDxj+XRAs4rcpHW+HEMHsgHcgcPP nHRVBqyvdyzi6RekjzWrRbIXaixgXlsmlTFB8d0Bw4aT5AlV5WzPPDyVUpxc0+OsaJXc jYe5vmOE8XBVx9EOOtfOmB8lflLJAA6R4ZtD6wa3MvBPyfT5GsgWIPildqTmWwo27JCb xQBkOcG1SVqMFWQ57xuqsFgJyh+Z1eJ1O2dhLwkTEv92wxz29jH4i+ExYqJt3CTyR1v/ uqGw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768356042; x=1768960842; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=SBjZDftQ7sMS8thzii/h/UVYeVfLOMgNx3ViKoOFlAc=; b=SsmgN5znDvxMzStTJIUEx1aeqW3rUQqI6ADwIju27UHhpLT10z0+9FRDBOCVBoedva sXJiF/klSYYRDNv3t1m5jcBjMNogHWoyJ/CL7gqP+VjiaAfNJ0JCobhy40zShS8B0ERN De6uBINgU2xW3kVp7k6lNuMBdQfuty1tPPsy41sca/KQKFq8HUzEGJbqaZd0xiEyVFSX 8DcUQzDEXc2Sv39GraFi/GzCiR5I1kT+QsvMMGA3d8meiAaCI3jTWMsNctZdCaIwO8ud 3Up+5hKdMbvYP2wo16ktiKxzEIxUFYeDYLGchSS/rtu8snat5FmW20pLalUTWzgI0R2n NCQQ== X-Forwarded-Encrypted: i=1; AJvYcCVx0Xwb6lEk+q+zAz7G6UOGZJeNdsj0uBV6rAa30JGScQX7eFrwL7bY+ppnNx7eHc7IxcsnWgUQsyseb4s=@vger.kernel.org X-Gm-Message-State: AOJu0Yypr3SCXIv5ijfrs/3acg5k5lm2GbFnJ/cTolGzWXZuNmyJInY5 2CbO+ft9jiFIkuZs/kYW/sbf63xmzMNgycQ9ChP6hZ2XPNoP9TqxVUf9 X-Gm-Gg: AY/fxX70TQ8f/y9iEhGWMmppEPnzavSjZSmmMKmFFXaOufw0tCjoVOgcsXTumREA/5J JT/W3Fav9OcHximnyRRcM75qlNw9YeErd+a29wSmFnJ/7kwqrDJgV/4Xv9gLq1gg7u6tca1g9IE dWR6R8dfjx34AXv7jXzR//Mei9AQRJza2a7Yjhy5WkXjBrgs2pxzBSEDCvU2rUefdHJMzei6Kip V+ADLg+pPz4wE3oGiop6oJbuixmdp620Rn+2UCzV/3VxvQVJz8kxJ8L57mBGzKLJviOZ6YbXif1 1Y/h9vIshi2QeE+09xxlviNKLqVCkKp+6K2v6tduib5xxTbV09D7y9qGmiAAMkLLgHawiIUCmyO z7XPaYNdKa8+Zub9qCRgV333Ht6n5Qj6Ii6CDEKBYb+l0azIh39hurCvo3YnuiynesVrgNPjgUG 5GirQbpaczkqAHHh0+b6b7gCLt4vYYj6+lrdZd X-Received: by 2002:a05:6820:611:b0:65b:8574:2e86 with SMTP id 006d021491bc7-66102c54d9emr441376eaf.31.1768356041431; Tue, 13 Jan 2026 18:00:41 -0800 (PST) Received: from frodo (c-98-38-17-99.hsd1.co.comcast.net. [98.38.17.99]) by smtp.googlemail.com with ESMTPSA id 006d021491bc7-65f48ccff66sm9190758eaf.16.2026.01.13.18.00.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 13 Jan 2026 18:00:40 -0800 (PST) From: Jim Cromie To: gregkh@linuxfoundation.org, linux-kernel@vger.kernel.org Cc: Jim Cromie , Jason Baron , =?UTF-8?q?=C5=81ukasz=20Bartosik?= , Louis Chauvet , Bagas Sanjaya , Dave Airlie , Daniel Vetter , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , dri-devel@lists.freedesktop.org, Petr Mladek , Shuah Khan , linux-doc@vger.kernel.org, Steven Rostedt , "Liam R. Howlett" Subject: [PATCH v8 29/31] dyndbg: resolve "protection" of class'd pr_debug Date: Tue, 13 Jan 2026 18:57:45 -0700 Message-ID: <20260114015815.1565725-30-jim.cromie@gmail.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260114015815.1565725-1-jim.cromie@gmail.com> References: <20260114015815.1565725-1-jim.cromie@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" 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 --- include/linux/dynamic_debug.h | 14 ++-- lib/dynamic_debug.c | 127 +++++++++++++++++++++++++++------- 2 files changed, 110 insertions(+), 31 deletions(-) diff --git a/include/linux/dynamic_debug.h b/include/linux/dynamic_debug.h index d9d906fd6343..315050507fd3 100644 --- a/include/linux/dynamic_debug.h +++ b/include/linux/dynamic_debug.h @@ -75,6 +75,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; const char **class_names; @@ -258,7 +259,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 unsigned long _name##_bvec; \ @@ -271,10 +277,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 c50836c262b4..f60a723a441b 100644 --- a/lib/dynamic_debug.c +++ b/lib/dynamic_debug.c @@ -206,6 +206,50 @@ ddebug_find_valid_class(struct _ddebug_info const *di,= const char *query_class, return NULL; } =20 +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); +} + +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_in_range(class_id, map)) + return map; + + for_subvec(i, cli, di, users) + if (ddebug_class_in_range(class_id, cli->map)) + 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 *= map) +{ + 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 @@ -214,11 +258,10 @@ ddebug_find_valid_class(struct _ddebug_info const *di= , const char *query_class, */ 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 /* match against the source filename */ if (query->filename && @@ -255,7 +298,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) @@ -265,33 +329,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++; @@ -656,6 +718,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, @@ -1107,12 +1170,6 @@ static void *ddebug_proc_next(struct seq_file *m, vo= id *p, loff_t *pos) return dp; } =20 -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); -} - static const char *ddebug_class_name(struct _ddebug_info *di, struct _ddeb= ug *dp) { struct _ddebug_class_map *map; @@ -1237,25 +1294,36 @@ 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 false; =20 dcp =3D (struct _ddebug_class_param *)kp->arg; =20 - if (map =3D=3D dcp->map) { + 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); + + if (dcp) { + map->controlling_param =3D dcp; v2pr_info(" kp:%s.%s =3D0x%lx", 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 = char *mod_name) +static void ddebug_apply_params(struct _ddebug_class_map *cm, const char *= mod_name) { const struct kernel_param *kp; #if IS_ENABLED(CONFIG_MODULES) @@ -1275,6 +1343,13 @@ static void ddebug_apply_params(const struct _ddebug= _class_map *cm, const char * } } =20 +/* + * called from add_module, ie early. it can find controlling kparams, + * which can/does? enable protection of this classmap from class-less + * queries, on the grounds that the user created the kparam, means to + * use it, and expects it to reflect reality. We should oblige him, + * and protect those classmaps from classless "-p" changes. + */ static void ddebug_apply_class_maps(const struct _ddebug_info *di) { struct _ddebug_class_map *cm; --=20 2.52.0 From nobody Sun Feb 8 07:58:43 2026 Received: from mail-ot1-f66.google.com (mail-ot1-f66.google.com [209.85.210.66]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id EBAC82FE59A for ; Wed, 14 Jan 2026 02:00:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.66 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768356049; cv=none; b=nQTOGYIYm1tzD1fH7DX3PgT12PIKGTHrsSNg0L4cEDmrdXbLLyaf1/vuYeRiSx8aw1WV844VAON0taSftkIr5cpDV8nRdirega+QHSUQSRmPYbmebcXGob8NV75wmDg8St9CQi65VPcfg2xChP6+MCtE4z/k2+vcMsK5NVmgnJs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768356049; c=relaxed/simple; bh=nceTOBGC2okYO9sP3q2miltoB/YTSAMOyq1icNZq98U=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=LeK19M92r5QCEYZsMEYxHKZpyrjLH0wzOcmwER6/L7tNKsfqMv5WUUULlNuHP8gLeMfil770I+Yd3SHVHlEjugW5YWqOZxzaEnmke2UHyIipLeu134QNrJJlvznOtONu5IG+tKOauqsZOOVlX+aYvYpRMci9/ILwBUHz69/jTtM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=V9bd4w7H; arc=none smtp.client-ip=209.85.210.66 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="V9bd4w7H" Received: by mail-ot1-f66.google.com with SMTP id 46e09a7af769-7c75fc222c3so4277597a34.0 for ; Tue, 13 Jan 2026 18:00:47 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1768356046; x=1768960846; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=EtGFYvkXzuLDBdoPBBG7Nml2rAKHXpifaucUiL+T8bk=; b=V9bd4w7H5CbuZpzq9oiJVB4G7IUQfpB4d3ZaBrO1YjPO8JT5xOuqDXC7F6RtGp8/ld XO1ErYypQn2IIJkrpHJtiaBRHlBfC9LaUrPNVfVg/lS9Y2s4jpL8rYpIbNi+Hs8vFKBy aC7RKvh8hMgeNObFz+s6fylBi6ZHxyWAcDDrr+OQ+2jXCv9/hUkdfaUZe1xDsvckZxqW 2R8Ix8qMwNcszF+n/1jC3jkF54H2WfTe7xA7QIIzBqQ9mZeIZCPsjqkP1yMF3ByEBLx4 Ms+0M1FU9Ww3S/n1mOLT13X/BNU7lZdw9MBf97IfvkyBbMvElEmeuFePlB2cIvk7IVQO ZS4Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768356046; x=1768960846; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=EtGFYvkXzuLDBdoPBBG7Nml2rAKHXpifaucUiL+T8bk=; b=nitnjjAeTsjDtx+FGgSkDEGzX0FKGVxKrIkouR9OQ/Y5K3Umy9EFTdHMpgxh6XMCqf g/DeTRjYxsYS6X38TnWUWSRCe0Ylf6alsp77VHkdiHlFNbeJdIR9gkumNdnYAJu7mChI fAY6xq1ORAxAj8Z6Kr9UZZFI1+6y5WBWE9O4TmIB1iXjPDOV6+XCb4YkQSMP5xsgbxhS Bp7hBYgMMvUdeRTJ6FpkGlaNZeCMCHVmjPkuYnuy6+nkDS29ZFlGPsefGArIa5t5i/We p5FZdfaAjXzt5tg11Ea4vDXSxCUWhMIuhT4GZiHpKXi4Vwk6ybHaoEgkrSBDSW1ws7Qz qeqA== X-Forwarded-Encrypted: i=1; AJvYcCWc7k8NiOrRe1ouS8OS7z9Mvz7oPBde16G8D0eLxBNo0mpGhDhr0/fQEXGrbU8TaTHcc7fWixiJCXHJ4/U=@vger.kernel.org X-Gm-Message-State: AOJu0YziLUAPigBRQFvqYEO2MxWgtu9p4ByAx5pDwxPEKCuDA44ZMq0B 1JwJS96a138kLUvEtbjbHNcDpDf1fw0gVjVUHIzGpAWzBNfF8yP5QC6v X-Gm-Gg: AY/fxX71w7wg1iA7REufFgrG7fEpxrSwkypr6J+7+NSW2sdAspOd/7tWhiSIdYrccQf 7Es7wYdbhBxjSPDZJAdZaRZcel6GcJLj6jrSPmyXa/dIAwFs0D3osp1JmCHzNJdNu2UdHbSK7lx ZG7dS1GrqCxeJqbwVoQKM+lvADrCZurcjoD2b48LAUiS9sBdU9rDfpwwobN5ldgLc7chkBrkOth HZimVs5WH2UxqK0nA1IGksSulDbmRpUpmFxNleU5xVwmxD10LCVG/t/V/nxvyMZ1A9j3kJKrukN M1v7uez+0Jni8GOi8KmkhBaNsX3rp2c0NCpqmkZRG+e9QvwFFVPSKG+CkvUY/wIUHeRRXhm9hAX Ny5n4X5n6FpzzCNH99lf9GBVdXf5JjPR4rYUindGpvU/HmeM/fI4nuT4NemS+a9nGhnTfFDHCs4 LmMaa8SouKSmz41KQkWIsGbdpquBDuSzhOmu+D X-Received: by 2002:a05:6820:229b:b0:65f:5c73:e350 with SMTP id 006d021491bc7-6610064699amr803336eaf.30.1768356046602; Tue, 13 Jan 2026 18:00:46 -0800 (PST) Received: from frodo (c-98-38-17-99.hsd1.co.comcast.net. [98.38.17.99]) by smtp.googlemail.com with ESMTPSA id 006d021491bc7-65f48ced969sm8999238eaf.17.2026.01.13.18.00.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 13 Jan 2026 18:00:46 -0800 (PST) From: Jim Cromie To: gregkh@linuxfoundation.org, linux-kernel@vger.kernel.org Cc: Jim Cromie , Jason Baron , =?UTF-8?q?=C5=81ukasz=20Bartosik?= , Louis Chauvet , Bagas Sanjaya , Dave Airlie , Daniel Vetter , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , dri-devel@lists.freedesktop.org, Petr Mladek , Shuah Khan , linux-doc@vger.kernel.org, Steven Rostedt , "Liam R. Howlett" Subject: [PATCH v8 30/31] dyndbg: add DYNAMIC_DEBUG_CLASSMAP_USE_(dd_class_name, offset) Date: Tue, 13 Jan 2026 18:57:46 -0700 Message-ID: <20260114015815.1565725-31-jim.cromie@gmail.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260114015815.1565725-1-jim.cromie@gmail.com> References: <20260114015815.1565725-1-jim.cromie@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Allow a module to use 2 classmaps together that would otherwise have a class_id range conflict. Suppose a drm-driver does: DYNAMIC_DEBUG_CLASSMAP_USE(drm_debug_classes); DYNAMIC_DEBUG_CLASSMAP_USE(drm_accel_xfer_debug); If (for some reason) drm-accel will not define their constants to avoid DRM's 0..10 reservations, we have a reserved-ids conflict. This seems unlikely. I don't think this potential conflict would become an issue until we have at least a 3-X-3 of classmap-defns X classmap-users. This is an untested interface extension, so drop this patch if it feels too speculative, knowing theres at least a notional solution should the situation arise. Signed-off-by: Jim Cromie --- include/linux/dynamic_debug.h | 27 ++++++++++++++++++++++----- lib/dynamic_debug.c | 19 ++++++++++++------- 2 files changed, 34 insertions(+), 12 deletions(-) diff --git a/include/linux/dynamic_debug.h b/include/linux/dynamic_debug.h index 315050507fd3..1ec5d8a44deb 100644 --- a/include/linux/dynamic_debug.h +++ b/include/linux/dynamic_debug.h @@ -87,7 +87,7 @@ struct _ddebug_class_map { struct _ddebug_class_user { char *mod_name; struct _ddebug_class_map *map; - const int offset; /* user offset to re-number the used map */ + const int offset; /* offset from map->base */ }; =20 /* @@ -238,11 +238,28 @@ struct _ddebug_class_param { * * 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. + * 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, __UNIQUE_ID(_ddebug_class_user)) -#define DYNAMIC_DEBUG_CLASSMAP_USE_(_var, _offset, _uname) \ +#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) \ + __DYNAMIC_DEBUG_CLASSMAP_USE(_var, _offset, __UNIQUE_ID(_ddebug_class_use= r)) + +#define __DYNAMIC_DEBUG_CLASSMAP_USE(_var, _offset, _uname) \ extern struct _ddebug_class_map _var; \ static struct _ddebug_class_user __aligned(8) __used \ __section("__dyndbg_class_users") _uname =3D { \ diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c index f60a723a441b..b0da3dd4ac44 100644 --- a/lib/dynamic_debug.c +++ b/lib/dynamic_debug.c @@ -198,7 +198,7 @@ ddebug_find_valid_class(struct _ddebug_info const *di, = const char *query_class, if (idx >=3D 0) { vpr_di_info(di, "class-ref: %s -> %s.%s ", cli->mod_name, cli->map->mod_name, query_class); - *class_id =3D idx + cli->map->base; + *class_id =3D idx + cli->map->base - cli->offset; return cli->map; } } @@ -206,12 +206,17 @@ ddebug_find_valid_class(struct _ddebug_info const *di= , const char *query_class, return NULL; } =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 _dd= ebug_class_map *map) { return (class_id >=3D map->base && class_id < map->base + map->length); } =20 +static bool ddebug_class_user_in_range(const int class_id, const struct _d= debug_class_user *user) +{ + return ddebug_class_map_in_range(class_id - user->offset, user->map); +} + static struct _ddebug_class_map * ddebug_find_map_by_class_id(struct _ddebug_info *di, int class_id) { @@ -220,11 +225,11 @@ ddebug_find_map_by_class_id(struct _ddebug_info *di, = int class_id) int i; =20 for_subvec(i, map, di, maps) - if (ddebug_class_in_range(class_id, map)) + if (ddebug_class_map_in_range(class_id, map)) return map; =20 for_subvec(i, cli, di, users) - if (ddebug_class_in_range(class_id, cli->map)) + if (ddebug_class_user_in_range(class_id, cli)) return cli->map; =20 return NULL; @@ -1177,12 +1182,12 @@ 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_class_in_range(dp->class_id, cli->map)) - return cli->map->class_names[dp->class_id - cli->map->base]; + 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; } --=20 2.52.0 From nobody Sun Feb 8 07:58:43 2026 Received: from mail-oi1-f193.google.com (mail-oi1-f193.google.com [209.85.167.193]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9E9A4310655 for ; Wed, 14 Jan 2026 02:00:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.193 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768356053; cv=none; b=rMJZA2oX0tTp9NE5QImuljcHUaWQmpwpyDYcP/pKDrA9wHjQWhSXegZeznH4J0sBc/IdoHUT0c97Ubb0bsLY6WKCAv2iWvLaCQtOrEedZ8dw9SkrH4bc99O0Q5mxt4dJoMFvvHsMe0H1uI8LGy6vPlsl9qfCRc7LuMf9lhcDnQM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768356053; c=relaxed/simple; bh=AK/bnfFexI75Q/0N26IRCouQSTxRNRsO2xPVvCV9E/E=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=iBB0RrjhKRuytKn2ykESqwA+1S96nCIB7HuRpcbVmWWYLEeDqD+8ZVYH4JZGsz7keXwsqjkEk/cxIOKmIM843DQCt1jGZ5OB+1Ibt9WcQ+9fEEMNgh0vRMc9ldGtyBYJkL3Ld3JWPDWS3CCS43ovum9R9Mm5fcfYrMcu2V9Yq4g= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=hldCFLT8; arc=none smtp.client-ip=209.85.167.193 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="hldCFLT8" Received: by mail-oi1-f193.google.com with SMTP id 5614622812f47-455a461ab6eso3314770b6e.2 for ; Tue, 13 Jan 2026 18:00:51 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1768356050; x=1768960850; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=/ABMBtHazCQPbXZPvqunvxRiAtO4J7KVdTol8wYfw0Q=; b=hldCFLT8KzxtynNWBK/wQ+/YnhPqHjO8UK/oC1gQT4Bsm3OOI2QSKiHP/SvMWreZAl lflyNM1yquI7Nznkv49GoXPfZzMFmelN+ei1dUqzam8Kl57yoJZH+x/MECbFBeAv7zwu 3mob23YaLWjHVIEBObe+dtuweg12d55OlRYUzPufbkTVN1c92TImyF1S+Eb9Mjnl2wQ4 izQP2ovGGrsKrws5w/GlqUf1a2ldJXpTc75l7yUGrhd08UTFI7mw7EY4h/7Aj0XG2EHk c6d7ZYcNfo6PtfQVZLrFzdc6v+i85w606EjZkffvTaToo+FSChd9Rnwr4KdeAzzCtfgt 4Ltg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768356050; x=1768960850; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=/ABMBtHazCQPbXZPvqunvxRiAtO4J7KVdTol8wYfw0Q=; b=ROjAx4unpEFqYD3GXHd/mIQXruyi2ooj5x8iyDeP+yh4xbhE+kTKNYeJnldFAmb9Kp LjBXFsbjlzVvb2IA9r2Kv6OPryQS61gfPIP5xxm5ytrfVzU3aAVR8zJpVsHmE1JDYIjI ndVtDnlYTDYvhqurf29evNGLz+SJBhn9YcrzDYEsYe0r1w2iZqnzdvbLComY3Hr3uDsI AuKKrMESjbrLcdkAtRe5cQ93XKaBO9dSkPjaciHUIvskf1YTCwlruXu8IM13cvyaZmbE D6zigDb0SRGzQZQiqujCVgvQ5RZe5AkPe1A5/JhCsVuOf8nY/fUzdSlUwOEHm+WoU1dI sIUw== X-Forwarded-Encrypted: i=1; AJvYcCU/lJGTvj0n20Ue9aPKFYBlMEwsAjAjh11CHYNW3zx+PdSGGz5Of3fVekl+V9+XmF966rAy/vW+C/RAogw=@vger.kernel.org X-Gm-Message-State: AOJu0YwQGtAXh9G5ODJv8zL3rCO2Iyx7INjDHRoa0e239frj+W+YM8Gf b8L/AWJZ/e33Eq9DBaEZ1hE0nRru3sLzz4RARmDmwfzmWuv2f6BbRrtM X-Gm-Gg: AY/fxX4Nr/HZpiWLaX8TPUmirqHj1UmTiI6SXpcAHUHEWp7QPbo6bGztPxZjtI1MeAz EYUvWC1dT1TXeqrWcR1KUwdviLK7/g1jt+PCXlsdbjibM3IyrjaUBQ4tHCSfewk3C4eL6lVAzM6 QVS11RPopE9sTkt4M1S8OoJ0iIdr1vcvyWCYnikKqYxi2pi8+wRbTXeFj9UNtQ/drHyvgLrOeMC QKLZyA2ADoRI+fONVBhNfwvTBbE9xveBFQeuO6wwe49thldkDaESsZFHPmhfAgKxQQCawKVBh5v b+oeQBtE+eA+vjJ9JAucakrtGKuLbLpEagOVk9C7nBkUrKvMDKN4JoBOlk5BskLk3pqf6FPVQ2a AeFDhEw5aPwPaTbAmaEgPaGbJG4C4x7ii0fTsenh4DlPUFVxR8r+JCNQkQF2jsUUFJkMQJD8s6G rMxhOKihUstEqLUhA/ik0+o0eBm98OuPNEOmx5 X-Received: by 2002:a05:6808:c16c:b0:44f:6e2a:ace with SMTP id 5614622812f47-45c73e33e0amr394064b6e.52.1768356050518; Tue, 13 Jan 2026 18:00:50 -0800 (PST) Received: from frodo (c-98-38-17-99.hsd1.co.comcast.net. [98.38.17.99]) by smtp.googlemail.com with ESMTPSA id 5614622812f47-45a5e183ac3sm10223525b6e.4.2026.01.13.18.00.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 13 Jan 2026 18:00:50 -0800 (PST) From: Jim Cromie To: gregkh@linuxfoundation.org, linux-kernel@vger.kernel.org Cc: Jim Cromie , Jason Baron , =?UTF-8?q?=C5=81ukasz=20Bartosik?= , Louis Chauvet , Bagas Sanjaya , Dave Airlie , Daniel Vetter , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , dri-devel@lists.freedesktop.org, Petr Mladek , Shuah Khan , linux-doc@vger.kernel.org, Steven Rostedt , "Liam R. Howlett" Subject: [PATCH v8 31/31] docs/dyndbg: add classmap info to howto Date: Tue, 13 Jan 2026 18:57:47 -0700 Message-ID: <20260114015815.1565725-32-jim.cromie@gmail.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260114015815.1565725-1-jim.cromie@gmail.com> References: <20260114015815.1565725-1-jim.cromie@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" 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 --- .../admin-guide/dynamic-debug-howto.rst | 135 ++++++++++++++++-- 1 file changed, 123 insertions(+), 12 deletions(-) diff --git a/Documentation/admin-guide/dynamic-debug-howto.rst b/Documentat= ion/admin-guide/dynamic-debug-howto.rst index 89ee15d7ae58..c85266ee8eed 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 @@ -194,16 +197,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 @@ -218,6 +211,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 + 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,11 +250,15 @@ The flags are:: s Include the source file name l Include line number =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 -Note the regexp ``^[-+=3D][fslmpt_]+$`` matches a flags specification. -To clear all flags at once, use ``=3D_`` or ``-fslmpt``. +The regexp ``^[-+=3D][fslmpt_]+$`` matches a flags specification. =20 =20 Debug messages during Boot Process @@ -394,3 +410,98 @@ 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. + +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. --=20 2.52.0