From nobody Tue Dec 16 12:21:33 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 84B4BC4167B for ; Thu, 30 Nov 2023 23:41:21 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1377361AbjK3XlM (ORCPT ); Thu, 30 Nov 2023 18:41:12 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58814 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1377355AbjK3XlK (ORCPT ); Thu, 30 Nov 2023 18:41:10 -0500 Received: from mail-ej1-x62e.google.com (mail-ej1-x62e.google.com [IPv6:2a00:1450:4864:20::62e]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D477D10E2 for ; Thu, 30 Nov 2023 15:41:16 -0800 (PST) Received: by mail-ej1-x62e.google.com with SMTP id a640c23a62f3a-a18f732dc83so174390966b.1 for ; Thu, 30 Nov 2023 15:41:16 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=semihalf.com; s=google; t=1701387675; x=1701992475; 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=5Wq8EpQ6dCRcGOk0/JZhMwPd7dekut1Rp7pQcPvRIiQ=; b=Bd72puUw2+qMUcz3c27Gv3BYDyrF8XuGurmKFunbINC6l3Xqkz6iswNqf7+M+tyrT7 BN+0zN9qBRVh84mOPunzLY/mE6N2xm08ZPgtVBqOVcoicSViPHc/cLKs/yx/LeXuqK33 a/1XixL0qy5zkQ7+LOQts2Dtu+6fJ0e0/rdfPwhma1SD/RZBynQWQOjYDdvwabGwtzd5 8RwDBfVwPO5W7MCwH2CfaW8UcCega8rx2O6xnGedkKsoaIHvnBa4VyujuW0CxcalHIO/ pVo5jYLS84XYrfNvWzRkc+6sT6GxWpiaFtaWC7ZxkGVtr34XUw9w5t8usUw3qejwcAly tzcA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1701387675; x=1701992475; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=5Wq8EpQ6dCRcGOk0/JZhMwPd7dekut1Rp7pQcPvRIiQ=; b=gyQll01GYtFyirqpiqDU3SNach+E9R8pXcxU0XUCWO3BvtuV8bYNqmnK5mXnLlRyaT +107vUoEnqdJOEmtUgePfKTeusKa7NiLo2MeXEBGj2Edzzl3eK5BbjyUZu96tF8Zw6Li zTxTnGg5xVwoIUdUH4ATWT8hsodwJpQE0VwFQLclQcSKHMvNAM5KPEW718dHY4ermX7q ZUaAfArXC/8o5PwXlBd6TLsRcIKvPK3gEHUiOCxKuy3ckBDwt+f9vQbYlNS/e3yok9eW 7NszxTla1+y/KY9LxhadWEVujvriweQfGJlhdUBCE0dGzyPmmxRXpQV7K+lY5lRfIdD7 Fe0Q== X-Gm-Message-State: AOJu0YzRoYayUXSZYuRrysojlw+cQEKo16wjGHMXCcSWdDeSBn+aJnyJ NdYOtylgdWJnVgY40/k7boCb X-Google-Smtp-Source: AGHT+IG8TeQ+Zx3H3YN74SgCo0q6DDaeAMwm7mi2DhuuInzgByqvCQ2Twc/uEAZnoZAX9wm10qB19g== X-Received: by 2002:a17:906:73c2:b0:9c7:59ff:b7fd with SMTP id n2-20020a17090673c200b009c759ffb7fdmr373547ejl.28.1701387675442; Thu, 30 Nov 2023 15:41:15 -0800 (PST) Received: from ukaszb-l.semihalf.net (public-gprs368940.centertel.pl. [37.47.72.109]) by smtp.gmail.com with ESMTPSA id 9-20020a170906100900b009ddaf5ebb6fsm1210175ejm.177.2023.11.30.15.41.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 30 Nov 2023 15:41:15 -0800 (PST) From: =?UTF-8?q?=C5=81ukasz=20Bartosik?= To: Jason Baron , Jim Cromie , Andrew Morton , Kees Cook , Douglas Anderson Cc: Guenter Roeck , Yaniv Tzoreff , Benson Leung , Steven Rostedt , Vincent Whitchurch , Pekka Paalanen , Sean Paul , Daniel Vetter , linux-kernel@vger.kernel.org, upstream@semihalf.com Subject: [PATCH v2 01/15] dyndbg: add _DPRINTK_FLAGS_ENABLED Date: Fri, 1 Dec 2023 00:40:34 +0100 Message-ID: <20231130234048.157509-2-lb@semihalf.com> X-Mailer: git-send-email 2.43.0.rc2.451.g8631bc7472-goog In-Reply-To: <20231130234048.157509-1-lb@semihalf.com> References: <20231130234048.157509-1-lb@semihalf.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Jim Cromie Distinguish the condition: _DPRINTK_FLAGS_ENABLED from the bit: _DPRINTK_FLAGS_PRINT, and re-define former in terms of latter, in preparation to add a 2nd bit: _DPRINTK_FLAGS_TRACE Update JUMP_LABEL code block to check _DPRINTK_FLAGS_ENABLED symbol. Also add a 'K' to get new symbol _DPRINTK_FLAGS_PRINTK, in order to break any stale uses. CC: vincent.whitchurch@axis.com Signed-off-by: Jim Cromie --- include/linux/dynamic_debug.h | 10 ++++++---- lib/dynamic_debug.c | 8 ++++---- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/include/linux/dynamic_debug.h b/include/linux/dynamic_debug.h index 4fcbf4d4fd0a..7be791af7cf1 100644 --- a/include/linux/dynamic_debug.h +++ b/include/linux/dynamic_debug.h @@ -32,7 +32,7 @@ struct _ddebug { * writes commands to /dynamic_debug/control */ #define _DPRINTK_FLAGS_NONE 0 -#define _DPRINTK_FLAGS_PRINT (1<<0) /* printk() a message using the format= */ +#define _DPRINTK_FLAGS_PRINTK (1 << 0) /* printk() a message using the for= mat */ #define _DPRINTK_FLAGS_INCL_MODNAME (1<<1) #define _DPRINTK_FLAGS_INCL_FUNCNAME (1<<2) #define _DPRINTK_FLAGS_INCL_LINENO (1<<3) @@ -44,8 +44,10 @@ struct _ddebug { _DPRINTK_FLAGS_INCL_LINENO | _DPRINTK_FLAGS_INCL_TID |\ _DPRINTK_FLAGS_INCL_SOURCENAME) =20 +#define _DPRINTK_FLAGS_ENABLED _DPRINTK_FLAGS_PRINTK + #if defined DEBUG -#define _DPRINTK_FLAGS_DEFAULT _DPRINTK_FLAGS_PRINT +#define _DPRINTK_FLAGS_DEFAULT _DPRINTK_FLAGS_PRINTK #else #define _DPRINTK_FLAGS_DEFAULT 0 #endif @@ -199,10 +201,10 @@ void __dynamic_ibdev_dbg(struct _ddebug *descriptor, =20 #ifdef DEBUG #define DYNAMIC_DEBUG_BRANCH(descriptor) \ - likely(descriptor.flags & _DPRINTK_FLAGS_PRINT) + likely(descriptor.flags & _DPRINTK_FLAGS_ENABLED) #else #define DYNAMIC_DEBUG_BRANCH(descriptor) \ - unlikely(descriptor.flags & _DPRINTK_FLAGS_PRINT) + unlikely(descriptor.flags & _DPRINTK_FLAGS_ENABLED) #endif =20 #endif /* CONFIG_JUMP_LABEL */ diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c index 6fba6423cc10..ee0cb37153ef 100644 --- a/lib/dynamic_debug.c +++ b/lib/dynamic_debug.c @@ -89,7 +89,7 @@ static inline const char *trim_prefix(const char *path) } =20 static const struct { unsigned flag:8; char opt_char; } opt_array[] =3D { - { _DPRINTK_FLAGS_PRINT, 'p' }, + { _DPRINTK_FLAGS_PRINTK, 'p' }, { _DPRINTK_FLAGS_INCL_MODNAME, 'm' }, { _DPRINTK_FLAGS_INCL_FUNCNAME, 'f' }, { _DPRINTK_FLAGS_INCL_SOURCENAME, 's' }, @@ -247,10 +247,10 @@ static int ddebug_change(const struct ddebug_query *q= uery, if (newflags =3D=3D dp->flags) continue; #ifdef CONFIG_JUMP_LABEL - if (dp->flags & _DPRINTK_FLAGS_PRINT) { - if (!(newflags & _DPRINTK_FLAGS_PRINT)) + if (dp->flags & _DPRINTK_FLAGS_ENABLED) { + if (!(newflags & _DPRINTK_FLAGS_ENABLED)) static_branch_disable(&dp->key.dd_key_true); - } else if (newflags & _DPRINTK_FLAGS_PRINT) { + } else if (newflags & _DPRINTK_FLAGS_ENABLED) { static_branch_enable(&dp->key.dd_key_true); } #endif --=20 2.43.0.rc2.451.g8631bc7472-goog From nobody Tue Dec 16 12:21:33 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 15C6EC4167B for ; Thu, 30 Nov 2023 23:41:27 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1377349AbjK3XlS (ORCPT ); Thu, 30 Nov 2023 18:41:18 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44208 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1377355AbjK3XlN (ORCPT ); Thu, 30 Nov 2023 18:41:13 -0500 Received: from mail-ej1-x632.google.com (mail-ej1-x632.google.com [IPv6:2a00:1450:4864:20::632]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A9B9B10DC for ; Thu, 30 Nov 2023 15:41:19 -0800 (PST) Received: by mail-ej1-x632.google.com with SMTP id a640c23a62f3a-9fa2714e828so214621766b.1 for ; Thu, 30 Nov 2023 15:41:19 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=semihalf.com; s=google; t=1701387678; x=1701992478; 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=RYdbYF0m94fsC3GTgjOmD6mjqqKWFRCLzjA+YcCvaKs=; b=cZF7xIF9GljMKbHz/rGeGQE4VJNRC3iGVNmzxYaJZlrvuaPzCdhYyykqok8RB+/UN0 KlG64NrKA/cWyDSWhCxb8Qayu4afLNLEfcGx2uX4mNzc9y/W5BXM/ti2ciXLTYVkHAdF MPzo83M8Ls/yX8W7JeGPzbXIFjIcGpF7gMPNOHf2CtfBZOFkNu68i2XUCzYwv7s8Aj/G gW2imEd2nbgf7bpXUBHaGF6i0ssoVpbTQKLod24JresUWiM0cxJm3h2zsVRwa/YcqRU7 4+LkQYRWpg1734tGVqgrMUQTJP4dekbDfTZ4G7noYtIe5xUEx1Tqjn83tLOUR9Dh3QOs hXXw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1701387678; x=1701992478; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=RYdbYF0m94fsC3GTgjOmD6mjqqKWFRCLzjA+YcCvaKs=; b=MHjZJ4brmZz2XbbFFxS9peuohqOQBmLaiQ24KU5oCZIjL3O3+oW2IfcJRYkU2RIzU+ JcIbiYMMb0mqECOag+5jv4QKMAaBxNAHo3h4uKD1PlSQUx/Zpz8h5LgnWi2GCkk6G2f5 MBc2qMGkbIccT0eS0TD4IhyFlpA4bHmzLy6hXAOUba6p8kdvAqFS7FGulidZCmmAL0lJ PnDF61GT4JajaZowu279IekdHeJ4n09kTXDDwVKjYI18YERT68nob40LMHx+EHL4S23f 364nqC9UBu/T/TztJkGUHipL/Qo9OEu2Q4Lwp/WTFtkVvtQQCcrJV/g1gR9g6o6xBd4A 4DSg== X-Gm-Message-State: AOJu0Yycq1ebITC1timhLJi8aQl6ldAqaltPAemyTevib6LHXpHEmpMJ eg1IDHUwR6kNFi2k/UXYh1U4 X-Google-Smtp-Source: AGHT+IHN0IPJ7Eyb9vhCMmNNf6va3wVZuR3X71zSqgrDvVS+M45K9JFejLE5XG9EMpHFm5Btjy3+ag== X-Received: by 2002:a17:907:9009:b0:a19:a19b:55e4 with SMTP id ay9-20020a170907900900b00a19a19b55e4mr199024ejc.116.1701387678210; Thu, 30 Nov 2023 15:41:18 -0800 (PST) Received: from ukaszb-l.semihalf.net (public-gprs368940.centertel.pl. [37.47.72.109]) by smtp.gmail.com with ESMTPSA id 9-20020a170906100900b009ddaf5ebb6fsm1210175ejm.177.2023.11.30.15.41.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 30 Nov 2023 15:41:17 -0800 (PST) From: =?UTF-8?q?=C5=81ukasz=20Bartosik?= To: Jason Baron , Jim Cromie , Andrew Morton , Kees Cook , Douglas Anderson Cc: Guenter Roeck , Yaniv Tzoreff , Benson Leung , Steven Rostedt , Vincent Whitchurch , Pekka Paalanen , Sean Paul , Daniel Vetter , linux-kernel@vger.kernel.org, upstream@semihalf.com Subject: [PATCH v2 02/15] dyndbg: add _DPRINTK_FLAGS_TRACE Date: Fri, 1 Dec 2023 00:40:35 +0100 Message-ID: <20231130234048.157509-3-lb@semihalf.com> X-Mailer: git-send-email 2.43.0.rc2.451.g8631bc7472-goog In-Reply-To: <20231130234048.157509-1-lb@semihalf.com> References: <20231130234048.157509-1-lb@semihalf.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Jim Cromie Add new flag, and OR it into _DPRINTK_FLAGS_ENABLED definition CC: vincent.whitchurch@axis.com Signed-off-by: Jim Cromie --- include/linux/dynamic_debug.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/include/linux/dynamic_debug.h b/include/linux/dynamic_debug.h index 7be791af7cf1..497130816e9c 100644 --- a/include/linux/dynamic_debug.h +++ b/include/linux/dynamic_debug.h @@ -33,6 +33,9 @@ struct _ddebug { */ #define _DPRINTK_FLAGS_NONE 0 #define _DPRINTK_FLAGS_PRINTK (1 << 0) /* printk() a message using the for= mat */ +#define _DPRINTK_FLAGS_TRACE (1 << 6) +#define _DPRINTK_FLAGS_ENABLED (_DPRINTK_FLAGS_PRINTK | _DPRINTK_FLAGS_TRA= CE) + #define _DPRINTK_FLAGS_INCL_MODNAME (1<<1) #define _DPRINTK_FLAGS_INCL_FUNCNAME (1<<2) #define _DPRINTK_FLAGS_INCL_LINENO (1<<3) @@ -44,8 +47,6 @@ struct _ddebug { _DPRINTK_FLAGS_INCL_LINENO | _DPRINTK_FLAGS_INCL_TID |\ _DPRINTK_FLAGS_INCL_SOURCENAME) =20 -#define _DPRINTK_FLAGS_ENABLED _DPRINTK_FLAGS_PRINTK - #if defined DEBUG #define _DPRINTK_FLAGS_DEFAULT _DPRINTK_FLAGS_PRINTK #else --=20 2.43.0.rc2.451.g8631bc7472-goog From nobody Tue Dec 16 12:21:33 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8B5C8C4167B for ; Thu, 30 Nov 2023 23:41:29 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1377373AbjK3XlV (ORCPT ); Thu, 30 Nov 2023 18:41:21 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44238 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1377368AbjK3XlR (ORCPT ); Thu, 30 Nov 2023 18:41:17 -0500 Received: from mail-ed1-x533.google.com (mail-ed1-x533.google.com [IPv6:2a00:1450:4864:20::533]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A10CD10F3 for ; Thu, 30 Nov 2023 15:41:22 -0800 (PST) Received: by mail-ed1-x533.google.com with SMTP id 4fb4d7f45d1cf-54acdd65c88so1814165a12.2 for ; Thu, 30 Nov 2023 15:41:22 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=semihalf.com; s=google; t=1701387681; x=1701992481; 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=NrPwIwR3VEBYybM6RGTBtB0qlrcLpOcaaHY2TiBjIw0=; b=s1l68HCg7c52Zzrm/xjMY4hPvcMKxLo1Bir4T4KIEe9XuVAQvVQvZw36EF9L5VPhQQ HK9a+4BDzorCCgHnUIqsiy1FJwpP5HWx0n9abSGL1xGBH/hgeXV0XFAIJwSmN3tIDnq6 +j1wh6A5kPumIvY4UZ0NHbQFMdNuUU/P4SWE9I8KyWWNpaRkGrckvNn/dldgT0hBODj0 binyxgZwagQBHlowm6DnbLOlkjU/cGdhXP25NuqBLzXYMVeCcj723zWmyuc/cFdF2p3s 0A80DQzqH7oNTvJ5hrVN+6091V2YM0+6TNK5dWEkO37QJaJBNvy1t/lwX6Y2JlGgCAkR 45nw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1701387681; x=1701992481; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=NrPwIwR3VEBYybM6RGTBtB0qlrcLpOcaaHY2TiBjIw0=; b=fm72K5diMbaZU5zHkzRRzYHiDn7wcR7PKwge6KhcSoEtd4xfNXtIFxbtPKcWXkOmnI kdtyuyckNtmg6fpYEgq1aXzC8TWldgcw1Ob2LgnT7hugtQBG9zsnzmEGPdrk9bUWOkOW PuBn4Z8t+VSrVef5UUCO8VbdGDyufyyIa3V7+3tpHqqAq0q29+02ZL7dvX87BXrAU3Ow 5R24cXto+eed21ZjJjadhJZ+L5KlWbNAVWRUl+aZQkLl4OHIXoyny1CRRXw/3/oMvEPo FUxipSR9dOTYWfVtdvQoSUJ8EyHI17pomSNDd/3UtXmmvIc9LMF5gnzPCSrsYCH2EDtK 1ngw== X-Gm-Message-State: AOJu0Yyeg9PQTM29C7DdfzM7oog1fipmb6Y9xL0MepLfq6RpjWAbUHZV wbkYYig5Tq79tbcRw5tf4OAP X-Google-Smtp-Source: AGHT+IF1+Hs7K9b+IDW///3FHeDDtwSwAYzyp5j0S049I7yEiloJN063jPjIvBgTcnpOVk+L+cwsZw== X-Received: by 2002:a17:906:fcba:b0:a16:88e8:2de7 with SMTP id qw26-20020a170906fcba00b00a1688e82de7mr232849ejb.23.1701387680935; Thu, 30 Nov 2023 15:41:20 -0800 (PST) Received: from ukaszb-l.semihalf.net (public-gprs368940.centertel.pl. [37.47.72.109]) by smtp.gmail.com with ESMTPSA id 9-20020a170906100900b009ddaf5ebb6fsm1210175ejm.177.2023.11.30.15.41.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 30 Nov 2023 15:41:20 -0800 (PST) From: =?UTF-8?q?=C5=81ukasz=20Bartosik?= To: Jason Baron , Jim Cromie , Andrew Morton , Kees Cook , Douglas Anderson Cc: Guenter Roeck , Yaniv Tzoreff , Benson Leung , Steven Rostedt , Vincent Whitchurch , Pekka Paalanen , Sean Paul , Daniel Vetter , linux-kernel@vger.kernel.org, upstream@semihalf.com Subject: [PATCH v2 03/15] dyndbg: add write events to tracefs code Date: Fri, 1 Dec 2023 00:40:36 +0100 Message-ID: <20231130234048.157509-4-lb@semihalf.com> X-Mailer: git-send-email 2.43.0.rc2.451.g8631bc7472-goog In-Reply-To: <20231130234048.157509-1-lb@semihalf.com> References: <20231130234048.157509-1-lb@semihalf.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Jim Cromie adds: ddebug_trace() uses trace_console() temporarily to issue printk:console event uses internal-ish __ftrace_trace_stack code: 4-context buffer stack, barriers per Steve Rostedt call it from new funcs: ddebug_printk() - print to both syslog/tracefs ddebug_dev_printk() - dev-print to both syslog/tracefs These handle both _DPRINTK_FLAGS_PRINTK and _DPRINTK_FLAGS_TRACE cases, allowing to vsnprintf the message once and use it for both, skipping past the KERN_DEBUG character for tracing. Finally, adjust the callers: __ddebug_{pr_debug,{,net,ib}dev_dbg}, replacing printk and dev_printk with the new funcs above. The _DPRINTK_FLAGS_TRACE flag character is 'T', so the following finds all callsites enabled for tracing: grep -P =3Dp?T /proc/dynamic_debug/control This patch,~1,~2 are basically copies of: https://lore.kernel.org/lkml/ 20200825153338.17061-1-vincent.whitchurch@axis.com with a few differences: - s/dynamic_/ddebug_/ on Vincent's additions - __printf attrs on the _printk funcs - reuses trace_console() event, not adding a new "printk:dyndbg" event. next patch replaces this with 2 new events CC: vincent.whitchurch@axis.com Signed-off-by: Jim Cromie --- .../admin-guide/dynamic-debug-howto.rst | 5 +- lib/dynamic_debug.c | 156 +++++++++++++++--- 2 files changed, 133 insertions(+), 28 deletions(-) diff --git a/Documentation/admin-guide/dynamic-debug-howto.rst b/Documentat= ion/admin-guide/dynamic-debug-howto.rst index 0b3d39c610d9..8a126e10a6c5 100644 --- a/Documentation/admin-guide/dynamic-debug-howto.rst +++ b/Documentation/admin-guide/dynamic-debug-howto.rst @@ -209,8 +209,9 @@ of the characters:: =20 The flags are:: =20 - p enables the pr_debug() callsite. - _ enables no flags. + p callsite prints to syslog + T callsite issues a dyndbg:* trace-event + _ enables no flags =20 Decorator flags add to the message-prefix, in order: t Include thread ID, or diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c index ee0cb37153ef..016f33c20251 100644 --- a/lib/dynamic_debug.c +++ b/lib/dynamic_debug.c @@ -36,6 +36,7 @@ #include #include #include +#include =20 #include =20 @@ -90,6 +91,7 @@ static inline const char *trim_prefix(const char *path) =20 static const struct { unsigned flag:8; char opt_char; } opt_array[] =3D { { _DPRINTK_FLAGS_PRINTK, 'p' }, + { _DPRINTK_FLAGS_TRACE, 'T' }, { _DPRINTK_FLAGS_INCL_MODNAME, 'm' }, { _DPRINTK_FLAGS_INCL_FUNCNAME, 'f' }, { _DPRINTK_FLAGS_INCL_SOURCENAME, 's' }, @@ -858,6 +860,98 @@ static inline char *dynamic_emit_prefix(struct _ddebug= *desc, char *buf) return buf; } =20 +/* + * This code is heavily based on __ftrace_trace_stack(). + * + * Allow 4 levels of nesting: normal, softirq, irq, NMI. + */ +#define DYNAMIC_TRACE_NESTING 4 + +struct ddebug_trace_buf { + char buf[256]; +}; + +struct ddebug_trace_bufs { + struct ddebug_trace_buf bufs[DYNAMIC_TRACE_NESTING]; +}; + +static DEFINE_PER_CPU(struct ddebug_trace_bufs, ddebug_trace_bufs); +static DEFINE_PER_CPU(int, ddebug_trace_reserve); + +static void ddebug_trace(const char *fmt, va_list args) +{ + struct ddebug_trace_buf *buf; + int bufidx; + int len; + + preempt_disable_notrace(); + + bufidx =3D __this_cpu_inc_return(ddebug_trace_reserve) - 1; + + if (WARN_ON_ONCE(bufidx > DYNAMIC_TRACE_NESTING)) + goto out; + + /* For the same reasons as in __ftrace_trace_stack(). */ + barrier(); + + buf =3D this_cpu_ptr(ddebug_trace_bufs.bufs) + bufidx; + + len =3D vscnprintf(buf->buf, sizeof(buf->buf), fmt, args); + trace_console(buf->buf, len); + +out: + /* As above. */ + barrier(); + __this_cpu_dec(ddebug_trace_reserve); + preempt_enable_notrace(); +} + +__printf(2, 3) +static void ddebug_printk(unsigned int flags, const char *fmt, ...) +{ + if (flags & _DPRINTK_FLAGS_TRACE) { + va_list args; + + va_start(args, fmt); + /* + * All callers include the KERN_DEBUG prefix to keep the + * vprintk case simple; strip it out for tracing. + */ + ddebug_trace(fmt + strlen(KERN_DEBUG), args); + va_end(args); + } + + if (flags & _DPRINTK_FLAGS_PRINTK) { + va_list args; + + va_start(args, fmt); + vprintk(fmt, args); + va_end(args); + } +} + +__printf(3, 4) +static void ddebug_dev_printk(unsigned int flags, const struct device *dev, + const char *fmt, ...) +{ + + if (flags & _DPRINTK_FLAGS_TRACE) { + va_list args; + + va_start(args, fmt); + ddebug_trace(fmt, args); + va_end(args); + } + + if (flags & _DPRINTK_FLAGS_PRINTK) { + va_list args; + + va_start(args, fmt); + dev_vprintk_emit(LOGLEVEL_DEBUG, dev, fmt, args); + va_end(args); + } +} + void __dynamic_pr_debug(struct _ddebug *descriptor, const char *fmt, ...) { va_list args; @@ -872,16 +966,18 @@ void __dynamic_pr_debug(struct _ddebug *descriptor, c= onst char *fmt, ...) vaf.fmt =3D fmt; vaf.va =3D &args; =20 - printk(KERN_DEBUG "%s%pV", dynamic_emit_prefix(descriptor, buf), &vaf); + ddebug_printk(descriptor->flags, KERN_DEBUG "%s%pV", + dynamic_emit_prefix(descriptor, buf), &vaf); =20 va_end(args); } EXPORT_SYMBOL(__dynamic_pr_debug); =20 void __dynamic_dev_dbg(struct _ddebug *descriptor, - const struct device *dev, const char *fmt, ...) + const struct device *dev, const char *fmt, ...) { struct va_format vaf; + unsigned int flags; va_list args; =20 BUG_ON(!descriptor); @@ -891,16 +987,18 @@ void __dynamic_dev_dbg(struct _ddebug *descriptor, =20 vaf.fmt =3D fmt; vaf.va =3D &args; + flags =3D descriptor->flags; =20 if (!dev) { - printk(KERN_DEBUG "(NULL device *): %pV", &vaf); + ddebug_printk(flags, KERN_DEBUG "(NULL device *): %pV", + &vaf); } else { char buf[PREFIX_SIZE] =3D ""; =20 - dev_printk_emit(LOGLEVEL_DEBUG, dev, "%s%s %s: %pV", - dynamic_emit_prefix(descriptor, buf), - dev_driver_string(dev), dev_name(dev), - &vaf); + ddebug_dev_printk(flags, dev, "%s%s %s: %pV", + dynamic_emit_prefix(descriptor, buf), + dev_driver_string(dev), dev_name(dev), + &vaf); } =20 va_end(args); @@ -913,6 +1011,7 @@ void __dynamic_netdev_dbg(struct _ddebug *descriptor, const struct net_device *dev, const char *fmt, ...) { struct va_format vaf; + unsigned int flags; va_list args; =20 BUG_ON(!descriptor); @@ -922,22 +1021,24 @@ void __dynamic_netdev_dbg(struct _ddebug *descriptor, =20 vaf.fmt =3D fmt; vaf.va =3D &args; + flags =3D descriptor->flags; =20 if (dev && dev->dev.parent) { char buf[PREFIX_SIZE] =3D ""; =20 - dev_printk_emit(LOGLEVEL_DEBUG, dev->dev.parent, - "%s%s %s %s%s: %pV", - dynamic_emit_prefix(descriptor, buf), - dev_driver_string(dev->dev.parent), - dev_name(dev->dev.parent), - netdev_name(dev), netdev_reg_state(dev), - &vaf); + ddebug_dev_printk(flags, dev->dev.parent, + "%s%s %s %s%s: %pV", + dynamic_emit_prefix(descriptor, buf), + dev_driver_string(dev->dev.parent), + dev_name(dev->dev.parent), + netdev_name(dev), netdev_reg_state(dev), + &vaf); } else if (dev) { - printk(KERN_DEBUG "%s%s: %pV", netdev_name(dev), - netdev_reg_state(dev), &vaf); + ddebug_printk(flags, KERN_DEBUG "%s%s: %pV", + netdev_name(dev), netdev_reg_state(dev), &vaf); } else { - printk(KERN_DEBUG "(NULL net_device): %pV", &vaf); + ddebug_printk(flags, KERN_DEBUG "(NULL net_device): %pV", + &vaf); } =20 va_end(args); @@ -953,26 +1054,29 @@ void __dynamic_ibdev_dbg(struct _ddebug *descriptor, { struct va_format vaf; va_list args; + unsigned int flags; =20 va_start(args, fmt); =20 vaf.fmt =3D fmt; vaf.va =3D &args; + flags =3D descriptor->flags; =20 if (ibdev && ibdev->dev.parent) { char buf[PREFIX_SIZE] =3D ""; =20 - dev_printk_emit(LOGLEVEL_DEBUG, ibdev->dev.parent, - "%s%s %s %s: %pV", - dynamic_emit_prefix(descriptor, buf), - dev_driver_string(ibdev->dev.parent), - dev_name(ibdev->dev.parent), - dev_name(&ibdev->dev), - &vaf); + ddebug_dev_printk(flags, ibdev->dev.parent, + "%s%s %s %s: %pV", + dynamic_emit_prefix(descriptor, buf), + dev_driver_string(ibdev->dev.parent), + dev_name(ibdev->dev.parent), + dev_name(&ibdev->dev), + &vaf); } else if (ibdev) { - printk(KERN_DEBUG "%s: %pV", dev_name(&ibdev->dev), &vaf); + ddebug_printk(flags, KERN_DEBUG "%s: %pV", + dev_name(&ibdev->dev), &vaf); } else { - printk(KERN_DEBUG "(NULL ib_device): %pV", &vaf); + ddebug_printk(flags, KERN_DEBUG "(NULL ip_device): %pV", &vaf); } =20 va_end(args); --=20 2.43.0.rc2.451.g8631bc7472-goog From nobody Tue Dec 16 12:21:33 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id BCC16C10F04 for ; Thu, 30 Nov 2023 23:41:32 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1377378AbjK3XlY (ORCPT ); Thu, 30 Nov 2023 18:41:24 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44264 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1377365AbjK3XlU (ORCPT ); Thu, 30 Nov 2023 18:41:20 -0500 Received: from mail-ed1-x536.google.com (mail-ed1-x536.google.com [IPv6:2a00:1450:4864:20::536]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B7B2D10E4 for ; Thu, 30 Nov 2023 15:41:25 -0800 (PST) Received: by mail-ed1-x536.google.com with SMTP id 4fb4d7f45d1cf-54af0eca12dso1725266a12.3 for ; Thu, 30 Nov 2023 15:41:25 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=semihalf.com; s=google; t=1701387684; x=1701992484; 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=889GJOHWqz8X7/6SioxMP37jbJbwdcCN/V159RYDKdg=; b=bPsAr2QR8oRtCuln/Y4lu4ZpBIkBFbz5lNYHuCc3StxLR0jzuRbUsIorziqNg52pPJ lPps9qbEfy+6T81k5XhI2uZLiltUyl+pIBb6hPL8jWo7TDqetWCc3yup8J05cN2UFO/2 vxu+58beVwnNCB+XZZTA/o03hJJoKFBH4shVT12bT22UbCWkufxInE4mHPaxXucpzzE6 2+LoNvm8ooY4EC/xlTx2wb1npyIKrup86mvG1JmH6buT0DbF3cNrU26GulY2/JhMp0ZC rbXZn//jmfL6W5S04ZhWUXLPZcZf5KHHO+ucvPT/yvnbm6sqDOIot+hYdx1GkfwFffqo 1sRA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1701387684; x=1701992484; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=889GJOHWqz8X7/6SioxMP37jbJbwdcCN/V159RYDKdg=; b=YmGx8odoBXW6SgSAB0GuSAM+hQxkfD5INxbBwSzIi7+9n9KSgKSH26kdHgqcIpddSk B3qGMPd3VheIv0VuqtMU8uOxbDbOf91a0L9JaUcXMJcWAsnECdcJL3xJVDGzbtdqyMjK kkfoFTw4jbj/Dj4uPU4Mo/amDdHz7//UmdCKJh3fh4Tq4rpcSGSh8j9QUGcz3P+7V7K7 rFkvflBqPcSUs/D4HoWP1fxkkNLqB2XVetoXcMJMIUqEVGdEFNJTRHlrZoh+ZMoZkQng /f8Vmhb8ylyW8GoFhuhKXQT+AhTlC4ATQmGjQk2bRou5xLJxZJPtUS/xb9pab+z0xlrW RPiQ== X-Gm-Message-State: AOJu0YzubbKC+b/xvKHUA6n/H4MmOqohdv6r39xJXUCNl/tdek5w4JP3 HqpV2OrBCeznoMfVHU547K/+ X-Google-Smtp-Source: AGHT+IEfAxdhDpjC3tweNNgjd335fypyPetZ2xzqVFfCjUKgUVgRpDvE1qkSqnQLo740ajDVEZZpJg== X-Received: by 2002:a17:906:2c44:b0:a19:a19a:eaba with SMTP id f4-20020a1709062c4400b00a19a19aeabamr246090ejh.115.1701387684244; Thu, 30 Nov 2023 15:41:24 -0800 (PST) Received: from ukaszb-l.semihalf.net (public-gprs368940.centertel.pl. [37.47.72.109]) by smtp.gmail.com with ESMTPSA id 9-20020a170906100900b009ddaf5ebb6fsm1210175ejm.177.2023.11.30.15.41.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 30 Nov 2023 15:41:23 -0800 (PST) From: =?UTF-8?q?=C5=81ukasz=20Bartosik?= To: Jason Baron , Jim Cromie , Andrew Morton , Kees Cook , Douglas Anderson Cc: Guenter Roeck , Yaniv Tzoreff , Benson Leung , Steven Rostedt , Vincent Whitchurch , Pekka Paalanen , Sean Paul , Daniel Vetter , linux-kernel@vger.kernel.org, upstream@semihalf.com Subject: [PATCH v2 04/15] dyndbg: add 2 trace-events: prdbg, devdbg Date: Fri, 1 Dec 2023 00:40:37 +0100 Message-ID: <20231130234048.157509-5-lb@semihalf.com> X-Mailer: git-send-email 2.43.0.rc2.451.g8631bc7472-goog In-Reply-To: <20231130234048.157509-1-lb@semihalf.com> References: <20231130234048.157509-1-lb@semihalf.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Jim Cromie ddebug_trace() currently issues a single printk:console event. Replace that event by adding include/trace/events/dyndbg.h, which defines 2 new trace-events: dyndbg:prdbg & dyndbg:devdbg. These events save a debug message and use its length for processing. They also accept the _ddebug descriptor and dev structure so they can be used to access the whole callsite record in the future: file, line, function, flags. This allows the addition of a dynamic prefix later. So ddebug_trace() gets 2 new args: the descriptor and the device. And its callers: ddebug_printk(), ddebug_dev_printk() upgrade their flags param to pass the descriptor itself, and thus also the flags. Signed-off-by: Jim Cromie Signed-off-by: =C5=81ukasz Bartosik --- MAINTAINERS | 1 + include/trace/events/dyndbg.h | 63 ++++++++++++++++++++++++++++++ lib/dynamic_debug.c | 73 ++++++++++++++++++----------------- 3 files changed, 101 insertions(+), 36 deletions(-) create mode 100644 include/trace/events/dyndbg.h diff --git a/MAINTAINERS b/MAINTAINERS index 7a7bd8bd80e9..be1e8e39375c 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -7319,6 +7319,7 @@ M: Jason Baron M: Jim Cromie S: Maintained F: include/linux/dynamic_debug.h +F: include/trace/events/dyndbg.h F: lib/dynamic_debug.c F: lib/test_dynamic_debug.c =20 diff --git a/include/trace/events/dyndbg.h b/include/trace/events/dyndbg.h new file mode 100644 index 000000000000..647c30206a7d --- /dev/null +++ b/include/trace/events/dyndbg.h @@ -0,0 +1,63 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#undef TRACE_SYSTEM +#define TRACE_SYSTEM dyndbg + +#if !defined(_TRACE_DYNDBG_H) || defined(TRACE_HEADER_MULTI_READ) +#define _TRACE_DYNDBG_H + +#include + +/* + * template for dynamic debug events + * captures debug log message and uses its length, it also + * accepts _ddebug and dev structures for future extensions + */ +DECLARE_EVENT_CLASS(dyndbg_template, + + TP_PROTO(const struct _ddebug *desc, const struct device *dev, + const char *msg, size_t len), + + TP_ARGS(desc, dev, msg, len), + + TP_STRUCT__entry( + __dynamic_array(char, s, len+1) + ), + + TP_fast_assign( + /* + * Each trace entry is printed in a new line. + * If the msg finishes with '\n', cut it off + * to avoid blank lines in the trace. + */ + if (len > 0 && (msg[len-1] =3D=3D '\n')) + len -=3D 1; + + memcpy(__get_str(s), msg, len); + __get_str(s)[len] =3D 0; + ), + + TP_printk("%s", __get_str(s)) +); + +/* captures pr_debug() callsites */ +DEFINE_EVENT(dyndbg_template, prdbg, + + TP_PROTO(const struct _ddebug *desc, const struct device *dev, + const char *msg, size_t len), + + TP_ARGS(desc, dev, msg, len) +); + +/* captures dev_dbg() callsites */ +DEFINE_EVENT(dyndbg_template, devdbg, + + TP_PROTO(const struct _ddebug *desc, const struct device *dev, + const char *msg, size_t len), + + TP_ARGS(desc, dev, msg, len) +); + +#endif /* _TRACE_DYNDBG_H */ + +/* This part must be outside protection */ +#include diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c index 016f33c20251..fcc7c5631b53 100644 --- a/lib/dynamic_debug.c +++ b/lib/dynamic_debug.c @@ -36,7 +36,9 @@ #include #include #include -#include + +#define CREATE_TRACE_POINTS +#include =20 #include =20 @@ -878,7 +880,9 @@ struct ddebug_trace_bufs { static DEFINE_PER_CPU(struct ddebug_trace_bufs, ddebug_trace_bufs); static DEFINE_PER_CPU(int, ddebug_trace_reserve); =20 -static void ddebug_trace(const char *fmt, va_list args) +__printf(3, 0) +static void ddebug_trace(struct _ddebug *desc, const struct device *dev, + const char *fmt, va_list args) { struct ddebug_trace_buf *buf; int bufidx; @@ -897,7 +901,11 @@ static void ddebug_trace(const char *fmt, va_list args) buf =3D this_cpu_ptr(ddebug_trace_bufs.bufs) + bufidx; =20 len =3D vscnprintf(buf->buf, sizeof(buf->buf), fmt, args); - trace_console(buf->buf, len); + + if (!dev) + trace_prdbg(desc, NULL, buf->buf, len); + else + trace_devdbg(desc, dev, buf->buf, len); =20 out: /* As above. */ @@ -907,9 +915,9 @@ static void ddebug_trace(const char *fmt, va_list args) } =20 __printf(2, 3) -static void ddebug_printk(unsigned int flags, const char *fmt, ...) +static void ddebug_printk(struct _ddebug *desc, const char *fmt, ...) { - if (flags & _DPRINTK_FLAGS_TRACE) { + if (desc->flags & _DPRINTK_FLAGS_TRACE) { va_list args; =20 va_start(args, fmt); @@ -917,11 +925,11 @@ static void ddebug_printk(unsigned int flags, const c= har *fmt, ...) * All callers include the KERN_DEBUG prefix to keep the * vprintk case simple; strip it out for tracing. */ - ddebug_trace(fmt + strlen(KERN_DEBUG), args); + ddebug_trace(desc, NULL, fmt + strlen(KERN_DEBUG), args); va_end(args); } =20 - if (flags & _DPRINTK_FLAGS_PRINTK) { + if (desc->flags & _DPRINTK_FLAGS_PRINTK) { va_list args; =20 va_start(args, fmt); @@ -931,19 +939,19 @@ static void ddebug_printk(unsigned int flags, const c= har *fmt, ...) } =20 __printf(3, 4) -static void ddebug_dev_printk(unsigned int flags, const struct device *dev, +static void ddebug_dev_printk(struct _ddebug *desc, const struct device *d= ev, const char *fmt, ...) { =20 - if (flags & _DPRINTK_FLAGS_TRACE) { + if (desc->flags & _DPRINTK_FLAGS_TRACE) { va_list args; =20 va_start(args, fmt); - ddebug_trace(fmt, args); + ddebug_trace(desc, dev, fmt, args); va_end(args); } =20 - if (flags & _DPRINTK_FLAGS_PRINTK) { + if (desc->flags & _DPRINTK_FLAGS_PRINTK) { va_list args; =20 va_start(args, fmt); @@ -966,7 +974,7 @@ void __dynamic_pr_debug(struct _ddebug *descriptor, con= st char *fmt, ...) vaf.fmt =3D fmt; vaf.va =3D &args; =20 - ddebug_printk(descriptor->flags, KERN_DEBUG "%s%pV", + ddebug_printk(descriptor, KERN_DEBUG "%s%pV", dynamic_emit_prefix(descriptor, buf), &vaf); =20 va_end(args); @@ -977,7 +985,6 @@ void __dynamic_dev_dbg(struct _ddebug *descriptor, const struct device *dev, const char *fmt, ...) { struct va_format vaf; - unsigned int flags; va_list args; =20 BUG_ON(!descriptor); @@ -987,15 +994,14 @@ void __dynamic_dev_dbg(struct _ddebug *descriptor, =20 vaf.fmt =3D fmt; vaf.va =3D &args; - flags =3D descriptor->flags; =20 if (!dev) { - ddebug_printk(flags, KERN_DEBUG "(NULL device *): %pV", - &vaf); + ddebug_printk(descriptor, KERN_DEBUG "(NULL device *): %pV", + &vaf); } else { char buf[PREFIX_SIZE] =3D ""; =20 - ddebug_dev_printk(flags, dev, "%s%s %s: %pV", + ddebug_dev_printk(descriptor, dev, "%s%s %s: %pV", dynamic_emit_prefix(descriptor, buf), dev_driver_string(dev), dev_name(dev), &vaf); @@ -1011,7 +1017,6 @@ void __dynamic_netdev_dbg(struct _ddebug *descriptor, const struct net_device *dev, const char *fmt, ...) { struct va_format vaf; - unsigned int flags; va_list args; =20 BUG_ON(!descriptor); @@ -1021,24 +1026,22 @@ void __dynamic_netdev_dbg(struct _ddebug *descripto= r, =20 vaf.fmt =3D fmt; vaf.va =3D &args; - flags =3D descriptor->flags; =20 if (dev && dev->dev.parent) { char buf[PREFIX_SIZE] =3D ""; =20 - ddebug_dev_printk(flags, dev->dev.parent, - "%s%s %s %s%s: %pV", - dynamic_emit_prefix(descriptor, buf), - dev_driver_string(dev->dev.parent), - dev_name(dev->dev.parent), - netdev_name(dev), netdev_reg_state(dev), - &vaf); + ddebug_dev_printk(descriptor, dev->dev.parent, + "%s%s %s %s%s: %pV", + dynamic_emit_prefix(descriptor, buf), + dev_driver_string(dev->dev.parent), + dev_name(dev->dev.parent), + netdev_name(dev), netdev_reg_state(dev), + &vaf); } else if (dev) { - ddebug_printk(flags, KERN_DEBUG "%s%s: %pV", - netdev_name(dev), netdev_reg_state(dev), &vaf); + ddebug_dev_printk(descriptor, &dev->dev, KERN_DEBUG "%s%s: %pV", + netdev_name(dev), netdev_reg_state(dev), &vaf); } else { - ddebug_printk(flags, KERN_DEBUG "(NULL net_device): %pV", - &vaf); + ddebug_printk(descriptor, KERN_DEBUG "(NULL net_device): %pV", &vaf); } =20 va_end(args); @@ -1054,18 +1057,16 @@ void __dynamic_ibdev_dbg(struct _ddebug *descriptor, { struct va_format vaf; va_list args; - unsigned int flags; =20 va_start(args, fmt); =20 vaf.fmt =3D fmt; vaf.va =3D &args; - flags =3D descriptor->flags; =20 if (ibdev && ibdev->dev.parent) { char buf[PREFIX_SIZE] =3D ""; =20 - ddebug_dev_printk(flags, ibdev->dev.parent, + ddebug_dev_printk(descriptor, ibdev->dev.parent, "%s%s %s %s: %pV", dynamic_emit_prefix(descriptor, buf), dev_driver_string(ibdev->dev.parent), @@ -1073,10 +1074,10 @@ void __dynamic_ibdev_dbg(struct _ddebug *descriptor, dev_name(&ibdev->dev), &vaf); } else if (ibdev) { - ddebug_printk(flags, KERN_DEBUG "%s: %pV", - dev_name(&ibdev->dev), &vaf); + ddebug_dev_printk(descriptor, &ibdev->dev, KERN_DEBUG "%s: %pV", + dev_name(&ibdev->dev), &vaf); } else { - ddebug_printk(flags, KERN_DEBUG "(NULL ip_device): %pV", &vaf); + ddebug_printk(descriptor, KERN_DEBUG "(NULL ip_device): %pV", &vaf); } =20 va_end(args); --=20 2.43.0.rc2.451.g8631bc7472-goog From nobody Tue Dec 16 12:21:33 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 395C0C4167B for ; Thu, 30 Nov 2023 23:41:39 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1377383AbjK3Xla (ORCPT ); Thu, 30 Nov 2023 18:41:30 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59084 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1377348AbjK3Xl0 (ORCPT ); Thu, 30 Nov 2023 18:41:26 -0500 Received: from mail-ej1-x633.google.com (mail-ej1-x633.google.com [IPv6:2a00:1450:4864:20::633]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7521010E4 for ; Thu, 30 Nov 2023 15:41:32 -0800 (PST) Received: by mail-ej1-x633.google.com with SMTP id a640c23a62f3a-9fa2714e828so214648566b.1 for ; Thu, 30 Nov 2023 15:41:32 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=semihalf.com; s=google; t=1701387691; x=1701992491; 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=uUSou8Y9ftMqf1PK2crHmzfoy35Q5/lR0Dintg0xKiY=; b=Ee9srPmwlV6fdxvXNR5bmxtguX+6J3llt1jRsWEJbiO0cRjkdzIpYcx0Gl2vrkPWGT xQ8L6rVgS/z1r647hniawq3ZIPhYt8Rz4iYyudFBYSG3qVemPr/ejK2hjLVlFX1AvXax y6/IPqTZHeCN1RvZZcdNfGnmzY92PFPIDXhnyHPu8K1AWaEvjD/+vCNSfRsfjZhxMVeN 9OWsTReahmWLDufof35Dzr23HYAEwZYb6bNX78DL8yWNRGOTLJqIZ+HE/eivwfNU0IoV shxAJwe6v/Uh63efCHvascVqLUs5fOneJi6EuoG0OAilAdcdfnIIBqTl0SYR2xeIYuJo /07A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1701387691; x=1701992491; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=uUSou8Y9ftMqf1PK2crHmzfoy35Q5/lR0Dintg0xKiY=; b=fzsgoEVEMfgFTIsUB5kGHJAzP34gyGZo6cgauRMFsgO9FFSA3PX6f6BBsH/gpeUAhQ ZXhWUsrnjaace2Ehb1pjHkLHJ0ZxumW4CyGCBfFNTPCZ5qg9SRFOMCSMT5n3QJoCUYpo 9hmNpOVjp4ssPaibofnCgKSNt62HhfUlOIPeomUd8VwAMtFcLx+em6VggkPlzmW1JKAH hma72Oewf2KS72Nddps5Upws6eows5WUgms0cD7JGZXwfiP8pz0rxBcITsXS92ILsTNo 76lCyx4qiBFSik6tKThSMjuuGgGY3DvBAGnpU+20WBMfkZakBX0J5Vcvxv24Vtv41hFm aQ0w== X-Gm-Message-State: AOJu0YwyvzZYxYd+W9qaFxsl2aHPoZ6ToqwWmIMGBsvsE49GdcuXmbL0 /xybarUw19ONDFBZtVUDA8zu X-Google-Smtp-Source: AGHT+IFkGWramd2t5xJhUKE8Jp9wBXauti88roVFzzLwDBicH9+vwNIMDElnnVZgXyIse1zMLPq3+Q== X-Received: by 2002:a17:906:10ca:b0:a19:a19b:55f4 with SMTP id v10-20020a17090610ca00b00a19a19b55f4mr217903ejv.132.1701387691072; Thu, 30 Nov 2023 15:41:31 -0800 (PST) Received: from ukaszb-l.semihalf.net (public-gprs368940.centertel.pl. [37.47.72.109]) by smtp.gmail.com with ESMTPSA id 9-20020a170906100900b009ddaf5ebb6fsm1210175ejm.177.2023.11.30.15.41.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 30 Nov 2023 15:41:30 -0800 (PST) From: =?UTF-8?q?=C5=81ukasz=20Bartosik?= To: Jason Baron , Jim Cromie , Andrew Morton , Kees Cook , Douglas Anderson Cc: Guenter Roeck , Yaniv Tzoreff , Benson Leung , Steven Rostedt , Vincent Whitchurch , Pekka Paalanen , Sean Paul , Daniel Vetter , linux-kernel@vger.kernel.org, upstream@semihalf.com, pmladek@suse.com, sergey.senozhatsky@gmail.com, john.ogness@linutronix.de, Simon Ser Subject: [PATCH v2 05/15] tracefs: add __get_str_strip_nl - RFC Date: Fri, 1 Dec 2023 00:40:38 +0100 Message-ID: <20231130234048.157509-6-lb@semihalf.com> X-Mailer: git-send-email 2.43.0.rc2.451.g8631bc7472-goog In-Reply-To: <20231130234048.157509-1-lb@semihalf.com> References: <20231130234048.157509-1-lb@semihalf.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Jim Cromie This variant of __get_str() removes the trailing newline. It is for use by printk/debug-ish events which already have a trailing newline. It is here to support: https://lore.kernel.org/lkml/ 20200825153338.17061-1-vincent.whitchurch@axis.com/ which taught dyndbg to send pr_debug() msgs to tracefs, via -x/T flag. It "reused" the include/trace/events/printk.h console event, which does the following: TP_fast_assign( /* * Each trace entry is printed in a new line. * If the msg finishes with '\n', cut it off * to avoid blank lines in the trace. */ if (len > 0 && (msg[len-1] =3D=3D '\n')) len -=3D 1; memcpy(__get_str(s), msg, len); __get_str(s)[len] =3D 0; ), That trim work could be avoided, *if* all pr_debug() callers are known to have no '\n' to strip. While that's not true for *all* callsites, it is 99+% true for DRM.debug callsites, and can be made true for some subsets of prdbg/dyndbg callsites. WANTED: macros to validate that a literal format-str has or doesn't have a trailing newline, or to provide or trim trailing newline(s?). Should be usable in TP_printk* defns, for use in new event defns. Cc: Cc: Vincent Whitchurch Cc: Cc: Cc: Cc: Cc: Simon Ser Cc: Sean Paul Signed-off-by: Jim Cromie Signed-off-by: =C5=81ukasz Bartosik --- include/trace/stages/stage3_trace_output.h | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/include/trace/stages/stage3_trace_output.h b/include/trace/sta= ges/stage3_trace_output.h index c1fb1355d309..92a79bd5c0cd 100644 --- a/include/trace/stages/stage3_trace_output.h +++ b/include/trace/stages/stage3_trace_output.h @@ -19,6 +19,15 @@ #undef __get_str #define __get_str(field) ((char *)__get_dynamic_array(field)) =20 +#undef __get_str_strip_nl +#define __get_str_strip_nl(field) \ + ({ \ + char *s =3D __get_str(field); \ + size_t len =3D strlen(s); \ + if (len && s[len-1] =3D=3D '\n') \ + s[len-1] =3D '\0'; s; \ + }) + #undef __get_rel_dynamic_array #define __get_rel_dynamic_array(field) \ ((void *)__entry + \ --=20 2.43.0.rc2.451.g8631bc7472-goog From nobody Tue Dec 16 12:21:33 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 86A6FC10F04 for ; Thu, 30 Nov 2023 23:41:48 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1377385AbjK3Xlj (ORCPT ); Thu, 30 Nov 2023 18:41:39 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48486 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1377305AbjK3Xle (ORCPT ); Thu, 30 Nov 2023 18:41:34 -0500 Received: from mail-ej1-x634.google.com (mail-ej1-x634.google.com [IPv6:2a00:1450:4864:20::634]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D2C3710FC for ; Thu, 30 Nov 2023 15:41:39 -0800 (PST) Received: by mail-ej1-x634.google.com with SMTP id a640c23a62f3a-a00ac0101d9so222950266b.0 for ; Thu, 30 Nov 2023 15:41:39 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=semihalf.com; s=google; t=1701387698; x=1701992498; 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=vTN+h/QEMYf7Pops99ws82TYphIJnTeV37hKepwC4Tk=; b=jvDShIeY1Nd8NTlM5Eg9KF6YD5ThMjusALez0zU4GsL1V85mf8BTRgCKLvnZw6dR6u LZf2uJnP6/pX5kppjth03GmS3+2xRLvE5XCWFQNvg3F8leGLhysxlirX3RBLFjsDoIAm yiCoOi1vdbHHzL9X93eAczkVhUoIj/gEssP1VcryQFeEAnGhJZr2QVc7BY5b9H95zYFU kzl0G/WuyAO2w1Yl3rIV3UcGxWmmYX9QZyfoa6JN5hr2wN8vnweZnl4/BT3SGrD4ny4+ AvOJz1q5QBWjWdIKEJIC/2XsK/vU7GnzXq6E1PKUhvPJsaOdn6kRNJiboQXv9bkRFhVU 0SQQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1701387698; x=1701992498; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=vTN+h/QEMYf7Pops99ws82TYphIJnTeV37hKepwC4Tk=; b=Pb7VStusSE+IvG5Wqcs9tIq+BlFa9pK2akhTmpeum1dy8PDdzD4kHxiLr2jXNqVlhH VRLBMiBToDMveI5SPxHJXe7riwFHqRkMQZcuyGT0ozRoyLWB2dSQiNL1BnjhXs7ibGpi Nl9hrquL6bcQfuRkaOBsBXg/3Gp4DEzEHpatUvngu+B954gqoPBqVxkfQtXIb3XCxtV8 4pyJd0sbjql+z2jhbJGgb/RwQPFjk6FEKa++W7BUlzs3KQ2Vcd9dYTxTI2Y5XpJzKUjQ RcuaoEVLSV2pGWa/B1/9lOpwAS0dvtvsPvfthZFLD7/bg54eWWIe+amIb5wZV7CPLbB+ y3RQ== X-Gm-Message-State: AOJu0YyVinqClX5z2Un5SEETjaRG9JllORwvfBu+4Zul4NOgTJRdbTzy dJ3czBFlplIsSkfoDoZHQo4A X-Google-Smtp-Source: AGHT+IFElJDryfSuMNqdgKPWut4MGwpnSAjjEYnzzc+i9phHDQLiFjprnGD0CsWityWbOgbsKwaGlQ== X-Received: by 2002:a17:907:9057:b0:a16:9205:c5b0 with SMTP id az23-20020a170907905700b00a169205c5b0mr177421ejc.56.1701387698397; Thu, 30 Nov 2023 15:41:38 -0800 (PST) Received: from ukaszb-l.semihalf.net (public-gprs368940.centertel.pl. [37.47.72.109]) by smtp.gmail.com with ESMTPSA id 9-20020a170906100900b009ddaf5ebb6fsm1210175ejm.177.2023.11.30.15.41.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 30 Nov 2023 15:41:38 -0800 (PST) From: =?UTF-8?q?=C5=81ukasz=20Bartosik?= To: Jason Baron , Jim Cromie , Andrew Morton , Kees Cook , Douglas Anderson Cc: Guenter Roeck , Yaniv Tzoreff , Benson Leung , Steven Rostedt , Vincent Whitchurch , Pekka Paalanen , Sean Paul , Daniel Vetter , linux-kernel@vger.kernel.org, upstream@semihalf.com Subject: [PATCH v2 06/15] dyndbg: use __get_str_strip_nl in prdbg and devdbg Date: Fri, 1 Dec 2023 00:40:39 +0100 Message-ID: <20231130234048.157509-7-lb@semihalf.com> X-Mailer: git-send-email 2.43.0.rc2.451.g8631bc7472-goog In-Reply-To: <20231130234048.157509-1-lb@semihalf.com> References: <20231130234048.157509-1-lb@semihalf.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Jim Cromie Recently added dyndbg events: prdbg, devdbg have code to strip the trailing newline, if it's there. Instead of removing the newline in TP_fast_assign use __get_str_strip_nl macro in TP_printk. Advantage of such an approach is that the removal is done on the read side (slow path). The change removes also passing of debug message length to prdbg and devdbg events. This use is slightly premature/overkill, since some pr_debugs do not have the expected trailing newline. While those lacks are arguably bugs, this doesn't fix them. Signed-off-by: Jim Cromie Signed-off-by: =C5=81ukasz Bartosik --- include/trace/events/dyndbg.h | 27 +++++++++------------------ lib/dynamic_debug.c | 7 +++---- 2 files changed, 12 insertions(+), 22 deletions(-) diff --git a/include/trace/events/dyndbg.h b/include/trace/events/dyndbg.h index 647c30206a7d..ffd21480cd9d 100644 --- a/include/trace/events/dyndbg.h +++ b/include/trace/events/dyndbg.h @@ -15,46 +15,37 @@ DECLARE_EVENT_CLASS(dyndbg_template, =20 TP_PROTO(const struct _ddebug *desc, const struct device *dev, - const char *msg, size_t len), + const char *msg), =20 - TP_ARGS(desc, dev, msg, len), + TP_ARGS(desc, dev, msg), =20 TP_STRUCT__entry( - __dynamic_array(char, s, len+1) + __string(s, msg) ), =20 TP_fast_assign( - /* - * Each trace entry is printed in a new line. - * If the msg finishes with '\n', cut it off - * to avoid blank lines in the trace. - */ - if (len > 0 && (msg[len-1] =3D=3D '\n')) - len -=3D 1; - - memcpy(__get_str(s), msg, len); - __get_str(s)[len] =3D 0; + __assign_str(s, msg); ), =20 - TP_printk("%s", __get_str(s)) + TP_printk("%s", __get_str_strip_nl(s)) ); =20 /* captures pr_debug() callsites */ DEFINE_EVENT(dyndbg_template, prdbg, =20 TP_PROTO(const struct _ddebug *desc, const struct device *dev, - const char *msg, size_t len), + const char *msg), =20 - TP_ARGS(desc, dev, msg, len) + TP_ARGS(desc, dev, msg) ); =20 /* captures dev_dbg() callsites */ DEFINE_EVENT(dyndbg_template, devdbg, =20 TP_PROTO(const struct _ddebug *desc, const struct device *dev, - const char *msg, size_t len), + const char *msg), =20 - TP_ARGS(desc, dev, msg, len) + TP_ARGS(desc, dev, msg) ); =20 #endif /* _TRACE_DYNDBG_H */ diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c index fcc7c5631b53..9682277f3909 100644 --- a/lib/dynamic_debug.c +++ b/lib/dynamic_debug.c @@ -886,7 +886,6 @@ static void ddebug_trace(struct _ddebug *desc, const st= ruct device *dev, { struct ddebug_trace_buf *buf; int bufidx; - int len; =20 preempt_disable_notrace(); =20 @@ -900,12 +899,12 @@ static void ddebug_trace(struct _ddebug *desc, const = struct device *dev, =20 buf =3D this_cpu_ptr(ddebug_trace_bufs.bufs) + bufidx; =20 - len =3D vscnprintf(buf->buf, sizeof(buf->buf), fmt, args); + vscnprintf(buf->buf, sizeof(buf->buf), fmt, args); =20 if (!dev) - trace_prdbg(desc, NULL, buf->buf, len); + trace_prdbg(desc, NULL, buf->buf); else - trace_devdbg(desc, dev, buf->buf, len); + trace_devdbg(desc, dev, buf->buf); =20 out: /* As above. */ --=20 2.43.0.rc2.451.g8631bc7472-goog From nobody Tue Dec 16 12:21:33 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 41075C4167B for ; Thu, 30 Nov 2023 23:41:50 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1377305AbjK3Xlm (ORCPT ); Thu, 30 Nov 2023 18:41:42 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48568 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1377343AbjK3Xli (ORCPT ); Thu, 30 Nov 2023 18:41:38 -0500 Received: from mail-lj1-x236.google.com (mail-lj1-x236.google.com [IPv6:2a00:1450:4864:20::236]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C5EA21704 for ; Thu, 30 Nov 2023 15:41:44 -0800 (PST) Received: by mail-lj1-x236.google.com with SMTP id 38308e7fff4ca-2c9d33f049cso12466311fa.0 for ; Thu, 30 Nov 2023 15:41:44 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=semihalf.com; s=google; t=1701387703; x=1701992503; 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=ZU2G2uffAM4O6Nhks/FhUry7Vyfirnbj/6Fsp1kfUEw=; b=CJZ0nT8023vEoKuowScpPmN7nUj933x4BU1+flrpiY7P+xYBmIYqfsYbSVCB/JApB+ oRSJpqn6IH+eWSONpXFjV8xcRWtm49++4HhBWiQROzD/D/ThyOYuTPuB0OvpVX0p06Zd NQEhrPTEHv1lmQTvQnf0Fuo5IuDA4PsXjIGZBI0p01hsraigq/E4XtNJ9CxVpqJgM86U OfSdDRYya9EIl13keenl6IcmaIGjMgTln+EwMUq3H1joktHqsjppCGdC1MTMR4ARh1Ti kCd1I39fwP6/nuOPjHGsEK5bBzrXInW31Z9GPFXZp2V2XuGrtW7fzzAMfp0GRDmRRWrk /bLQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1701387703; x=1701992503; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=ZU2G2uffAM4O6Nhks/FhUry7Vyfirnbj/6Fsp1kfUEw=; b=DGLdL/B/uHgx7vOq0YlX9XN/V7vq7j/I2lJTh5Cq1K5Z+MHbE4cdyGvM4KWo17yXU5 Ot82Yk7RbCyilhyR4Ye5Y/yveBDNTH4VFjO/F1eHp/K07LnrAVK2iKt2mrQUErkaBOZX ydvWx/NHVBXd9o+kBF1Q0iciGtOY6NNEytFwci+4t8MtyIvd0RL/sWOBgbDddG/Xx64P +8VtKfREqKo+U5FUnrC93rg6EY3+JlaPDiDEKqNO5oWTBqFcQAN3buJtUAd2R7JsRuuP I3QkCvxOd+xp5Nqd/waOmSsHUwec59Ra+kzeH7z//Lthpene/DpkSPrlyr2UbMJYSjP0 ixeQ== X-Gm-Message-State: AOJu0Yx4kgLaKSMA5oWDwbB4+rANcdVTmEuXfZusWa8o5zGX4SZP6DAR Ull5mfG/4VOeFCoJxIGUnCLQ X-Google-Smtp-Source: AGHT+IFdkWNqgAPnv9bHsEskbc07MOcrl6nHQBDj1rVmZhR60pOrRg4jGoKCC7tcEnv2DrSZg7N8RQ== X-Received: by 2002:a2e:9083:0:b0:2c9:bb40:21f3 with SMTP id l3-20020a2e9083000000b002c9bb4021f3mr194433ljg.30.1701387702926; Thu, 30 Nov 2023 15:41:42 -0800 (PST) Received: from ukaszb-l.semihalf.net (public-gprs368940.centertel.pl. [37.47.72.109]) by smtp.gmail.com with ESMTPSA id 9-20020a170906100900b009ddaf5ebb6fsm1210175ejm.177.2023.11.30.15.41.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 30 Nov 2023 15:41:42 -0800 (PST) From: =?UTF-8?q?=C5=81ukasz=20Bartosik?= To: Jason Baron , Jim Cromie , Andrew Morton , Kees Cook , Douglas Anderson Cc: Guenter Roeck , Yaniv Tzoreff , Benson Leung , Steven Rostedt , Vincent Whitchurch , Pekka Paalanen , Sean Paul , Daniel Vetter , linux-kernel@vger.kernel.org, upstream@semihalf.com Subject: [PATCH v2 07/15] dyndbg: repack _ddebug structure Date: Fri, 1 Dec 2023 00:40:40 +0100 Message-ID: <20231130234048.157509-8-lb@semihalf.com> X-Mailer: git-send-email 2.43.0.rc2.451.g8631bc7472-goog In-Reply-To: <20231130234048.157509-1-lb@semihalf.com> References: <20231130234048.157509-1-lb@semihalf.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Jim Cromie Move the JUMP_LABEL to the top of the struct, since they're both align(8) and this closes a pahole (unfortunately trading for padding, but still). Signed-off-by: Jim Cromie --- include/linux/dynamic_debug.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/include/linux/dynamic_debug.h b/include/linux/dynamic_debug.h index 497130816e9c..b9237e4ecd1b 100644 --- a/include/linux/dynamic_debug.h +++ b/include/linux/dynamic_debug.h @@ -14,6 +14,12 @@ * the special section is treated as an array of these. */ struct _ddebug { +#ifdef CONFIG_JUMP_LABEL + union { + struct static_key_true dd_key_true; + struct static_key_false dd_key_false; + } key; +#endif /* * These fields are used to drive the user interface * for selecting and displaying debug callsites. @@ -53,12 +59,6 @@ struct _ddebug { #define _DPRINTK_FLAGS_DEFAULT 0 #endif unsigned int flags:8; -#ifdef CONFIG_JUMP_LABEL - union { - struct static_key_true dd_key_true; - struct static_key_false dd_key_false; - } key; -#endif } __attribute__((aligned(8))); =20 enum class_map_type { --=20 2.43.0.rc2.451.g8631bc7472-goog From nobody Tue Dec 16 12:21:33 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id E1E63C4167B for ; Thu, 30 Nov 2023 23:41:57 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1377415AbjK3Xlt (ORCPT ); Thu, 30 Nov 2023 18:41:49 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:35396 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1377380AbjK3Xlm (ORCPT ); Thu, 30 Nov 2023 18:41:42 -0500 Received: from mail-ej1-x634.google.com (mail-ej1-x634.google.com [IPv6:2a00:1450:4864:20::634]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 77159171D for ; Thu, 30 Nov 2023 15:41:46 -0800 (PST) Received: by mail-ej1-x634.google.com with SMTP id a640c23a62f3a-a186e5d1056so189214466b.0 for ; Thu, 30 Nov 2023 15:41:46 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=semihalf.com; s=google; t=1701387705; x=1701992505; 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=8J2WZ0IGcIr3fy7N8wKaOifqKqSzyfYQ2zJRhIWe6Ro=; b=JiJkzVFgkV+JVeRJjmRgC0xrGLh/c+r7GDaJTVFoa1vxnMr27FxWL6Ftpo+6Mex2Hu wwjTJl1C0LmrgYGnVAQMRCEc2NKYaQQA3C87B8NcwuPDgnyHNN4g8OFqC267E9UIyN5w joEBvkbfHzh0dDmGZO27zZOcZ8C1ELDeKukixOS6A5zYYKwAMRljO0a2zZOJYH+ncFjQ GxPpMw/z4NedGT09YhaWLJt8wa1t3vMZEDHcyOqJTk48fuVUriiKProdAGZruzcDAkES Oo1Qz59/ow94F5uoikTgPbXea4htZuAWqQXchElelnZkCirEiuM1f3jfoUhnJwt06tbE 64oA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1701387705; x=1701992505; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=8J2WZ0IGcIr3fy7N8wKaOifqKqSzyfYQ2zJRhIWe6Ro=; b=HwkBHL6m70vsbKIWCWtsAY63bDiiMNnFZqD+pWixGVGkQyl7fqJrcnuYl4527eGuKd b4xgJZIuHAxmCdBg5kQVfB9oa07fvcsjFlge7PlTynYRp09canCVf/pP6+7w4nNNBOje talfgAecbAxKz43I7LNzaP2e4kZyVrvGPY1Vrx3qNT+m1wnNsrugKzujvxFu0B+UotfL 0sOij+zu57sH6jdtcrMUw9R53sjRf+I3MOEmQkd5ml89phFg8X5JXe3OcvU4XSdaWYaz tmuHnaex8AsQlhuhmbw4KIdoH4xzfNY7NQ6RjkHx/7A8DNO2/NsFUaO4o8d/X13+qzup lD9Q== X-Gm-Message-State: AOJu0YzJeFHfeUptrClOEzv6TR7RA0DHATGdpXMNXuptZjwFhpeC01a9 DU90MhDjtVMJpYk2Fv4vsHSg X-Google-Smtp-Source: AGHT+IFI4xFKSgTUElwL0TOIYkErTU9c4lZRnAMES884jCJr9EZDQjruUZpxLOjWqqWQhYo/MOv3eg== X-Received: by 2002:a17:906:10ca:b0:a19:a19b:55f4 with SMTP id v10-20020a17090610ca00b00a19a19b55f4mr218042ejv.132.1701387705063; Thu, 30 Nov 2023 15:41:45 -0800 (PST) Received: from ukaszb-l.semihalf.net (public-gprs368940.centertel.pl. [37.47.72.109]) by smtp.gmail.com with ESMTPSA id 9-20020a170906100900b009ddaf5ebb6fsm1210175ejm.177.2023.11.30.15.41.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 30 Nov 2023 15:41:44 -0800 (PST) From: =?UTF-8?q?=C5=81ukasz=20Bartosik?= To: Jason Baron , Jim Cromie , Andrew Morton , Kees Cook , Douglas Anderson Cc: Guenter Roeck , Yaniv Tzoreff , Benson Leung , Steven Rostedt , Vincent Whitchurch , Pekka Paalanen , Sean Paul , Daniel Vetter , linux-kernel@vger.kernel.org, upstream@semihalf.com Subject: [PATCH v2 08/15] dyndbg: move flags field to a new structure Date: Fri, 1 Dec 2023 00:40:41 +0100 Message-ID: <20231130234048.157509-9-lb@semihalf.com> X-Mailer: git-send-email 2.43.0.rc2.451.g8631bc7472-goog In-Reply-To: <20231130234048.157509-1-lb@semihalf.com> References: <20231130234048.157509-1-lb@semihalf.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Add a new structure ctrl and place it in 4 padding bytes of _ddebug struct. Move flags field to the ctrl struct and create setter and getter for the flags field. Add unused fields to explicitly emphasise size of each bitfield. This step prepares for addition of a trace_dst field. Layout of _ddebug struct after addition of ctrl is: struct _ddebug { union { struct static_key_true dd_key_true; /* 0 16 */ struct static_key_false dd_key_false; /* 0 16 */ } key; /* 0 16 */ union { struct static_key_true dd_key_true; /* 0 16 */ struct static_key_false dd_key_false; /* 0 16 */ }; const char * modname; /* 16 8 */ const char * function; /* 24 8 */ const char * filename; /* 32 8 */ const char * format; /* 40 8 */ unsigned int lineno:18; /* 48: 0 4 */ unsigned int class_id:6; /* 48:18 4 */ unsigned int unused:8; /* 48:24 4 */ struct dd_ctrl ctrl; /* 52 4 */ /* size: 56, cachelines: 1, members: 9 */ /* last cacheline: 56 bytes */ } __attribute__((__aligned__(8))); Signed-off-by: =C5=81ukasz Bartosik --- include/linux/dynamic_debug.h | 9 +++++-- lib/dynamic_debug.c | 44 ++++++++++++++++++++++------------- 2 files changed, 35 insertions(+), 18 deletions(-) diff --git a/include/linux/dynamic_debug.h b/include/linux/dynamic_debug.h index b9237e4ecd1b..684766289bfc 100644 --- a/include/linux/dynamic_debug.h +++ b/include/linux/dynamic_debug.h @@ -32,6 +32,8 @@ struct _ddebug { #define CLS_BITS 6 unsigned int class_id:CLS_BITS; #define _DPRINTK_CLASS_DFLT ((1 << CLS_BITS) - 1) + unsigned int unused:8; + /* * The flags field controls the behaviour at the callsite. * The bits here are changed dynamically when the user @@ -58,7 +60,10 @@ struct _ddebug { #else #define _DPRINTK_FLAGS_DEFAULT 0 #endif - unsigned int flags:8; + struct { + unsigned int flags:8; + unsigned unused:24; + } ctrl; } __attribute__((aligned(8))); =20 enum class_map_type { @@ -171,7 +176,7 @@ void __dynamic_ibdev_dbg(struct _ddebug *descriptor, .filename =3D __FILE__, \ .format =3D (fmt), \ .lineno =3D __LINE__, \ - .flags =3D _DPRINTK_FLAGS_DEFAULT, \ + .ctrl =3D { .flags =3D _DPRINTK_FLAGS_DEFAULT }, \ .class_id =3D cls, \ _DPRINTK_KEY_INIT \ }; \ diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c index 9682277f3909..f47cb76e0e3d 100644 --- a/lib/dynamic_debug.c +++ b/lib/dynamic_debug.c @@ -80,6 +80,16 @@ module_param(verbose, int, 0644); MODULE_PARM_DESC(verbose, " dynamic_debug/control processing " "( 0 =3D off (default), 1 =3D module add/rm, 2 =3D >control summary, 3 = =3D parsing, 4 =3D per-site changes)"); =20 +static inline unsigned int get_flags(const struct _ddebug *desc) +{ + return desc->ctrl.flags; +} + +static inline void set_flags(struct _ddebug *desc, unsigned int val) +{ + desc->ctrl.flags =3D val; +} + /* Return the path relative to source root */ static inline const char *trim_prefix(const char *path) { @@ -247,11 +257,11 @@ static int ddebug_change(const struct ddebug_query *q= uery, =20 nfound++; =20 - newflags =3D (dp->flags & modifiers->mask) | modifiers->flags; - if (newflags =3D=3D dp->flags) + newflags =3D (get_flags(dp) & modifiers->mask) | modifiers->flags; + if (newflags =3D=3D get_flags(dp)) continue; #ifdef CONFIG_JUMP_LABEL - if (dp->flags & _DPRINTK_FLAGS_ENABLED) { + if (get_flags(dp) & _DPRINTK_FLAGS_ENABLED) { if (!(newflags & _DPRINTK_FLAGS_ENABLED)) static_branch_disable(&dp->key.dd_key_true); } else if (newflags & _DPRINTK_FLAGS_ENABLED) { @@ -261,9 +271,9 @@ static int ddebug_change(const struct ddebug_query *que= ry, v4pr_info("changed %s:%d [%s]%s %s =3D> %s\n", trim_prefix(dp->filename), dp->lineno, dt->mod_name, dp->function, - ddebug_describe_flags(dp->flags, &fbuf), + ddebug_describe_flags(get_flags(dp), &fbuf), ddebug_describe_flags(newflags, &nbuf)); - dp->flags =3D newflags; + set_flags(dp, newflags); } } mutex_unlock(&ddebug_lock); @@ -824,10 +834,11 @@ static int remaining(int wrote) =20 static char *__dynamic_emit_prefix(const struct _ddebug *desc, char *buf) { + unsigned int flags =3D get_flags(desc); int pos_after_tid; int pos =3D 0; =20 - if (desc->flags & _DPRINTK_FLAGS_INCL_TID) { + if (flags & _DPRINTK_FLAGS_INCL_TID) { if (in_interrupt()) pos +=3D snprintf(buf + pos, remaining(pos), " "); else @@ -835,16 +846,16 @@ static char *__dynamic_emit_prefix(const struct _ddeb= ug *desc, char *buf) task_pid_vnr(current)); } pos_after_tid =3D pos; - if (desc->flags & _DPRINTK_FLAGS_INCL_MODNAME) + if (flags & _DPRINTK_FLAGS_INCL_MODNAME) pos +=3D snprintf(buf + pos, remaining(pos), "%s:", desc->modname); - if (desc->flags & _DPRINTK_FLAGS_INCL_FUNCNAME) + if (flags & _DPRINTK_FLAGS_INCL_FUNCNAME) pos +=3D snprintf(buf + pos, remaining(pos), "%s:", desc->function); - if (desc->flags & _DPRINTK_FLAGS_INCL_SOURCENAME) + if (flags & _DPRINTK_FLAGS_INCL_SOURCENAME) pos +=3D snprintf(buf + pos, remaining(pos), "%s:", trim_prefix(desc->filename)); - if (desc->flags & _DPRINTK_FLAGS_INCL_LINENO) + if (flags & _DPRINTK_FLAGS_INCL_LINENO) pos +=3D snprintf(buf + pos, remaining(pos), "%d:", desc->lineno); if (pos - pos_after_tid) @@ -857,7 +868,7 @@ static char *__dynamic_emit_prefix(const struct _ddebug= *desc, char *buf) =20 static inline char *dynamic_emit_prefix(struct _ddebug *desc, char *buf) { - if (unlikely(desc->flags & _DPRINTK_FLAGS_INCL_ANY)) + if (unlikely(get_flags(desc) & _DPRINTK_FLAGS_INCL_ANY)) return __dynamic_emit_prefix(desc, buf); return buf; } @@ -916,7 +927,8 @@ static void ddebug_trace(struct _ddebug *desc, const st= ruct device *dev, __printf(2, 3) static void ddebug_printk(struct _ddebug *desc, const char *fmt, ...) { - if (desc->flags & _DPRINTK_FLAGS_TRACE) { + + if (get_flags(desc) & _DPRINTK_FLAGS_TRACE) { va_list args; =20 va_start(args, fmt); @@ -928,7 +940,7 @@ static void ddebug_printk(struct _ddebug *desc, const c= har *fmt, ...) va_end(args); } =20 - if (desc->flags & _DPRINTK_FLAGS_PRINTK) { + if (get_flags(desc) & _DPRINTK_FLAGS_PRINTK) { va_list args; =20 va_start(args, fmt); @@ -942,7 +954,7 @@ static void ddebug_dev_printk(struct _ddebug *desc, con= st struct device *dev, const char *fmt, ...) { =20 - if (desc->flags & _DPRINTK_FLAGS_TRACE) { + if (get_flags(desc) & _DPRINTK_FLAGS_TRACE) { va_list args; =20 va_start(args, fmt); @@ -950,7 +962,7 @@ static void ddebug_dev_printk(struct _ddebug *desc, con= st struct device *dev, va_end(args); } =20 - if (desc->flags & _DPRINTK_FLAGS_PRINTK) { + if (get_flags(desc) & _DPRINTK_FLAGS_PRINTK) { va_list args; =20 va_start(args, fmt); @@ -1246,7 +1258,7 @@ static int ddebug_proc_show(struct seq_file *m, void = *p) seq_printf(m, "%s:%u [%s]%s =3D%s \"", trim_prefix(dp->filename), dp->lineno, iter->table->mod_name, dp->function, - ddebug_describe_flags(dp->flags, &flags)); + ddebug_describe_flags(get_flags(dp), &flags)); seq_escape_str(m, dp->format, ESCAPE_SPACE, "\t\r\n\""); seq_puts(m, "\""); =20 --=20 2.43.0.rc2.451.g8631bc7472-goog From nobody Tue Dec 16 12:21:33 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8F4A3C4167B for ; Thu, 30 Nov 2023 23:42:01 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1377426AbjK3Xlx (ORCPT ); Thu, 30 Nov 2023 18:41:53 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:35460 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1377259AbjK3Xlr (ORCPT ); Thu, 30 Nov 2023 18:41:47 -0500 Received: from mail-ej1-x62f.google.com (mail-ej1-x62f.google.com [IPv6:2a00:1450:4864:20::62f]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id F0787172A for ; Thu, 30 Nov 2023 15:41:49 -0800 (PST) Received: by mail-ej1-x62f.google.com with SMTP id a640c23a62f3a-a18ebac19efso179906166b.0 for ; Thu, 30 Nov 2023 15:41:49 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=semihalf.com; s=google; t=1701387708; x=1701992508; 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=PvWBqsBruFEKsR0MhC+h7002KX53XW9q92xWDwe3s6Y=; b=Rk7dWZlYEVjjynwObaSgHs3cg9IweMy9dryzTT1AQnxZh7gkKRWwxso0XsGWtlDLqn 3NTz4u0tiRdKJpfYN71vbXsQBjscvCKJSh4ZiMTHC4Ud0UN40Q6/zEid7LdrRFhivMNz B42GwwJGYexZ3lmxLgT4GNR084w578MTxu9RR4LRGbvWQMVCZ5mrvfKSTjkr2HJX+CKr 4Qmr+UCb7GAc7nL2klPdtwMWdjGX/+bk5ddS5TtiKuZJ57YReeLp5cIEOe0Ar5hS2C1K SxnTnOZyG9OCipDJbyINMrlHyO7dzADZvCSs+Mzzph/uS1YzYZDx4UnbHbyDHpMKN7cF zJyg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1701387708; x=1701992508; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=PvWBqsBruFEKsR0MhC+h7002KX53XW9q92xWDwe3s6Y=; b=WlO9TiNwOxbO7VYjsBE7FQqUYdt0hpKmtHkTVfDv3xOiAq/WYGsBlOMSe0sdN+zZqg N5PvNwQjLlx2bOFt/yZN3HaCGMShpOejdInIxVhzZuznY4XPd7foDHO1ReOZmpF7nLty kH+W7CD1DEv1BLG+Zm5tA7kObQ9Wk3IhAyau2NOSils674wMeC3zoP8VSKGNp1EDWr04 gry/bcatUH5e9fdjnJWd1PqCY/VMUu/aRBkpK2/FnzlbgzwNfrtolQyRNeuDQ2KByx2a 67gOYmad/0MUDFv6wilShFDyKXoU+gO94rPuedKDLcJUrnMjlT6dnFBLH6LNiGgWzcGd HpVQ== X-Gm-Message-State: AOJu0Yw5Q2Pwywlqerv9eirE4pKXr2GfMy+YMS+m2q1UKWFwXGZQ/LMH ZEc+7lLekCH8PrKpXop/oaaH X-Google-Smtp-Source: AGHT+IF2tOy1mmLqNkETl1ATpBslNTkPe++WMHkHfKYECkGJbUCbCLKg0D9ZE05c5yqAMqi4jTG3Pg== X-Received: by 2002:a17:906:f2d2:b0:a18:8c37:239f with SMTP id gz18-20020a170906f2d200b00a188c37239fmr358773ejb.19.1701387708223; Thu, 30 Nov 2023 15:41:48 -0800 (PST) Received: from ukaszb-l.semihalf.net (public-gprs368940.centertel.pl. [37.47.72.109]) by smtp.gmail.com with ESMTPSA id 9-20020a170906100900b009ddaf5ebb6fsm1210175ejm.177.2023.11.30.15.41.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 30 Nov 2023 15:41:47 -0800 (PST) From: =?UTF-8?q?=C5=81ukasz=20Bartosik?= To: Jason Baron , Jim Cromie , Andrew Morton , Kees Cook , Douglas Anderson Cc: Guenter Roeck , Yaniv Tzoreff , Benson Leung , Steven Rostedt , Vincent Whitchurch , Pekka Paalanen , Sean Paul , Daniel Vetter , linux-kernel@vger.kernel.org, upstream@semihalf.com Subject: [PATCH v2 09/15] dyndbg: add trace destination field to _ddebug Date: Fri, 1 Dec 2023 00:40:42 +0100 Message-ID: <20231130234048.157509-10-lb@semihalf.com> X-Mailer: git-send-email 2.43.0.rc2.451.g8631bc7472-goog In-Reply-To: <20231130234048.157509-1-lb@semihalf.com> References: <20231130234048.157509-1-lb@semihalf.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Add trace destination field (trace_dst) to the _ddebug structure. The trace destination field is used to determine output of debug logs when +T is set. Setting trace_dst value to TRACE_DST_BITS(63) enables output to prdbg and devdbg trace events. Setting trace_dst value to a value in range of [0..62] enables output to trace instance. Signed-off-by: =C5=81ukasz Bartosik --- include/linux/dynamic_debug.h | 14 ++++++++++++-- lib/dynamic_debug.c | 28 +++++++++++++++++++--------- 2 files changed, 31 insertions(+), 11 deletions(-) diff --git a/include/linux/dynamic_debug.h b/include/linux/dynamic_debug.h index 684766289bfc..56f152e75604 100644 --- a/include/linux/dynamic_debug.h +++ b/include/linux/dynamic_debug.h @@ -60,9 +60,19 @@ struct _ddebug { #else #define _DPRINTK_FLAGS_DEFAULT 0 #endif - struct { + struct dd_ctrl { unsigned int flags:8; - unsigned unused:24; + /* + * The trace destination field is used to determine output of debug + * logs when +T is set. Setting trace_dst value to TRACE_DST_MAX(63) + * enables output to prdbg and devdbg trace events. Setting trace_dst + * value to a value in range of [0..62] enables output to trace + * instance. + */ +#define TRACE_DST_BITS 6 + unsigned int trace_dst:TRACE_DST_BITS; +#define TRACE_DST_MAX ((1 << TRACE_DST_BITS) - 1) + unsigned unused:18; } ctrl; } __attribute__((aligned(8))); =20 diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c index f47cb76e0e3d..0dc9ec76b867 100644 --- a/lib/dynamic_debug.c +++ b/lib/dynamic_debug.c @@ -80,14 +80,24 @@ module_param(verbose, int, 0644); MODULE_PARM_DESC(verbose, " dynamic_debug/control processing " "( 0 =3D off (default), 1 =3D module add/rm, 2 =3D >control summary, 3 = =3D parsing, 4 =3D per-site changes)"); =20 +static inline struct dd_ctrl *get_ctrl(struct _ddebug *desc) +{ + return &desc->ctrl; +} + +static inline void set_ctrl(struct _ddebug *desc, struct dd_ctrl *ctrl) +{ + desc->ctrl =3D *ctrl; +} + static inline unsigned int get_flags(const struct _ddebug *desc) { return desc->ctrl.flags; } =20 -static inline void set_flags(struct _ddebug *desc, unsigned int val) +static inline unsigned int get_trace_dst(const struct _ddebug *desc) { - desc->ctrl.flags =3D val; + return desc->ctrl.trace_dst; } =20 /* Return the path relative to source root */ @@ -190,8 +200,8 @@ static int ddebug_change(const struct ddebug_query *que= ry, { int i; struct ddebug_table *dt; - unsigned int newflags; unsigned int nfound =3D 0; + struct dd_ctrl nctrl =3D {0}; struct flagsbuf fbuf, nbuf; struct ddebug_class_map *map =3D NULL; int __outvar valid_class; @@ -257,14 +267,14 @@ static int ddebug_change(const struct ddebug_query *q= uery, =20 nfound++; =20 - newflags =3D (get_flags(dp) & modifiers->mask) | modifiers->flags; - if (newflags =3D=3D get_flags(dp)) + nctrl.flags =3D (get_flags(dp) & modifiers->mask) | modifiers->flags; + if (!memcmp(&nctrl, get_ctrl(dp), sizeof(struct dd_ctrl))) continue; #ifdef CONFIG_JUMP_LABEL if (get_flags(dp) & _DPRINTK_FLAGS_ENABLED) { - if (!(newflags & _DPRINTK_FLAGS_ENABLED)) + if (!(nctrl.flags & _DPRINTK_FLAGS_ENABLED)) static_branch_disable(&dp->key.dd_key_true); - } else if (newflags & _DPRINTK_FLAGS_ENABLED) { + } else if (nctrl.flags & _DPRINTK_FLAGS_ENABLED) { static_branch_enable(&dp->key.dd_key_true); } #endif @@ -272,8 +282,8 @@ static int ddebug_change(const struct ddebug_query *que= ry, trim_prefix(dp->filename), dp->lineno, dt->mod_name, dp->function, ddebug_describe_flags(get_flags(dp), &fbuf), - ddebug_describe_flags(newflags, &nbuf)); - set_flags(dp, newflags); + ddebug_describe_flags(nctrl.flags, &nbuf)); + set_ctrl(dp, &nctrl); } } mutex_unlock(&ddebug_lock); --=20 2.43.0.rc2.451.g8631bc7472-goog From nobody Tue Dec 16 12:21:33 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id B8778C4167B for ; Thu, 30 Nov 2023 23:42:12 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1377381AbjK3XmE (ORCPT ); Thu, 30 Nov 2023 18:42:04 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:35502 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1377438AbjK3Xl6 (ORCPT ); Thu, 30 Nov 2023 18:41:58 -0500 Received: from mail-ej1-x62c.google.com (mail-ej1-x62c.google.com [IPv6:2a00:1450:4864:20::62c]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 4BD3A19B6 for ; Thu, 30 Nov 2023 15:41:54 -0800 (PST) Received: by mail-ej1-x62c.google.com with SMTP id a640c23a62f3a-a186e5d1056so189226266b.0 for ; Thu, 30 Nov 2023 15:41:54 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=semihalf.com; s=google; t=1701387712; x=1701992512; 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=pbG5LyFeXhU+t73dZalR5ZvW0pWNtNjpv2RI0v041So=; b=MI5jhd1Vfz06GV4aL23OTdh640xToqHdObCXts6urMD8ldzyn74kgOzvuOsDT4LjuQ Bpqpn7O1tKXBNhM/AE/Dav8tQ9Ire2j1v0UgiaNxwCASg6FcHDXJtET6qArVKV3DUp4D Y+SAwteT5a2O2rqV8+adbZDHvwcCCeKbKvX2ZWz7zmhjB2CfOJDIUaTAmWq8aA7P9JWk QMjjL8+8jyGTOpSHiDKIgBRu5BBZtqgW1w1woIr72C/mGj0jii5TtDOVj8350k1V0h0T h8zi0szM5zE2ErPSx+i1V/b55llFCIT3U8kLjnRA+mj2TB5ugQf/V1yNpnjh9m4Iuiad yL3Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1701387712; x=1701992512; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=pbG5LyFeXhU+t73dZalR5ZvW0pWNtNjpv2RI0v041So=; b=GXDa0kNhxmyTi8nHssvW1fPamiwaVmQIV/1J2A3IUWb4ggwL96ye8rUpBswTorKBKB GdJmwsFdLhLIdi9DFcn9fefuzy9xn1KCKKDX/hSE08Y7/sVmVmXSxqSKHxjHwD3pw8wd ZErpRS+d1EL/LFRM2SloTEHtDHhee4YYUSoQ1JqkqZhO7EVuRIxFQHxXnq3ZPMB1r/X2 p/tlUPOhcf2WryIKUeVtm55Vy3DyLb3MpgwbErrI6aDuoUEbPchNASKTTPSwWD45QKfD qn7Apko8kYX3oMGB8lqrd9cmldRtBxuRae3VMH8imLeFKDXMhNIk4Kqqa1z4Sp/h540L iKaA== X-Gm-Message-State: AOJu0Yyj2/Lhmsea/Vs5tz5hucn2AdK1w1tHjAk9DsevvKeVYhMc9eD0 8jt2iwJBY46d3RYLX8nM8p61 X-Google-Smtp-Source: AGHT+IH/K003PUTn+LuhrnmXz94foquKLOZJ6iKVlGr6KzE4qDpYh3bAqkvgM4AxVSfTdNWux+iaeg== X-Received: by 2002:a17:906:1347:b0:a17:d57f:a851 with SMTP id x7-20020a170906134700b00a17d57fa851mr211812ejb.61.1701387712674; Thu, 30 Nov 2023 15:41:52 -0800 (PST) Received: from ukaszb-l.semihalf.net (public-gprs368940.centertel.pl. [37.47.72.109]) by smtp.gmail.com with ESMTPSA id 9-20020a170906100900b009ddaf5ebb6fsm1210175ejm.177.2023.11.30.15.41.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 30 Nov 2023 15:41:52 -0800 (PST) From: =?UTF-8?q?=C5=81ukasz=20Bartosik?= To: Jason Baron , Jim Cromie , Andrew Morton , Kees Cook , Douglas Anderson Cc: Guenter Roeck , Yaniv Tzoreff , Benson Leung , Steven Rostedt , Vincent Whitchurch , Pekka Paalanen , Sean Paul , Daniel Vetter , linux-kernel@vger.kernel.org, upstream@semihalf.com Subject: [PATCH v2 10/15] dyndbg: add open and close commands for trace Date: Fri, 1 Dec 2023 00:40:43 +0100 Message-ID: <20231130234048.157509-11-lb@semihalf.com> X-Mailer: git-send-email 2.43.0.rc2.451.g8631bc7472-goog In-Reply-To: <20231130234048.157509-1-lb@semihalf.com> References: <20231130234048.157509-1-lb@semihalf.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Add open and close commands for opening and closing trace instances. The open command has to be mandatory followed by a trace instance name. If a trace instance already exists in /tracing/instances directory then the open command will reuse it otherwise a new trace instance with a name provided to the open will be created. Close command closes previously opened trace instance. The close will fail if a user tries to close non-existent trace instances or an instance which was not previously opened. For example the following command will open (create or reuse existing) trace instance located in /tracing/instances/usbcore: echo "open usbcore" > /dynamic_debug/control Signed-off-by: =C5=81ukasz Bartosik --- lib/Kconfig.debug | 1 + lib/dynamic_debug.c | 193 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 194 insertions(+) diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug index 5bc56c7247a2..f184c3c91ba3 100644 --- a/lib/Kconfig.debug +++ b/lib/Kconfig.debug @@ -181,6 +181,7 @@ config DYNAMIC_DEBUG_CORE bool "Enable core function of dynamic debug support" depends on PRINTK depends on (DEBUG_FS || PROC_FS) + depends on TRACING help Enable core functional support of dynamic debug. It is useful when you want to tie dynamic debug to your kernel modules with diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c index 0dc9ec76b867..43e94023a4eb 100644 --- a/lib/dynamic_debug.c +++ b/lib/dynamic_debug.c @@ -36,6 +36,7 @@ #include #include #include +#include =20 #define CREATE_TRACE_POINTS #include @@ -73,6 +74,25 @@ struct flag_settings { unsigned int mask; }; =20 +#define DD_OPEN_CMD "open" +#define DD_CLOSE_CMD "close" +#define DD_TR_EVENT "0" + +struct ddebug_trace_inst { + const char *name; + struct trace_array *arr; +}; + +/* + * TRACE_DST_MAX value is reserved for writing + * debug logs to trace events (prdbg, devdbg) + */ +struct ddebug_trace { + struct ddebug_trace_inst inst[TRACE_DST_MAX-1]; + DECLARE_BITMAP(bmap, TRACE_DST_MAX-1); + int bmap_size; +}; + static DEFINE_MUTEX(ddebug_lock); static LIST_HEAD(ddebug_tables); static int verbose; @@ -80,6 +100,8 @@ module_param(verbose, int, 0644); MODULE_PARM_DESC(verbose, " dynamic_debug/control processing " "( 0 =3D off (default), 1 =3D module add/rm, 2 =3D >control summary, 3 = =3D parsing, 4 =3D per-site changes)"); =20 +static struct ddebug_trace tr =3D { .bmap_size =3D TRACE_DST_MAX-1 }; + static inline struct dd_ctrl *get_ctrl(struct _ddebug *desc) { return &desc->ctrl; @@ -171,6 +193,148 @@ 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 bool is_ddebug_cmd(const char *str) +{ + if (!strcmp(str, DD_OPEN_CMD) || + !strcmp(str, DD_CLOSE_CMD)) + return true; + + return false; +} + +static bool validate_tr_name(const char *str) +{ + /* "0" is reserved for writing debug logs to trace events (prdbg, devdbg)= */ + if (!strcmp(str, DD_TR_EVENT)) + return false; + + /* we allow trace instance names to include ^\w+ and underscore */ + while (*str !=3D '\0') { + if (!isalnum(*str) && *str !=3D '_') + return false; + str++; + } + + return true; +} + +static int find_tr_instance(const char *name) +{ + int idx; + + for_each_set_bit(idx, tr.bmap, tr.bmap_size) + if (!strcmp(tr.inst[idx].name, name)) + return idx; + + return -ENOENT; +} + +static int handle_tr_opend_cmd(const char *arg) +{ + struct ddebug_trace_inst *inst; + int idx, ret =3D 0; + + mutex_lock(&ddebug_lock); + + idx =3D find_first_zero_bit(tr.bmap, tr.bmap_size); + if (idx =3D=3D tr.bmap_size) { + ret =3D -ENOSPC; + goto end; + } + + if (!validate_tr_name(arg)) { + pr_err("invalid instance name:%s\n", arg); + ret =3D -EINVAL; + goto end; + } + + if (find_tr_instance(arg) >=3D 0) { + pr_err("instance is already opened name:%s\n ", arg); + ret =3D -EEXIST; + goto end; + } + + inst =3D &tr.inst[idx]; + inst->name =3D kstrdup(arg, GFP_KERNEL); + if (!inst->name) { + ret =3D -ENOMEM; + goto end; + } + + inst->arr =3D trace_array_get_by_name(inst->name); + if (!inst->arr) { + ret =3D -EINVAL; + goto end; + } + + ret =3D trace_array_init_printk(inst->arr); + if (ret) { + trace_array_put(inst->arr); + trace_array_destroy(inst->arr); + goto end; + } + + set_bit(idx, tr.bmap); + v3pr_info("opened trace instance idx=3D%d, name=3D%s\n", idx, arg); +end: + mutex_unlock(&ddebug_lock); + return ret; +} + +static int handle_tr_close_cmd(const char *arg) +{ + struct ddebug_trace_inst *inst; + int idx, ret =3D 0; + + mutex_lock(&ddebug_lock); + + idx =3D find_tr_instance(arg); + if (idx < 0) { + ret =3D idx; + goto end; + } + + inst =3D &tr.inst[idx]; + + trace_array_put(inst->arr); + /* + * don't destroy trace instance but let user do it manually + * with rmdir command at a convenient time later, if it is + * destroyed here all debug logs will be lost + * + * trace_array_destroy(inst->arr); + */ + inst->arr =3D NULL; + + kfree(inst->name); + inst->name =3D NULL; + + clear_bit(idx, tr.bmap); + v3pr_info("closed trace instance idx=3D%d, name=3D%s\n", idx, arg); +end: + mutex_unlock(&ddebug_lock); + return ret; +} + +static int ddebug_parse_cmd(char *words[], int nwords) +{ + int ret; + + if (nwords !=3D 1) + return -EINVAL; + + if (!strcmp(words[0], DD_OPEN_CMD)) + ret =3D handle_tr_opend_cmd(words[1]); + else if (!strcmp(words[0], DD_CLOSE_CMD)) + ret =3D handle_tr_close_cmd(words[1]); + else { + pr_err("invalid command %s\n", words[0]); + ret =3D -EINVAL; + } + + return ret; +} + static struct ddebug_class_map *ddebug_find_valid_class(struct ddebug_tabl= e const *dt, const char *class_string, int *class_id) { @@ -567,6 +731,11 @@ static int ddebug_exec_query(char *query_string, const= char *modname) pr_err("tokenize failed\n"); return -EINVAL; } + + /* check for open, close commands */ + if (is_ddebug_cmd(words[0])) + return ddebug_parse_cmd(words, nwords-1); + /* check flags 1st (last arg) so query is pairs of spec,val */ if (ddebug_parse_flags(words[nwords-1], &modifiers)) { pr_err("flags parse failed\n"); @@ -1191,6 +1360,20 @@ static struct _ddebug *ddebug_iter_next(struct ddebu= g_iter *iter) return &iter->table->ddebugs[iter->idx]; } =20 +/* + * Check if the iterator points to the last _ddebug object + * to traverse. + */ +static bool ddebug_iter_is_last(struct ddebug_iter *iter) +{ + if (iter->table =3D=3D NULL) + return false; + if (iter->idx-1 < 0 && + list_is_last(&iter->table->link, &ddebug_tables)) + return true; + return false; +} + /* * Seq_ops start method. Called at the start of every * read() call from userspace. Takes the ddebug_lock and @@ -1281,6 +1464,16 @@ static int ddebug_proc_show(struct seq_file *m, void= *p) } seq_puts(m, "\n"); =20 + if (ddebug_iter_is_last(iter) && + !bitmap_empty(tr.bmap, tr.bmap_size)) { + int idx; + + seq_puts(m, "\n"); + seq_puts(m, "Opened trace instances:\n"); + for_each_set_bit(idx, tr.bmap, tr.bmap_size) + seq_printf(m, "%s\n", tr.inst[idx].name); + } + return 0; } =20 --=20 2.43.0.rc2.451.g8631bc7472-goog From nobody Tue Dec 16 12:21:33 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 4458AC4167B for ; Thu, 30 Nov 2023 23:42:34 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1377259AbjK3XmZ (ORCPT ); Thu, 30 Nov 2023 18:42:25 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49038 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1377303AbjK3XmV (ORCPT ); Thu, 30 Nov 2023 18:42:21 -0500 Received: from mail-ej1-x636.google.com (mail-ej1-x636.google.com [IPv6:2a00:1450:4864:20::636]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 9AFD81BE7 for ; Thu, 30 Nov 2023 15:41:58 -0800 (PST) Received: by mail-ej1-x636.google.com with SMTP id a640c23a62f3a-a00d5b0ec44so215747866b.0 for ; Thu, 30 Nov 2023 15:41:58 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=semihalf.com; s=google; t=1701387716; x=1701992516; 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=CzVtATo7qejOLEB4sJXRSm13xDxtkLHgydWT8VzDoHc=; b=ueInL2FUUEfz1oq4Yg9M5U7h/fVM/pA3nFnhAfjuZv5HfmgWkP75NJa1SlwTR0nbMZ lDBi3OoEJgzFPIhnZsQBr82hRf0IMKok9SJwL0qzRJYpPuIeOyAWZlhs4UH8dMcsoEsw 6Ngs5fbl3XxPxiCj9jBsZGxyAKpNz9rQZDTDkkKsab/HvengCWVD6HNOLPLShVsYEMXX UG4tw8LjfxhXdl0CP6k1O5yEyslUjqx2Ds8HPquDJ8hUkysxoIU7qA7nSxH7sXyjr6Yo p3tX7QPL6XK66L1XCSuq4mKDDNC09F6xUQurjzH648SKKZUOp7R9hjLCDG/51bcAcPMo ztFQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1701387716; x=1701992516; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=CzVtATo7qejOLEB4sJXRSm13xDxtkLHgydWT8VzDoHc=; b=aFnkNvdjb0/Ke3mVXYAcmyoNNsR0yw/J/oQUkrvz8iYZbZq8sntK9/Hzt2cmwC3Hlc 41HCvHorxvfae2iIgK48Qae7Phr7J4Xe5beX4h4Ng2lmG+fjvsIdhdK3TdIZd40w0I7s uG4bxcWkrz6YTJFR+2mt52vhwVaddm/GM99dTJdOuE1zNfYEnhWgwMLY7FkWR2pSQpr5 hlkVSvkX8ynsdwcEWpNn1Jmvt5cT6USGMRFMIFKVIEe6EnABoCT8bsIkd0NL/IqJZlnr NWvn5FbNwyl1Cv4SM8p2ofgxfbo8BsfvqGOm/I2GOXzkRLxJzWg8iKVPeeAdJYUaL04X KIdw== X-Gm-Message-State: AOJu0Yz0YMIFpX2ERJAVp0jUiwUFk4rsxhKFbu8gY5HRlJpF4GnY2n7b XTTk4DuSQps+Ow6JguKqs36Q X-Google-Smtp-Source: AGHT+IF5ZpkMrM65f7DBXsUb6p5WzD9ekOc1bpk9Ey9ZaqoJx+OHB0eG3fr1rrLhe4JUc0uNAU63RQ== X-Received: by 2002:a17:907:511:b0:a19:a19b:4268 with SMTP id wj17-20020a170907051100b00a19a19b4268mr121632ejb.211.1701387716688; Thu, 30 Nov 2023 15:41:56 -0800 (PST) Received: from ukaszb-l.semihalf.net (public-gprs368940.centertel.pl. [37.47.72.109]) by smtp.gmail.com with ESMTPSA id 9-20020a170906100900b009ddaf5ebb6fsm1210175ejm.177.2023.11.30.15.41.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 30 Nov 2023 15:41:56 -0800 (PST) From: =?UTF-8?q?=C5=81ukasz=20Bartosik?= To: Jason Baron , Jim Cromie , Andrew Morton , Kees Cook , Douglas Anderson Cc: Guenter Roeck , Yaniv Tzoreff , Benson Leung , Steven Rostedt , Vincent Whitchurch , Pekka Paalanen , Sean Paul , Daniel Vetter , linux-kernel@vger.kernel.org, upstream@semihalf.com Subject: [PATCH v2 11/15] dyndbg: don't close trace instance when in use Date: Fri, 1 Dec 2023 00:40:44 +0100 Message-ID: <20231130234048.157509-12-lb@semihalf.com> X-Mailer: git-send-email 2.43.0.rc2.451.g8631bc7472-goog In-Reply-To: <20231130234048.157509-1-lb@semihalf.com> References: <20231130234048.157509-1-lb@semihalf.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Don't allow trace instance to be closed when it is still being used by at least one callsite. Signed-off-by: =C5=81ukasz Bartosik --- include/linux/dynamic_debug.h | 3 ++- lib/dynamic_debug.c | 31 +++++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/include/linux/dynamic_debug.h b/include/linux/dynamic_debug.h index 56f152e75604..5555857d9ba5 100644 --- a/include/linux/dynamic_debug.h +++ b/include/linux/dynamic_debug.h @@ -186,7 +186,8 @@ void __dynamic_ibdev_dbg(struct _ddebug *descriptor, .filename =3D __FILE__, \ .format =3D (fmt), \ .lineno =3D __LINE__, \ - .ctrl =3D { .flags =3D _DPRINTK_FLAGS_DEFAULT }, \ + .ctrl =3D { .flags =3D _DPRINTK_FLAGS_DEFAULT, \ + .trace_dst =3D TRACE_DST_MAX }, \ .class_id =3D cls, \ _DPRINTK_KEY_INIT \ }; \ diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c index 43e94023a4eb..73b6818e5fab 100644 --- a/lib/dynamic_debug.c +++ b/lib/dynamic_debug.c @@ -81,6 +81,7 @@ struct flag_settings { struct ddebug_trace_inst { const char *name; struct trace_array *arr; + int use_cnt; }; =20 /* @@ -274,6 +275,7 @@ static int handle_tr_opend_cmd(const char *arg) goto end; } =20 + inst->use_cnt =3D 0; set_bit(idx, tr.bmap); v3pr_info("opened trace instance idx=3D%d, name=3D%s\n", idx, arg); end: @@ -296,6 +298,14 @@ static int handle_tr_close_cmd(const char *arg) =20 inst =3D &tr.inst[idx]; =20 + WARN_ON(inst->use_cnt < 0); + if (inst->use_cnt) { + pr_err("trace instance is being used name=3D%s, use_cnt=3D%d\n", + inst->name, inst->use_cnt); + ret =3D -EBUSY; + goto end; + } + trace_array_put(inst->arr); /* * don't destroy trace instance but let user do it manually @@ -316,6 +326,26 @@ static int handle_tr_close_cmd(const char *arg) return ret; } =20 +static +void update_tr_dst(const struct _ddebug *desc, const struct dd_ctrl *nctrl) +{ + int oflags =3D get_flags(desc), odst =3D get_trace_dst(desc); + int nflags =3D nctrl->flags, ndst =3D nctrl->trace_dst; + + if (oflags & _DPRINTK_FLAGS_TRACE && + nflags & _DPRINTK_FLAGS_TRACE && + odst =3D=3D ndst) + return; + + if (oflags & _DPRINTK_FLAGS_TRACE && + odst !=3D TRACE_DST_MAX) + tr.inst[odst].use_cnt--; + + if (nflags & _DPRINTK_FLAGS_TRACE && + ndst !=3D TRACE_DST_MAX) + tr.inst[ndst].use_cnt++; +} + static int ddebug_parse_cmd(char *words[], int nwords) { int ret; @@ -447,6 +477,7 @@ static int ddebug_change(const struct ddebug_query *que= ry, dt->mod_name, dp->function, ddebug_describe_flags(get_flags(dp), &fbuf), ddebug_describe_flags(nctrl.flags, &nbuf)); + update_tr_dst(dp, &nctrl); set_ctrl(dp, &nctrl); } } --=20 2.43.0.rc2.451.g8631bc7472-goog From nobody Tue Dec 16 12:21:33 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 059E0C10DCE for ; Thu, 30 Nov 2023 23:43:40 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1377303AbjK3Xnb (ORCPT ); Thu, 30 Nov 2023 18:43:31 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:53150 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1377286AbjK3Xna (ORCPT ); Thu, 30 Nov 2023 18:43:30 -0500 Received: from mail-lj1-x22b.google.com (mail-lj1-x22b.google.com [IPv6:2a00:1450:4864:20::22b]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id BB0601738 for ; Thu, 30 Nov 2023 15:42:29 -0800 (PST) Received: by mail-lj1-x22b.google.com with SMTP id 38308e7fff4ca-2c9b77be7ceso21241921fa.2 for ; Thu, 30 Nov 2023 15:42:29 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=semihalf.com; s=google; t=1701387721; x=1701992521; 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=wt3vKjsUAZMbYy6d5uF1hBmVRmXnFVCm9oe1FHdN7nQ=; b=XXQDPDeG7dbBsJ/SYlKOrUWNYzfxkhWSmMXGoqP9LrI4Ie8by33ftmz9o52UNv9fL6 ECmaSU+WlCHTnIwxcY5yKrdLt4styjuvhfEffo/0mD+OYp2zFO+g/KCmYUg4ac577jZ6 PaMNbuCtRQl/+EHG6E1frXI8meoNUZL8qjpwUBZ26+1MSZ2zyJekkLsbcZaVWE9gb89c /LnrFn774icywHsQuyh7Hq47+8tzi7aSXqILOxQKZic1krRkq+8fxSvIgH6fZWJUp2Cy a3D7yfSJAoD1CGZo5NNtYDAZAJWCeu2SSDhHgitvQx2vprINGjD7+YBkEBP/GEWEpZ+m EeBQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1701387721; x=1701992521; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=wt3vKjsUAZMbYy6d5uF1hBmVRmXnFVCm9oe1FHdN7nQ=; b=g9zZCVt1phuzbRL6xFzXmhvVY8U5U35+9O2P2rqzDM2VET9KqbfNKwG845sPqyF/f7 DpAw6I+Da3NKtQXpcFnLOG4zOaKkMLTsOJPGcfS2rvFlD1pwI9vCs2B4aW7SCuDrqX26 uPYPgMAWAOvc+pFjfBuVSnVuK09iqymnTr5OAf4n/4KmcjVJjzp23CwLs1ogM8MMixYj oVqnMvQzYyzefuFjNcwk+qM03sAuVgKwZJT6tOnnCRVdtfxwsftEL5qJpUVKoBaRgW8/ e3uy+m9Sw0rUN494fr83nFJxSuV7RYoMkv/GxU7iJbkLy4Z+S+QRfaPpCzU/3OdbVtW5 e7Eg== X-Gm-Message-State: AOJu0YyM8/BnDh3C7okcD00cx1NYTU9wEwNFEv2Pbsopf+2QpZBAUlCN /zEDdmommxq1zoBRSCpH33yF X-Google-Smtp-Source: AGHT+IEBHKpQf2K2rkrIF9TFAKwX9YhDhOAH+FM6dtpPKjKAEh/Ez42l+n/fhHOfHbkG74cSGh06qA== X-Received: by 2002:a2e:9796:0:b0:2c9:d3ec:69c1 with SMTP id y22-20020a2e9796000000b002c9d3ec69c1mr138113lji.24.1701387721633; Thu, 30 Nov 2023 15:42:01 -0800 (PST) Received: from ukaszb-l.semihalf.net (public-gprs368940.centertel.pl. [37.47.72.109]) by smtp.gmail.com with ESMTPSA id 9-20020a170906100900b009ddaf5ebb6fsm1210175ejm.177.2023.11.30.15.41.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 30 Nov 2023 15:42:01 -0800 (PST) From: =?UTF-8?q?=C5=81ukasz=20Bartosik?= To: Jason Baron , Jim Cromie , Andrew Morton , Kees Cook , Douglas Anderson Cc: Guenter Roeck , Yaniv Tzoreff , Benson Leung , Steven Rostedt , Vincent Whitchurch , Pekka Paalanen , Sean Paul , Daniel Vetter , linux-kernel@vger.kernel.org, upstream@semihalf.com Subject: [PATCH v2 12/15] dyndbg: add processing of T(race) flag argument Date: Fri, 1 Dec 2023 00:40:45 +0100 Message-ID: <20231130234048.157509-13-lb@semihalf.com> X-Mailer: git-send-email 2.43.0.rc2.451.g8631bc7472-goog In-Reply-To: <20231130234048.157509-1-lb@semihalf.com> References: <20231130234048.157509-1-lb@semihalf.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Add processing of argument provided to T(race) flag. The string argument determines destination of debug logs: "0" - debug logs will be written to prdbg and devdbg trace events name - debug logs will be written to trace instance pointed by name, trace instance name has to be previously opened with open command A user can provide trace destination name by following T flag with ":" and trace destination name, for example: echo "module thunderbolt =3DpT:tbt" > /dynamic_debug/control echo "module thunderbolt =3DlT:tbt,p" > /dynamic_debug/control When T flag with argument is followed by other flag then the next flag has to be preceded with ",". Signed-off-by: =C5=81ukasz Bartosik --- lib/dynamic_debug.c | 169 ++++++++++++++++++++++++++++++++++---------- 1 file changed, 132 insertions(+), 37 deletions(-) diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c index 73b6818e5fab..dbedb1139d4b 100644 --- a/lib/dynamic_debug.c +++ b/lib/dynamic_debug.c @@ -72,6 +72,7 @@ struct ddebug_iter { struct flag_settings { unsigned int flags; unsigned int mask; + unsigned int trace_dst; }; =20 #define DD_OPEN_CMD "open" @@ -85,8 +86,16 @@ struct ddebug_trace_inst { }; =20 /* - * TRACE_DST_MAX value is reserved for writing - * debug logs to trace events (prdbg, devdbg) + * When trace is enabled (T flag is set) and trace destination field + * value is not a TRACE_DST_MAX (it is reserved for trace events) + * then debug logs will be written to trace instance whose name is + * stored in inst[trace destination].name, e.g. when trace destination + * value is 2 and inst[2].name is set to tbt then debug logs will be + * written to /tracing/instances/tbt + * + * Size of inst and bmap is TRACE_DST_MAX-1 because TRACE_DST_MAX value + * is reserved as a special value of trace destination which when set + * writes debug logs to trace events (prdbg, devdbg) */ struct ddebug_trace { struct ddebug_trace_inst inst[TRACE_DST_MAX-1]; @@ -123,6 +132,72 @@ static inline unsigned int get_trace_dst(const struct = _ddebug *desc) return desc->ctrl.trace_dst; } =20 +static int find_tr_instance(const char *name) +{ + int idx; + + for_each_set_bit(idx, tr.bmap, tr.bmap_size) + if (!strcmp(tr.inst[idx].name, name)) + return idx; + + return -ENOENT; +} + +static const +char *read_T_args(const char *str, struct flag_settings *modifiers) +{ + int len, idx =3D TRACE_DST_MAX; + char *end; + + if (*(str+1) !=3D ':') + return str; + + str +=3D 2; + end =3D strchr(str, ','); + if (end && *(end + 1) =3D=3D '\0') + return NULL; + + if (end) { + len =3D end - str; + *end =3D '\0'; + } else + len =3D strlen(str); + + /* destination trace events */ + if (!strcmp(str, DD_TR_EVENT)) + goto end; + + idx =3D find_tr_instance(str); + if (idx < 0) + return NULL; +end: + modifiers->trace_dst =3D idx; + return end ? end : str + len; +} + +/* + * Maximum number of characters which are being displayed when + * printing trace instance name, longer names are truncated + */ +#define FLAG_T_ARG_LEN 24 + +char *show_T_args(struct dd_ctrl *ctrl, char *p) +{ + const char *str; + int n; + + str =3D ctrl->trace_dst =3D=3D TRACE_DST_MAX ? + DD_TR_EVENT : tr.inst[ctrl->trace_dst].name; + + n =3D snprintf(p, FLAG_T_ARG_LEN, ":%s", str); + if (n >=3D FLAG_T_ARG_LEN) { + strscpy(&p[FLAG_T_ARG_LEN-4], "...", 4); + n =3D FLAG_T_ARG_LEN - 1; + } + + return n < 0 ? p : p + n; +} + /* Return the path relative to source root */ static inline const char *trim_prefix(const char *path) { @@ -134,9 +209,18 @@ static inline const char *trim_prefix(const char *path) return path + skip; } =20 -static const struct { unsigned flag:8; char opt_char; } opt_array[] =3D { +typedef const char* (*read_flag_args_f)(const char *, struct flag_settings= *); +typedef char* (*show_flag_args_f)(struct dd_ctrl *, char *); + +static const struct +{ + unsigned flag:8; + char opt_char; + read_flag_args_f read_args; + show_flag_args_f show_args; +} opt_array[] =3D { { _DPRINTK_FLAGS_PRINTK, 'p' }, - { _DPRINTK_FLAGS_TRACE, 'T' }, + { _DPRINTK_FLAGS_TRACE, 'T', read_T_args, show_T_args}, { _DPRINTK_FLAGS_INCL_MODNAME, 'm' }, { _DPRINTK_FLAGS_INCL_FUNCNAME, 'f' }, { _DPRINTK_FLAGS_INCL_SOURCENAME, 's' }, @@ -145,22 +229,30 @@ static const struct { unsigned flag:8; char opt_char;= } opt_array[] =3D { { _DPRINTK_FLAGS_NONE, '_' }, }; =20 -struct flagsbuf { char buf[ARRAY_SIZE(opt_array)+1]; }; +struct ctrlbuf { char buf[ARRAY_SIZE(opt_array)+FLAG_T_ARG_LEN+1]; }; =20 /* format a string into buf[] which describes the _ddebug's flags */ -static char *ddebug_describe_flags(unsigned int flags, struct flagsbuf *fb) +static char *ddebug_describe_ctrl(struct dd_ctrl *ctrl, struct ctrlbuf *cb) { - char *p =3D fb->buf; + show_flag_args_f show_args =3D NULL; + char *p =3D cb->buf; int i; =20 for (i =3D 0; i < ARRAY_SIZE(opt_array); ++i) - if (flags & opt_array[i].flag) + if (ctrl->flags & opt_array[i].flag) { + if (show_args) + *p++ =3D ','; *p++ =3D opt_array[i].opt_char; - if (p =3D=3D fb->buf) + show_args =3D opt_array[i].show_args; + if (show_args) + p =3D show_args(ctrl, p); + } + + if (p =3D=3D cb->buf) *p++ =3D '_'; *p =3D '\0'; =20 - return fb->buf; + return cb->buf; } =20 #define vnpr_info(lvl, fmt, ...) \ @@ -219,17 +311,6 @@ static bool validate_tr_name(const char *str) return true; } =20 -static int find_tr_instance(const char *name) -{ - int idx; - - for_each_set_bit(idx, tr.bmap, tr.bmap_size) - if (!strcmp(tr.inst[idx].name, name)) - return idx; - - return -ENOENT; -} - static int handle_tr_opend_cmd(const char *arg) { struct ddebug_trace_inst *inst; @@ -387,7 +468,7 @@ static struct ddebug_class_map *ddebug_find_valid_class= (struct ddebug_table cons * Search the tables for _ddebug's which match the given `query' and * apply the `flags' and `mask' to them. Returns number of matching * callsites, normally the same as number of changes. If verbose, - * logs the changes. Takes ddebug_lock. + * logs the changes. */ static int ddebug_change(const struct ddebug_query *query, struct flag_settings *modifiers) @@ -395,13 +476,12 @@ static int ddebug_change(const struct ddebug_query *q= uery, int i; struct ddebug_table *dt; unsigned int nfound =3D 0; + struct ctrlbuf cbuf, nbuf; struct dd_ctrl nctrl =3D {0}; - struct flagsbuf fbuf, nbuf; struct ddebug_class_map *map =3D NULL; int __outvar valid_class; =20 /* search for matching ddebugs */ - mutex_lock(&ddebug_lock); list_for_each_entry(dt, &ddebug_tables, link) { =20 /* match against the module name */ @@ -462,7 +542,8 @@ static int ddebug_change(const struct ddebug_query *que= ry, nfound++; =20 nctrl.flags =3D (get_flags(dp) & modifiers->mask) | modifiers->flags; - if (!memcmp(&nctrl, get_ctrl(dp), sizeof(struct dd_ctrl))) + nctrl.trace_dst =3D modifiers->trace_dst; + if (!memcmp(&nctrl, get_ctrl(dp), sizeof(nctrl))) continue; #ifdef CONFIG_JUMP_LABEL if (get_flags(dp) & _DPRINTK_FLAGS_ENABLED) { @@ -475,13 +556,12 @@ static int ddebug_change(const struct ddebug_query *q= uery, v4pr_info("changed %s:%d [%s]%s %s =3D> %s\n", trim_prefix(dp->filename), dp->lineno, dt->mod_name, dp->function, - ddebug_describe_flags(get_flags(dp), &fbuf), - ddebug_describe_flags(nctrl.flags, &nbuf)); + ddebug_describe_ctrl(&dp->ctrl, &cbuf), + ddebug_describe_ctrl(&nctrl, &nbuf)); update_tr_dst(dp, &nctrl); set_ctrl(dp, &nctrl); } } - mutex_unlock(&ddebug_lock); =20 if (!nfound && verbose) pr_info("no matches for query\n"); @@ -702,6 +782,7 @@ static int ddebug_parse_query(char *words[], int nwords, */ static int ddebug_parse_flags(const char *str, struct flag_settings *modif= iers) { + read_flag_args_f read_args; int op, i; =20 switch (*str) { @@ -720,6 +801,12 @@ static int ddebug_parse_flags(const char *str, struct = flag_settings *modifiers) for (i =3D ARRAY_SIZE(opt_array) - 1; i >=3D 0; i--) { if (*str =3D=3D opt_array[i].opt_char) { modifiers->flags |=3D opt_array[i].flag; + read_args =3D opt_array[i].read_args; + if (read_args) { + str =3D read_args(str, modifiers); + if (!str) + return -EINVAL; + } break; } } @@ -728,7 +815,7 @@ static int ddebug_parse_flags(const char *str, struct f= lag_settings *modifiers) return -EINVAL; } } - v3pr_info("flags=3D0x%x\n", modifiers->flags); + v3pr_info("flags=3D0x%x, trace dest=3D0x%x\n", modifiers->flags, modifier= s->trace_dst); =20 /* calculate final flags, mask based upon op */ switch (op) { @@ -767,20 +854,28 @@ static int ddebug_exec_query(char *query_string, cons= t char *modname) if (is_ddebug_cmd(words[0])) return ddebug_parse_cmd(words, nwords-1); =20 - /* check flags 1st (last arg) so query is pairs of spec,val */ - if (ddebug_parse_flags(words[nwords-1], &modifiers)) { - pr_err("flags parse failed\n"); - return -EINVAL; - } if (ddebug_parse_query(words, nwords-1, &query, modname)) { pr_err("query parse failed\n"); return -EINVAL; } + + mutex_lock(&ddebug_lock); + + /* check flags 1st (last arg) so query is pairs of spec,val */ + if (ddebug_parse_flags(words[nwords-1], &modifiers)) { + pr_err("flags parse failed\n"); + goto err; + } + /* actually go and implement the change */ nfound =3D ddebug_change(&query, &modifiers); - vpr_info_dq(&query, nfound ? "applied" : "no-match"); =20 + mutex_unlock(&ddebug_lock); + vpr_info_dq(&query, nfound ? "applied" : "no-match"); return nfound; +err: + mutex_unlock(&ddebug_lock); + return -EINVAL; } =20 /* handle multiple queries in query string, continue on error, return @@ -1470,7 +1565,7 @@ static int ddebug_proc_show(struct seq_file *m, void = *p) { struct ddebug_iter *iter =3D m->private; struct _ddebug *dp =3D p; - struct flagsbuf flags; + struct ctrlbuf cbuf; char const *class; =20 if (p =3D=3D SEQ_START_TOKEN) { @@ -1482,7 +1577,7 @@ static int ddebug_proc_show(struct seq_file *m, void = *p) seq_printf(m, "%s:%u [%s]%s =3D%s \"", trim_prefix(dp->filename), dp->lineno, iter->table->mod_name, dp->function, - ddebug_describe_flags(get_flags(dp), &flags)); + ddebug_describe_ctrl(&dp->ctrl, &cbuf)); seq_escape_str(m, dp->format, ESCAPE_SPACE, "\t\r\n\""); seq_puts(m, "\""); =20 --=20 2.43.0.rc2.451.g8631bc7472-goog From nobody Tue Dec 16 12:21:33 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id EE6E9C4167B for ; Thu, 30 Nov 2023 23:44:37 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1377315AbjK3Xo3 (ORCPT ); Thu, 30 Nov 2023 18:44:29 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:53520 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1377312AbjK3Xo0 (ORCPT ); Thu, 30 Nov 2023 18:44:26 -0500 Received: from mail-ed1-x532.google.com (mail-ed1-x532.google.com [IPv6:2a00:1450:4864:20::532]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 12102273E for ; Thu, 30 Nov 2023 15:42:30 -0800 (PST) Received: by mail-ed1-x532.google.com with SMTP id 4fb4d7f45d1cf-54af0eca12dso1725885a12.3 for ; Thu, 30 Nov 2023 15:42:30 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=semihalf.com; s=google; t=1701387726; x=1701992526; 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=CZCaekCz8eMIOK0XDrrl6u8KojrpBKq+vfvAetYMtgo=; b=scN+XWlPEiAjkFLsMrdBqXdOpt93D5k6Q2sz+hzNQmWJUZAorHAvjpuFKY22+cfq5R ikIXYIT6hRQZYfyh49Xy42ey+NNvubmPXNqiuv86Z7ZKK/Fu3tgApvb7QbAO/3+tq6i2 ZGFIs6WrUccedCNCcNhRMZoHw2qAychRaMp64WUF0vYzg+n1y2raYMEFOqgNttWSTO1c yg0epIMA2yrI+7V4piOrzz3aYAqIaK6OTv1okbttlYmYGPTH1E84IpF3uC65R/qouExM L8LBJd1/Il5GIMD1WjXXBmIAH0eWTxGOGVHNMpac5euVXH6swUkxxuSrur/fwtkRLt79 pZFg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1701387726; x=1701992526; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=CZCaekCz8eMIOK0XDrrl6u8KojrpBKq+vfvAetYMtgo=; b=V3jKWq5nrQEGWrvb/2V8M8Ve5oWXUm9xqC1YFtiZY+FcCKOujkNB6SZF74eV1ueTfA KoxT5LV13NWv/ZQEgj/yW8uf6PTPXz7LRVZeLu/9u/rwXkoZezyBS56RUxib7Mb4HTgq y/tHNh+kTiFIXOmmRsNtufNNcr5Ai61KEYjliw2i6TnQ91bNS6i/yNrp/qA82pVO7MN8 FKO4PQkSOwBm+7f+RilPFqNCtY3KLPzmC3shfbC31/aZBjyPJ9ZMDTQMFrLk38H9Bb1t 1kuCaAF2FL6zKSrkK2eU/8+zpbGC4Qaa1Z7tv8zz1vr9e2YqmjvE+b7k0mIeVWiAhTVw 9fIA== X-Gm-Message-State: AOJu0YwfyHttKSLVRGwe5XO++f3sdxg6hDYf4oq01umxdJjF1nACrxyC 9Zv+kPE75zZP+gX7zv9BvFik X-Google-Smtp-Source: AGHT+IEYSE3eOSyakC/Xuef7ERk8ey75vW5N+7kOclB3Y7EbtGkg+iFaebZcVdtBwrrlBCPyIkHWZQ== X-Received: by 2002:a17:906:814:b0:a19:a19a:eab0 with SMTP id e20-20020a170906081400b00a19a19aeab0mr205379ejd.105.1701387726490; Thu, 30 Nov 2023 15:42:06 -0800 (PST) Received: from ukaszb-l.semihalf.net (public-gprs368940.centertel.pl. [37.47.72.109]) by smtp.gmail.com with ESMTPSA id 9-20020a170906100900b009ddaf5ebb6fsm1210175ejm.177.2023.11.30.15.42.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 30 Nov 2023 15:42:06 -0800 (PST) From: =?UTF-8?q?=C5=81ukasz=20Bartosik?= To: Jason Baron , Jim Cromie , Andrew Morton , Kees Cook , Douglas Anderson Cc: Guenter Roeck , Yaniv Tzoreff , Benson Leung , Steven Rostedt , Vincent Whitchurch , Pekka Paalanen , Sean Paul , Daniel Vetter , linux-kernel@vger.kernel.org, upstream@semihalf.com Subject: [PATCH v2 13/15] dyndbg: add support for default trace destination Date: Fri, 1 Dec 2023 00:40:46 +0100 Message-ID: <20231130234048.157509-14-lb@semihalf.com> X-Mailer: git-send-email 2.43.0.rc2.451.g8631bc7472-goog In-Reply-To: <20231130234048.157509-1-lb@semihalf.com> References: <20231130234048.157509-1-lb@semihalf.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Instead of repeating trace destination name explicitly for each command (e.g. +T:thunderbolt), this change saves previously used trace destination provided to [=3D+-]T as default and consecutive commands which don't provide trace destination explicitly will usa the saved trace destination. Signed-off-by: =C5=81ukasz Bartosik --- lib/dynamic_debug.c | 86 ++++++++++++++++++++++++++++++++++++++------- 1 file changed, 73 insertions(+), 13 deletions(-) diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c index dbedb1139d4b..ae05b3728520 100644 --- a/lib/dynamic_debug.c +++ b/lib/dynamic_debug.c @@ -101,6 +101,9 @@ struct ddebug_trace { struct ddebug_trace_inst inst[TRACE_DST_MAX-1]; DECLARE_BITMAP(bmap, TRACE_DST_MAX-1); int bmap_size; +#define DST_NOT_SET (-1) +#define DST_NOT_SET_STR "not set" + int default_dst; }; =20 static DEFINE_MUTEX(ddebug_lock); @@ -110,7 +113,8 @@ module_param(verbose, int, 0644); MODULE_PARM_DESC(verbose, " dynamic_debug/control processing " "( 0 =3D off (default), 1 =3D module add/rm, 2 =3D >control summary, 3 = =3D parsing, 4 =3D per-site changes)"); =20 -static struct ddebug_trace tr =3D { .bmap_size =3D TRACE_DST_MAX-1 }; +static struct ddebug_trace tr =3D { .bmap_size =3D TRACE_DST_MAX-1, + .default_dst =3D DST_NOT_SET, }; =20 static inline struct dd_ctrl *get_ctrl(struct _ddebug *desc) { @@ -132,6 +136,11 @@ static inline unsigned int get_trace_dst(const struct = _ddebug *desc) return desc->ctrl.trace_dst; } =20 +static inline bool has_tr_default_dst(void) +{ + return tr.default_dst !=3D DST_NOT_SET; +} + static int find_tr_instance(const char *name) { int idx; @@ -146,11 +155,16 @@ static int find_tr_instance(const char *name) static const char *read_T_args(const char *str, struct flag_settings *modifiers) { - int len, idx =3D TRACE_DST_MAX; - char *end; + bool has_colon =3D *(str+1) =3D=3D ':' ? true : false; + int len =3D 0, idx =3D TRACE_DST_MAX; + char *end =3D NULL; =20 - if (*(str+1) !=3D ':') - return str; + if (!has_colon) { + if (!has_tr_default_dst()) + return NULL; + idx =3D tr.default_dst; + goto end; + } =20 str +=3D 2; end =3D strchr(str, ','); @@ -168,8 +182,12 @@ char *read_T_args(const char *str, struct flag_setting= s *modifiers) goto end; =20 idx =3D find_tr_instance(str); - if (idx < 0) - return NULL; + if (idx < 0) { + if (!has_tr_default_dst() || + has_colon) + return NULL; + idx =3D tr.default_dst; + } end: modifiers->trace_dst =3D idx; return end ? end : str + len; @@ -387,6 +405,13 @@ static int handle_tr_close_cmd(const char *arg) goto end; } =20 + /* + * check if default trace instance is being closed, + * if yes then clear default destination + */ + if (tr.default_dst =3D=3D idx) + tr.default_dst =3D DST_NOT_SET; + trace_array_put(inst->arr); /* * don't destroy trace instance but let user do it manually @@ -427,6 +452,32 @@ void update_tr_dst(const struct _ddebug *desc, const s= truct dd_ctrl *nctrl) tr.inst[ndst].use_cnt++; } =20 +static const char *get_tr_default_dst_str(void) +{ + switch (tr.default_dst) { + case DST_NOT_SET: + return DST_NOT_SET_STR; + case TRACE_DST_MAX: + return DD_TR_EVENT; + default: + return tr.inst[tr.default_dst].name; + } +} + +static void update_tr_default_dst(const struct flag_settings *modifiers) +{ + if (tr.default_dst =3D=3D modifiers->trace_dst) + return; + + if ((!modifiers->flags && (~modifiers->mask & _DPRINTK_FLAGS_TRACE)) || + (modifiers->flags & _DPRINTK_FLAGS_TRACE)) { + + tr.default_dst =3D modifiers->trace_dst; + v3pr_info("set default trace dst to idx=3D%d, name=3D%s\n", + tr.default_dst, get_tr_default_dst_str()); + } +} + static int ddebug_parse_cmd(char *words[], int nwords) { int ret; @@ -566,6 +617,9 @@ static int ddebug_change(const struct ddebug_query *que= ry, if (!nfound && verbose) pr_info("no matches for query\n"); =20 + if (nfound) + update_tr_default_dst(modifiers); + return nfound; } =20 @@ -1590,14 +1644,20 @@ static int ddebug_proc_show(struct seq_file *m, voi= d *p) } seq_puts(m, "\n"); =20 - if (ddebug_iter_is_last(iter) && - !bitmap_empty(tr.bmap, tr.bmap_size)) { - int idx; + if (ddebug_iter_is_last(iter)) { =20 seq_puts(m, "\n"); - seq_puts(m, "Opened trace instances:\n"); - for_each_set_bit(idx, tr.bmap, tr.bmap_size) - seq_printf(m, "%s\n", tr.inst[idx].name); + seq_printf(m, "Default trace destination: %s\n", + get_tr_default_dst_str()); + + if (!bitmap_empty(tr.bmap, tr.bmap_size)) { + int idx; + + seq_puts(m, "\n"); + seq_puts(m, "Opened trace instances:\n"); + for_each_set_bit(idx, tr.bmap, tr.bmap_size) + seq_printf(m, "%s\n", tr.inst[idx].name); + } } =20 return 0; --=20 2.43.0.rc2.451.g8631bc7472-goog From nobody Tue Dec 16 12:21:33 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 93395C4167B for ; Thu, 30 Nov 2023 23:45:06 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1377292AbjK3Xo5 (ORCPT ); Thu, 30 Nov 2023 18:44:57 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36118 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1377302AbjK3Xoy (ORCPT ); Thu, 30 Nov 2023 18:44:54 -0500 Received: from mail-lj1-x229.google.com (mail-lj1-x229.google.com [IPv6:2a00:1450:4864:20::229]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 5975C2D61 for ; Thu, 30 Nov 2023 15:42:34 -0800 (PST) Received: by mail-lj1-x229.google.com with SMTP id 38308e7fff4ca-2c9c4df1287so20619761fa.2 for ; Thu, 30 Nov 2023 15:42:34 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=semihalf.com; s=google; t=1701387733; x=1701992533; 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=KhfAqA+0zx3rIVvOFQAX3/ztaO69KpdJ+hg2RHJWvzk=; b=c8ncx3GBqw9KndPcCRYJc/Bu0MGSN6PQREwX+L1mVOMBMazdpU9F6O1lVWy1R+1SO9 KFeMRTb+vHmn+3LxvnJU361JzlhbqAZGm3tp1jdDO76eGMil8wHXX9GZ7avulmZTD6Cg rK8vsO+cOgdT/JBPMtSDsXEH8DeNZqiK1+E1wJJLLELTHjlQLq0+d8kCmuAgML0+hBOk zgBbwR9Y1AB6P+OVwzvIgJLhTv5+FNhN/NVRYzORcPVkqEs492hXQO61ee/mpjqGttkV h0b/Ki6yA69VDc4M9HHujPwXJZ+nFvcA5wPZQs41QHlAD1KYDHElViLOCR/ipGwBXuiF mTgw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1701387733; x=1701992533; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=KhfAqA+0zx3rIVvOFQAX3/ztaO69KpdJ+hg2RHJWvzk=; b=uQ9+OrFq4ZzFVvN1Iv+wMBxuGb2Bmn200mFS8nsRYUG4Xqhul9iP/cg44mG5GxGqHd YNF/T8ssjme/7loX5fz+JM3R0b1KmopWBBUwRK2x1EJzXNHpOb5pNa6lfoSh8iB/ubX0 rxDRFw9spntxZUc2mskNa3WFOteaEzwdsD/SOXECsFCI9UgX0XTgBGxNkEk2l5aMzQyB lpHdJwKqwKW/KsnqZB3NL8d+AnUC7swLPqCCHf6hFqBp9p3x46cMJbh5HhFOnEdvMbwD HDWt/5PmWuinc0aCMp91j7iuLs7rz4kctT4fULaOuE5jz5Q6B8XUQ0X29Q5sLEj2Wvbb SQgQ== X-Gm-Message-State: AOJu0YyTktRgqiYCWoueAL9IpGnCouEgHrZTYn3LMqA/EjaLusioxr+3 rJUCPZc1AzrxFXbR7ZLM/uNx X-Google-Smtp-Source: AGHT+IFOMJOjzqkHrGjznFae75gAztoVl98Zwya1R25i+O4APL7YKu/Vlb7hQ1Hub8r/p9Ommz/W8Q== X-Received: by 2002:a2e:4949:0:b0:2c9:d874:20dc with SMTP id b9-20020a2e4949000000b002c9d87420dcmr193433ljd.102.1701387733098; Thu, 30 Nov 2023 15:42:13 -0800 (PST) Received: from ukaszb-l.semihalf.net (public-gprs368940.centertel.pl. [37.47.72.109]) by smtp.gmail.com with ESMTPSA id 9-20020a170906100900b009ddaf5ebb6fsm1210175ejm.177.2023.11.30.15.42.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 30 Nov 2023 15:42:12 -0800 (PST) From: =?UTF-8?q?=C5=81ukasz=20Bartosik?= To: Jason Baron , Jim Cromie , Andrew Morton , Kees Cook , Douglas Anderson Cc: Guenter Roeck , Yaniv Tzoreff , Benson Leung , Steven Rostedt , Vincent Whitchurch , Pekka Paalanen , Sean Paul , Daniel Vetter , linux-kernel@vger.kernel.org, upstream@semihalf.com Subject: [PATCH v2 14/15] dyndbg: write debug logs to trace instance Date: Fri, 1 Dec 2023 00:40:47 +0100 Message-ID: <20231130234048.157509-15-lb@semihalf.com> X-Mailer: git-send-email 2.43.0.rc2.451.g8631bc7472-goog In-Reply-To: <20231130234048.157509-1-lb@semihalf.com> References: <20231130234048.157509-1-lb@semihalf.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org When trace is enabled (T flag is set) and trace destination field is set to a value in range [0..62] (TRACE_DST_MAX(63) is reserved for writing to trace events) then debug logs will be written to a trace instance pointed by inst[trace destination].name, e.g. when trace destination value is 2 and inst[2].name is set to tbt then debug logs will be written to /tracing/instances/tbt instance. Before using trace instance as a destination for writing debug logs it has to be explicitly opened with open command. Signed-off-by: =C5=81ukasz Bartosik --- lib/dynamic_debug.c | 32 ++++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c index ae05b3728520..afcc536c2e91 100644 --- a/lib/dynamic_debug.c +++ b/lib/dynamic_debug.c @@ -141,6 +141,11 @@ static inline bool has_tr_default_dst(void) return tr.default_dst !=3D DST_NOT_SET; } =20 +static inline bool is_tr_event_dst(const struct _ddebug *desc) +{ + return desc->ctrl.trace_dst =3D=3D TRACE_DST_MAX; +} + static int find_tr_instance(const char *name) { int idx; @@ -1251,8 +1256,8 @@ static DEFINE_PER_CPU(struct ddebug_trace_bufs, ddebu= g_trace_bufs); static DEFINE_PER_CPU(int, ddebug_trace_reserve); =20 __printf(3, 0) -static void ddebug_trace(struct _ddebug *desc, const struct device *dev, - const char *fmt, va_list args) +static void ddebug_trace_event(struct _ddebug *desc, const struct device *= dev, + const char *fmt, va_list args) { struct ddebug_trace_buf *buf; int bufidx; @@ -1283,6 +1288,18 @@ static void ddebug_trace(struct _ddebug *desc, const= struct device *dev, preempt_enable_notrace(); } =20 +__printf(2, 0) +static void ddebug_trace_instance(struct _ddebug *desc, const char *fmt, + va_list *args) +{ + struct va_format vaf =3D { .fmt =3D fmt, .va =3D args}; + struct trace_array *arr =3D tr.inst[get_trace_dst(desc)].arr; + + WARN_ON_ONCE(!arr); + + trace_array_printk(arr, 0, "%pV", &vaf); +} + __printf(2, 3) static void ddebug_printk(struct _ddebug *desc, const char *fmt, ...) { @@ -1295,7 +1312,11 @@ static void ddebug_printk(struct _ddebug *desc, cons= t char *fmt, ...) * All callers include the KERN_DEBUG prefix to keep the * vprintk case simple; strip it out for tracing. */ - ddebug_trace(desc, NULL, fmt + strlen(KERN_DEBUG), args); + if (is_tr_event_dst(desc)) + ddebug_trace_event(desc, NULL, + fmt + strlen(KERN_DEBUG), args); + else + ddebug_trace_instance(desc, fmt, &args); va_end(args); } =20 @@ -1317,7 +1338,10 @@ static void ddebug_dev_printk(struct _ddebug *desc, = const struct device *dev, va_list args; =20 va_start(args, fmt); - ddebug_trace(desc, dev, fmt, args); + if (is_tr_event_dst(desc)) + ddebug_trace_event(desc, dev, fmt, args); + else + ddebug_trace_instance(desc, fmt, &args); va_end(args); } =20 --=20 2.43.0.rc2.451.g8631bc7472-goog From nobody Tue Dec 16 12:21:33 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 3E135C4167B for ; Thu, 30 Nov 2023 23:43:19 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1377307AbjK3XnK (ORCPT ); Thu, 30 Nov 2023 18:43:10 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:35712 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1377277AbjK3XnJ (ORCPT ); Thu, 30 Nov 2023 18:43:09 -0500 Received: from mail-lf1-x134.google.com (mail-lf1-x134.google.com [IPv6:2a00:1450:4864:20::134]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D1AF22D73 for ; Thu, 30 Nov 2023 15:42:36 -0800 (PST) Received: by mail-lf1-x134.google.com with SMTP id 2adb3069b0e04-50bca79244fso2171942e87.3 for ; Thu, 30 Nov 2023 15:42:36 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=semihalf.com; s=google; t=1701387737; x=1701992537; 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=bAxdVKRV7B/lxV4lDmwYdRUAU2qmKuUmSjMzK6aeeaI=; b=Kl9B17I4boh5b08Kg7UbT9j6Ldfo/dMiDTDhpRmGcnV9Q+MJl2BJwxrJfWidx9eB4k CeGJKLnOTVcK/qRVUfuYP/m16COuEDkmhYWvjxIFkasSaU+kXalJKt/ORqqlivwFGfg5 yDL0WTExruLQu79kxDhtayfay8qqM4N3M6Xkye8B/dTVnk3fkz5wae9w88q/o2U3+O4l IxAY8rh9STndJ+TNL3Q8UdvFPpIivEyLy3GvFt+ePHdITgqx9Y4fbp/f+OcX2aKPe/za MxRp7CxMd768cRVRQQ8EPOo7L5uUkTN+wpBDaawDAoo7lMGTc6pQfH24Id4P/p13FeC3 Ci+Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1701387737; x=1701992537; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=bAxdVKRV7B/lxV4lDmwYdRUAU2qmKuUmSjMzK6aeeaI=; b=udlgMunaWoljGxDctNM1ERHaOTetYnRNPc+Qk9fjQRhOC4aiqDj1/X9B6iu2D6YDDn tzY5y8hTMcVjSTDWd35wqylTXD9LsanB9KIwX1BVIK1hwHR2vow+oRLronVRTzfHxlWO fmP9+WjrKM1iXdfm/6evfy99x0vrBSHh5wao1ilUQ7uCavD8uz1qwBGrzyyL5Yz7lrx2 O70ab9R1JB6eDuvBvejCF9X5c8qfGqdeqb2KGlc7AUvyjmsTDbxpIewEGCr24vOuk5tY 2TraqeNZfJMWg+bUJftCvhZpkev7nvjiS5xsxV3A5U0p5TQtsnPJasj3TevDyeUwAOlZ SDgw== X-Gm-Message-State: AOJu0YyM2M/Maw/xGOYtFQN4LI+VDOeMcdItpB6yViv+qsl/FL5wCTkp nYo/e5HOzqLbQJug0iSczyhv X-Google-Smtp-Source: AGHT+IGEBpsoqxNnPCaOLOCImppjHglDtpfgNOSv+MAtgGPUUibigOkvU9x/HJWWdhG6F6aYc0CV4A== X-Received: by 2002:a19:f014:0:b0:50b:d764:76d0 with SMTP id p20-20020a19f014000000b0050bd76476d0mr152044lfc.95.1701387737270; Thu, 30 Nov 2023 15:42:17 -0800 (PST) Received: from ukaszb-l.semihalf.net (public-gprs368940.centertel.pl. [37.47.72.109]) by smtp.gmail.com with ESMTPSA id 9-20020a170906100900b009ddaf5ebb6fsm1210175ejm.177.2023.11.30.15.42.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 30 Nov 2023 15:42:16 -0800 (PST) From: =?UTF-8?q?=C5=81ukasz=20Bartosik?= To: Jason Baron , Jim Cromie , Andrew Morton , Kees Cook , Douglas Anderson Cc: Guenter Roeck , Yaniv Tzoreff , Benson Leung , Steven Rostedt , Vincent Whitchurch , Pekka Paalanen , Sean Paul , Daniel Vetter , linux-kernel@vger.kernel.org, upstream@semihalf.com Subject: [PATCH v2 15/15] dyndbg: add support for hex_dump output to trace Date: Fri, 1 Dec 2023 00:40:48 +0100 Message-ID: <20231130234048.157509-16-lb@semihalf.com> X-Mailer: git-send-email 2.43.0.rc2.451.g8631bc7472-goog In-Reply-To: <20231130234048.157509-1-lb@semihalf.com> References: <20231130234048.157509-1-lb@semihalf.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Add support for writing hex_dump debug logs to trace. Signed-off-by: =C5=81ukasz Bartosik --- include/linux/dynamic_debug.h | 16 ++++++++++------ lib/dynamic_debug.c | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 6 deletions(-) diff --git a/include/linux/dynamic_debug.h b/include/linux/dynamic_debug.h index 5555857d9ba5..08d8d951e41d 100644 --- a/include/linux/dynamic_debug.h +++ b/include/linux/dynamic_debug.h @@ -300,12 +300,16 @@ void __dynamic_ibdev_dbg(struct _ddebug *descriptor, _dynamic_func_call(fmt, __dynamic_ibdev_dbg, \ dev, fmt, ##__VA_ARGS__) =20 -#define dynamic_hex_dump(prefix_str, prefix_type, rowsize, \ - groupsize, buf, len, ascii) \ - _dynamic_func_call_no_desc(__builtin_constant_p(prefix_str) ? prefix_str = : "hexdump", \ - print_hex_dump, \ - KERN_DEBUG, prefix_str, prefix_type, \ - rowsize, groupsize, buf, len, ascii) +void _print_hex_dump(struct _ddebug *descriptor, const char *level, + const char *prefix_str, int prefix_type, int rowsize, + int groupsize, const void *buf, size_t len, bool ascii); + +#define dynamic_hex_dump(prefix_str, prefix_type, rowsize, \ + groupsize, buf, len, ascii) \ + _dynamic_func_call(__builtin_constant_p(prefix_str) ? prefix_str : "hexdu= mp", \ + _print_hex_dump, \ + 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 { \ diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c index afcc536c2e91..71db40df31b2 100644 --- a/lib/dynamic_debug.c +++ b/lib/dynamic_debug.c @@ -1354,6 +1354,41 @@ static void ddebug_dev_printk(struct _ddebug *desc, = const struct device *dev, } } =20 +void _print_hex_dump(struct _ddebug *descriptor, const char *level, + const char *prefix_str, int prefix_type, int rowsize, + int groupsize, const void *buf, size_t len, bool ascii) +{ + const u8 *ptr =3D buf; + int i, linelen, remaining =3D len; + unsigned char linebuf[32 * 3 + 2 + 32 + 1]; + + if (rowsize !=3D 16 && rowsize !=3D 32) + rowsize =3D 16; + + for (i =3D 0; i < len; i +=3D rowsize) { + linelen =3D min(remaining, rowsize); + remaining -=3D rowsize; + + hex_dump_to_buffer(ptr + i, linelen, rowsize, groupsize, + linebuf, sizeof(linebuf), ascii); + + switch (prefix_type) { + case DUMP_PREFIX_ADDRESS: + ddebug_printk(descriptor, "%s%s%p: %s\n", + level, prefix_str, ptr + i, linebuf); + break; + case DUMP_PREFIX_OFFSET: + ddebug_printk(descriptor, "%s%s%.8x: %s\n", + level, prefix_str, i, linebuf); + break; + default: + ddebug_printk(descriptor, "%s%s%s\n", + level, prefix_str, linebuf); + break; + } + } +} + void __dynamic_pr_debug(struct _ddebug *descriptor, const char *fmt, ...) { va_list args; --=20 2.43.0.rc2.451.g8631bc7472-goog