From patchwork Tue Jun 13 13:55:37 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Steven Rostedt X-Patchwork-Id: 107399 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:994d:0:b0:3d9:f83d:47d9 with SMTP id k13csp573315vqr; Tue, 13 Jun 2023 07:09:29 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ5H5IeRBLL80ek/XzpUgKIYeZxasWpDj1hJrgoYG4qc4B4+XCe34vzwwL7vgfYviggSZOfS X-Received: by 2002:a17:902:9a0b:b0:1b2:1a79:147d with SMTP id v11-20020a1709029a0b00b001b21a79147dmr8873108plp.2.1686665368859; Tue, 13 Jun 2023 07:09:28 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1686665368; cv=none; d=google.com; s=arc-20160816; b=eMwtGwNZ9xCuwWKWhYlHVvxWZe09aVxnavGctTQAW6/zXi20EMInt6j/Xrc8h9sQgZ Vm1WlYLhazH1inXoIbPDGz9AIrqYn/1nUFiAzxXszOiuxNFQxuptU717BsltIZXhwY3g /dl17b+RrupuXapT9d7Dib/zu50loBQFrdjy+pbWDhsRdvNQ+yacNoj9oBdWfPu31Eve tPMXNoKEZl+TTxF/UxDeiPKrDcQSx2+vGyZp2aPvyzRxWUV3j+CDbLdHMZny73l8s8bk JTXoeG27AghQ/ev5loLXYWzFuGXIN4/w3t3TXwyLc3LMMsYPxinQmO2Z9DvzG9hrnuGm kc2g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :message-id:subject:cc:to:from:date; bh=3ooBtbwwYpfZeDhrnXdhq+iuxq0kgL+zcK5vdm95m+k=; b=olP1+B0SJGKnGhpsSFrmLYtFu0xiHfdJpr070cuZv75/wpy8wuGA8wSBRlo2zGilbr fpOn0IFOcWeslhc92T5FSoUBbQ8BirFyYISKlwE1I7MCJqa4ARL312vdPkN16C9NxysO 3ijTl/YzhUawssXwuXJV2YcEZiBji/AYXRSntWjfGkjm0pULuzd2Y2WL0ltwKkpyofdn pqN0xUyJ5HK6EF4EY199BkV67AkAhM3d5J9hoipjSWHsX3ZTFuxpwaty49coekFfb2DM JMPAVTdbQoXubjPHkoUd6ib+kRG1+ynpKUZXGDk+w2tqnvwt9EUGmqrjJmMhTXH/C9vJ 2/JQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id f16-20020a170902ce9000b001b205a14113si9255256plg.386.2023.06.13.07.09.13; Tue, 13 Jun 2023 07:09:28 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S238087AbjFMNzn (ORCPT + 99 others); Tue, 13 Jun 2023 09:55:43 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54234 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233859AbjFMNzl (ORCPT ); Tue, 13 Jun 2023 09:55:41 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [IPv6:2604:1380:4641:c500::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 4BBD4A6; Tue, 13 Jun 2023 06:55:40 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id D44C063149; Tue, 13 Jun 2023 13:55:39 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id B2F6AC433D9; Tue, 13 Jun 2023 13:55:38 +0000 (UTC) Date: Tue, 13 Jun 2023 09:55:37 -0400 From: Steven Rostedt To: LKML , Linux Trace Kernel Cc: Masami Hiramatsu , Mark Rutland Subject: [PATCH v2] tracing: Add a debug_trace_printk() function Message-ID: <20230613095537.0ecf2459@gandalf.local.home> X-Mailer: Claws Mail 3.17.8 (GTK+ 2.24.33; x86_64-pc-linux-gnu) MIME-Version: 1.0 X-Spam-Status: No, score=-4.0 required=5.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,RCVD_IN_DNSWL_MED,SPF_HELO_NONE,SPF_PASS, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1768596825885134028?= X-GMAIL-MSGID: =?utf-8?q?1768596825885134028?= From: "Steven Rostedt (Google)" While doing some tracing and kernel debugging, I found that some of my trace_printk()s were being lost in the noise of the other code that was being traced. Having a way to write trace_printk() not in the top level trace buffer would have been useful. There was also a time I needed to debug ftrace itself, where trace_printk() did not hit the paths that were being debugged. But because the trace that was being debugged, was going into the top level ring buffer, it was causing issues for seeing what is to be traced. To solve both of the above, add a debug_trace_printk() that can be used just like trace_printk() except that it goes into a "debug" instance buffer instead. This can be used at boot up as well. Signed-off-by: Steven Rostedt (Google) Reviewed-by: Masami Hiramatsu (Google) --- Changes since v1: https://lore.kernel.org/linux-trace-kernel/20230612193337.0fb0d3ca@gandalf.local.home/ - I had added a prompt to the kconfig but never committed it. It's now part of the patch. include/linux/kernel.h | 14 ++++++++++++++ kernel/trace/Kconfig | 20 ++++++++++++++++++++ kernel/trace/trace.c | 29 +++++++++++++++++++++++++++++ 3 files changed, 63 insertions(+) diff --git a/include/linux/kernel.h b/include/linux/kernel.h index 0d91e0af0125..594c9ba17fd4 100644 --- a/include/linux/kernel.h +++ b/include/linux/kernel.h @@ -432,6 +432,20 @@ __ftrace_vbprintk(unsigned long ip, const char *fmt, va_list ap); extern __printf(2, 0) int __ftrace_vprintk(unsigned long ip, const char *fmt, va_list ap); +#ifdef CONFIG_FTRACE_DEBUG_PRINT +extern __printf(2,0) void do_debug_trace_printk(unsigned long ip, const char *fmt, ...); +#define debug_trace_printk(fmt, ...) \ +do { \ + do_debug_trace_printk(_THIS_IP_, fmt, ##__VA_ARGS__); \ +} while (0) + +extern void debug_tracing_stop(void); +#else +#define debug_trace_printk(fmt, ...) do { } while (0) +static inline void debug_tracing_stop(void) { } +#endif + + extern void ftrace_dump(enum ftrace_dump_mode oops_dump_mode); #else static inline void tracing_start(void) { } diff --git a/kernel/trace/Kconfig b/kernel/trace/Kconfig index abe5c583bd59..e07bca39dec9 100644 --- a/kernel/trace/Kconfig +++ b/kernel/trace/Kconfig @@ -974,6 +974,26 @@ config GCOV_PROFILE_FTRACE Note that on a kernel compiled with this config, ftrace will run significantly slower. +config FTRACE_DEBUG_PRINT + bool "Enable debug_trace_printk()" + depends on TRACING + help + This option enables the use of debug_trace_printk() instead of + using trace_printk(). The difference between the two is that + debug_trace_printk() traces are visible in the "debug" instance + found in: + + /sys/kernel/tracing/instances/debug + + This is useful when the trace printks should not interfere with + the normal top level tracing. It is also useful if the top level + tracing is very noisy and critical trace printks are dropped. + By using debug_trace_printk() the traces goes into as separate + ring buffer that will not be overridden by other trace events. + + If unsure say N (In fact, only say Y if you are debugging a + kernel and require this) + config FTRACE_SELFTEST bool diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index 64a4dde073ef..c21a93cf5fd8 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c @@ -490,6 +490,10 @@ static struct trace_array global_trace = { .trace_flags = TRACE_DEFAULT_FLAGS, }; +#ifdef CONFIG_FTRACE_DEBUG_PRINT +static struct trace_array *debug_trace; +#endif + LIST_HEAD(ftrace_trace_arrays); int trace_array_get(struct trace_array *this_tr) @@ -10455,8 +10459,33 @@ void __init early_trace_init(void) tracer_alloc_buffers(); init_events(); + +#ifdef CONFIG_FTRACE_DEBUG_PRINT + debug_trace = trace_array_get_by_name("debug"); + if (WARN_ON(!debug_trace)) + return; + trace_array_init_printk(debug_trace); +#endif } +#ifdef CONFIG_FTRACE_DEBUG_PRINT +__printf(2, 0) +void do_debug_trace_printk(unsigned long ip, const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + trace_array_vprintk(debug_trace, ip, fmt, ap); + va_end(ap); +} + +void debug_tracing_stop(void) +{ + debug_trace_printk("Stopping debug tracing\n"); + tracing_stop_tr(debug_trace); +} +#endif + void __init trace_init(void) { trace_event_init();