From nobody Thu Apr 9 21:51:31 2026 Received: from mail-oo1-f48.google.com (mail-oo1-f48.google.com [209.85.161.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 3DD2830C617 for ; Fri, 6 Mar 2026 01:51:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.161.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772761877; cv=none; b=EupM/KFTubquCrTXOyUQtxr1vAvwRTpl2CsQLY4rd2eiwzYql7nBONZUiuSZmTfe2j0rCiiQzKsi+WQS1/JAN/3MLKVKOhRPypldzJyApehZa95pt74r2y9Y8IcgcEgLZS++lVoOqpxRXFMuCmQfzCdd/S98u+cWu/inbE2rbpg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772761877; c=relaxed/simple; bh=SPoeP76Zj5Yh8jMpcnJKmFt0xl803Uq9Fj6qba33IOo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=mOHKFZU035WpzW+h8+EJtrBAr4nrKxh0E6C7XKmSZ24Sv9eHvIUf/kW69KFuePRIcrHOAVj+c3TmqBVnM5EbniB8HP/HsRBNwGPV65HELT6PoNelgc5TiBFyFB7SK/Lf0pvQjdBAey2a1rSa1Rhe+446mqNSudTu1WOo0QJZeQw= 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=UPa/l9xw; arc=none smtp.client-ip=209.85.161.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="UPa/l9xw" Received: by mail-oo1-f48.google.com with SMTP id 006d021491bc7-6726f320b54so4969166eaf.1 for ; Thu, 05 Mar 2026 17:51:14 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1772761873; x=1773366673; 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=bv05xjmvI4rIAw60NQ+tAXnn+K45GBBhYovFXo2xASw=; b=UPa/l9xwlf451qSzsBs3puHPYXBZGz12DMUYKFszuyf+SX9gWAkkyyPWpe9s9dq7Mq xG0aARN5JfYR5fmhwqT3wRX27o8sXddcr7Lq0wE1lnYVgfWmYYTCGp1gtPJ+w/KYxfqX TGY4fFaf0t4QgiANhxx5yOLR3VG9mdSk+zE6HGJCmQQdu7+Rocw3nAdWNsGDMstY4Bmp IbAxdgqQvc/p29IQryQ0oFilhtElXW8T0fR6tWJaDwv8hp2RdrSM/AIDuY/sF/ee49VR j+awvlgcZUIjg1Mj9Y+VUCYYL0vvtsiFc7GOLw3KHt8nppu2cko3beQPeDmEaUSaW1O6 OFYA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772761873; x=1773366673; 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=bv05xjmvI4rIAw60NQ+tAXnn+K45GBBhYovFXo2xASw=; b=F1y92VzZ0H8i4HxnnAhxv/qv4hHf6mRx0VTDlkBnr0qSdsfTJqGJIJ32dYnMMtZifE IOawGeUl83BoE80vYpTIrkl9MtBKk9oo+xvOVZ2hwRmwbC4xqYqXHgm1MOIpbTXSJQi7 tvUaolyl0tbjNQnxmLJ7pH73Pc3Vu8mwvv/uLK74O1gcD9W1VKhhpBayvV8E1RQovJ/X /4FtTKFdLrIqDKL4tSkdiYYM5k/scrRL6x/QiF68t+mqDPtPTd/QhpjKItHQX/OudIn1 Zz41TDbEQ779y1WYrziPwRn+CVBsiijKRffIhoOxZPywhUHhWIIdBMTOYbraJ38yEt1E GfgQ== X-Gm-Message-State: AOJu0YxO/yVCtgHyHEyLfykkpJdkArj2Q87cD1CeP6+XtLD0eEQXrPvb sUDKQHHA7/sFPfI/7kHNrgYwCAxu0cLmPs4UlhWe7ZSQfTUBCmxWVhmWI0rmeM3z X-Gm-Gg: ATEYQzwoQ/M5YWk9DbeedInBOTphRRk3r/Q5F/Fu16S0/b3I0XS+bsvphPwj2m8c6E0 9xEYHuoLU2+RGzf6sjXn05c/WKjuvRnG33ClFuFnqogvLoilsWnOjJThnMfLPbmKqB595HIqvVd QGo1HDQ1WJoUsmuly0pqirm8PRL/MvnOIfPHID059+nqZIZ0Dt7ntkqUZKUYV3qZw4NQuUIRlQy yohMKwg+w5avZFneaRPQPYdMqpFRSTwmXU98bCwaA2xAAbS2mt7VvraPa1Ksg9JNb4qes3OHe3y IaR1TsLQ2bP2VxmD/zc4FTVvUvs3XMNneOXOCl07fbL3lOykWFuErmcjDvHyVwEqp2R4ZQmwdxe YiZwG2tqXPn9FUH6biiX0xN6aDLcGY+SO6dLm0/yHvD4kz4tH1FElfjNMUeUGOr904y4NNyYutN r+3sNp7y01X8sbFNofweEAmB6hXD7c1swGhhLTpDBLPqk35/nc X-Received: by 2002:a05:6820:4b05:b0:67a:4fe9:a4ba with SMTP id 006d021491bc7-67b9bd49644mr410552eaf.63.1772761872956; Thu, 05 Mar 2026 17:51:12 -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-67b9cc1a627sm115245eaf.6.2026.03.05.17.51.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 05 Mar 2026 17:51:12 -0800 (PST) From: Jim Cromie To: linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, amd-gfx@lists.freedesktop.org, intel-gvt-dev@lists.freedesktop.org, intel-gfx@lists.freedesktop.org Cc: Jim Cromie , Andrew Morton , Jason Baron Subject: [RFC PATCH 6/7] lib/dynamic_debug: add negation support to queries Date: Thu, 5 Mar 2026 18:50:09 -0700 Message-ID: <20260306015022.1940986-7-jim.cromie@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260306015022.1940986-1-jim.cromie@gmail.com> References: <20260306015022.1940986-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 allow users to invert the selection of any keyword. For example: echo "module !virtio* +p" > /proc/dynamic_debug/control When I test with virtme-ng, this cmd prevents flooding the logs with virtio activity. Its not perfect, because it cannot also avoid flooding from pr_debugs in serial_core or other potential sources. A more robust command is: echo "module !virtio* +p % module serial -p" > /proc/dynamic_debug/control Signed-off-by: Jim Cromie --- lib/dynamic_debug.c | 76 +++++++++++++++++++++++++++++++-------------- 1 file changed, 53 insertions(+), 23 deletions(-) diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c index 80fa8d2143e8..a283d12fd64d 100644 --- a/lib/dynamic_debug.c +++ b/lib/dynamic_debug.c @@ -59,6 +59,10 @@ struct ddebug_query { const char *format; const char *class_string; unsigned int first_lineno, last_lineno; + unsigned int filename_neg:1; + unsigned int module_neg:1; + unsigned int function_neg:1; + unsigned int format_neg:1; }; =20 struct ddebug_iter { @@ -163,11 +167,12 @@ static void vpr_info_dq(const struct ddebug_query *qu= ery, const char *msg) fmtlen--; } =20 - v3pr_info("%s: func=3D\"%s\" file=3D\"%s\" module=3D\"%s\" format=3D\"%.*= s\" lineno=3D%u-%u class=3D%s\n", + v3pr_info("%s: func%s=3D\"%s\" file%s=3D\"%s\" module%s=3D\"%s\" format%s= =3D\"%.*s\" lineno=3D%u-%u class=3D%s\n", msg, - query->function ?: "", - query->filename ?: "", - query->module ?: "", + query->function_neg ? "!" : "", query->function ?: "", + query->filename_neg ? "!" : "", query->filename ?: "", + query->module_neg ? "!" : "", query->module ?: "", + query->format_neg ? "!" : "", fmtlen, query->format ?: "", query->first_lineno, query->last_lineno, query->class_string); } @@ -268,32 +273,34 @@ static bool ddebug_match_desc(const struct ddebug_que= ry *query, int selected_class) { struct _ddebug_class_map *site_map; + bool match; =20 /* 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; + if (query->filename) { + match =3D match_wildcard(query->filename, dp->filename) || + match_wildcard(query->filename, kbasename(dp->filename)) || + match_wildcard(query->filename, trim_prefix(dp->filename)); + if (match =3D=3D query->filename_neg) + return false; + } =20 /* match against the function */ - if (query->function && - !match_wildcard(query->function, dp->function)) - return false; + if (query->function) { + match =3D match_wildcard(query->function, dp->function); + if (match =3D=3D query->function_neg) + return false; + } =20 /* 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 =3D (strstr(dp->format, query->format + 1) =3D=3D dp->format); + } else { + match =3D !!strstr(dp->format, query->format); } + if (match =3D=3D query->format_neg) + return false; } =20 /* match against the line number range */ @@ -345,9 +352,11 @@ static int ddebug_change(const struct ddebug_query *qu= ery, struct flag_settings struct _ddebug_class_map *mods_map; =20 /* match against the module name */ - if (query->module && - !match_wildcard(query->module, di->mod_name)) - continue; + if (query->module) { + bool match =3D match_wildcard(query->module, di->mod_name); + if (match =3D=3D query->module_neg) + continue; + } =20 selected_class =3D _DPRINTK_CLASS_DFLT; if (query->class_string) { @@ -514,6 +523,16 @@ static int parse_linerange(struct ddebug_query *query,= const char *first) return 0; } =20 +static char *check_neg(char *src, unsigned int *neg) +{ + if (*src =3D=3D '!') { + *neg =3D 1; + return src + 1; + } + *neg =3D 0; + return src; +} + static int check_set(const char **dest, char *src, char *name) { int rc =3D 0; @@ -558,10 +577,15 @@ static int ddebug_parse_query(char *words[], int nwor= ds, for (i =3D 0; i < nwords; i +=3D 2) { char *keyword =3D words[i]; char *arg =3D words[i+1]; + unsigned int neg; =20 if (!strcmp(keyword, "func")) { + arg =3D check_neg(arg, &neg); + query->function_neg =3D neg; rc =3D check_set(&query->function, arg, "func"); } else if (!strcmp(keyword, "file")) { + arg =3D check_neg(arg, &neg); + query->filename_neg =3D neg; if (check_set(&query->filename, arg, "file")) return -EINVAL; =20 @@ -572,6 +596,8 @@ static int ddebug_parse_query(char *words[], int nwords, *fline++ =3D '\0'; if (isalpha(*fline) || *fline =3D=3D '*' || *fline =3D=3D '?') { /* take as function name */ + fline =3D check_neg(fline, &neg); + query->function_neg =3D neg; if (check_set(&query->function, fline, "func")) return -EINVAL; } else { @@ -579,11 +605,15 @@ static int ddebug_parse_query(char *words[], int nwor= ds, return -EINVAL; } } else if (!strcmp(keyword, "module")) { + arg =3D check_neg(arg, &neg); + query->module_neg =3D neg; rc =3D check_set(&query->module, arg, "module"); } else if (!strcmp(keyword, "format")) { string_unescape_inplace(arg, UNESCAPE_SPACE | UNESCAPE_OCTAL | UNESCAPE_SPECIAL); + arg =3D check_neg(arg, &neg); + query->format_neg =3D neg; rc =3D check_set(&query->format, arg, "format"); } else if (!strcmp(keyword, "line")) { if (parse_linerange(query, arg)) --=20 2.53.0