From patchwork Wed Jan 11 14:56:40 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Steven Rostedt X-Patchwork-Id: 42051 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:4e01:0:0:0:0:0 with SMTP id p1csp3368653wrt; Wed, 11 Jan 2023 07:02:45 -0800 (PST) X-Google-Smtp-Source: AMrXdXueO7T4tLYuCsO75mPgpe1QdvX2zcPjR2BfAnfkhpIW5WoOGcua6NyUUETeQRct/pdCT6bN X-Received: by 2002:a05:6402:391:b0:499:e665:867e with SMTP id o17-20020a056402039100b00499e665867emr2285760edv.42.1673449365489; Wed, 11 Jan 2023 07:02:45 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1673449365; cv=none; d=google.com; s=arc-20160816; b=dMwhs9FGz/aV9m/35DhKR1GGJ9+XxlepXBTVh1ZSejPxLSW0bc4oHvCrFmB2T75xkW l0jTUWmHGkCPUZndB93u5h2XKVxm1GInhpq3RMuFVFoJk8s6iCZ/NVSYoVFgwxZ64gyY 05edh+YeMoP1PZYstDNVj8KWfoh8dRMBamLsEGbaUrr/IwEEfiNHtRbKw3ADYOjlZY2F CyWml00evgI6EZjCqcMYXuWutnxtHa2Gzbapx6C7ZOi6HKnUtHR91Gu+UQtHCiNyLKcb /Nl1hUy/JR5ftvIMyXOJxMun0Bqv1D1zE59cunuhkY5chozCwRrjcM6QMuzX3mZci3Sd 7Y0Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:mime-version:references:subject:cc:to:from:date :user-agent:message-id; bh=QjR+UcL+8ywuP8b8BJp8iO356y5JTCjY3OS4O17MSwE=; b=aaf+RuJLrnMZBSXZuubnG4qEVD8MicVubHlzorNfzPDZunrao9Fln1shEw9cE2YR9c 5av8YoCN4OpDZdWHVzvKfD8dTVDAztenwqIm2c9RhhvXWjDNl1gIsIaUFgjvrvzym0/m m2Y1lFp9BzHifb8/Gm5j+7zt3s3m/1Gqqc8K+1BjqrKJ6UdK4fhqbIlOWJioPKWqal4/ Vzou1W0xsSapr7Da7TysvEMXQtID8Sb2ZLosAn6IaPvGeOq8N55joWieJN9NTx8OxCRy hPezeyfXaA88TAhfx6Fd0JOhKCsddQ+s+4z4hdQzj04rM5MgWJKK6Lzo0kv5H6c0CspE L9ng== 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 s16-20020aa7c550000000b00461acb2deebsi13375922edr.198.2023.01.11.07.02.19; Wed, 11 Jan 2023 07:02:45 -0800 (PST) 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 S233322AbjAKO7I (ORCPT + 99 others); Wed, 11 Jan 2023 09:59:08 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:35072 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S239513AbjAKO6q (ORCPT ); Wed, 11 Jan 2023 09:58:46 -0500 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 06CF663C6; Wed, 11 Jan 2023 06:58:45 -0800 (PST) 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 95C7E61D52; Wed, 11 Jan 2023 14:58:44 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 02AD3C433F2; Wed, 11 Jan 2023 14:58:44 +0000 (UTC) Received: from rostedt by gandalf.local.home with local (Exim 4.96) (envelope-from ) id 1pFcYs-000M8d-3B; Wed, 11 Jan 2023 09:58:42 -0500 Message-ID: <20230111145842.847715402@goodmis.org> User-Agent: quilt/0.66 Date: Wed, 11 Jan 2023 09:56:40 -0500 From: Steven Rostedt To: linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org Cc: Masami Hiramatsu , Andrew Morton , Ross Zwisler Subject: [PATCH 4/4] tracing: Allow boot instances to have snapshot buffers References: <20230111145636.450953217@goodmis.org> MIME-Version: 1.0 X-Spam-Status: No, score=-6.7 required=5.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,RCVD_IN_DNSWL_HI,SPF_HELO_NONE,SPF_PASS 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?1754738841729213867?= X-GMAIL-MSGID: =?utf-8?q?1754738841729213867?= From: "Steven Rostedt (Google)" Add to ftrace_boot_snapshot, "=" name, where the instance will get a snapshot buffer, and will take a snapshot at the end of boot (which will save the boot traces). Signed-off-by: Steven Rostedt (Google) Reviewed-by: Ross Zwisler --- .../admin-guide/kernel-parameters.txt | 9 +++ kernel/trace/trace.c | 77 +++++++++++++++++-- 2 files changed, 79 insertions(+), 7 deletions(-) diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt index 7a7f41652719..f4e87b17427f 100644 --- a/Documentation/admin-guide/kernel-parameters.txt +++ b/Documentation/admin-guide/kernel-parameters.txt @@ -1532,6 +1532,15 @@ boot up that is likely to be overridden by user space start up functionality. + Optionally, the snapshot can also be defined for a tracing + instance that was created by the trace_instance= command + line parameter. + + trace_instance=foo,sched_switch ftrace_boot_snapshot=foo + + The above will cause the "foo" tracing instance to trigger + a snapshot at the end of boot up. + ftrace_dump_on_oops[=orig_cpu] [FTRACE] will dump the trace buffers on oops. If no parameter is passed, ftrace will dump diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index 3cb9bbc0f076..d445789dc247 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c @@ -192,6 +192,9 @@ static bool snapshot_at_boot; static char boot_instance_info[COMMAND_LINE_SIZE] __initdata; static int boot_instance_index; +static char boot_snapshot_info[COMMAND_LINE_SIZE] __initdata; +static int boot_snapshot_index; + static int __init set_cmdline_ftrace(char *str) { strlcpy(bootup_tracer_buf, str, MAX_TRACER_SIZE); @@ -228,9 +231,22 @@ __setup("traceoff_on_warning", stop_trace_on_warning); static int __init boot_alloc_snapshot(char *str) { - allocate_snapshot = true; - /* We also need the main ring buffer expanded */ - ring_buffer_expanded = true; + char *slot = boot_snapshot_info + boot_snapshot_index; + int left = COMMAND_LINE_SIZE - boot_snapshot_index; + int ret; + + if (str[0] == '=') { + str++; + if (strlen(str) >= left) + return -1; + + ret = snprintf(slot, left, "%s\t", str); + boot_snapshot_index += ret; + } else { + allocate_snapshot = true; + /* We also need the main ring buffer expanded */ + ring_buffer_expanded = true; + } return 1; } __setup("alloc_snapshot", boot_alloc_snapshot); @@ -9255,10 +9271,6 @@ static int allocate_trace_buffers(struct trace_array *tr, int size) } tr->allocated_snapshot = allocate_snapshot; - /* - * Only the top level trace array gets its snapshot allocated - * from the kernel command line. - */ allocate_snapshot = false; #endif @@ -10174,6 +10186,45 @@ ssize_t trace_parse_run_command(struct file *file, const char __user *buffer, return ret; } +#ifdef CONFIG_TRACER_MAX_TRACE +__init static bool tr_needs_alloc_snapshot(const char *name) +{ + char *test; + int len = strlen(name); + bool ret; + + if (!boot_snapshot_index) + return false; + + if (strncmp(name, boot_snapshot_info, len) == 0 && + boot_snapshot_info[len] == '\t') + return true; + + test = kmalloc(strlen(name) + 3, GFP_KERNEL); + if (!test) + return false; + + sprintf(test, "\t%s\t", name); + ret = strstr(boot_snapshot_info, test) == 0; + kfree(test); + return ret; +} + +__init static void do_allocate_snapshot(const char *name) +{ + if (!tr_needs_alloc_snapshot(name)) + return; + + /* + * When allocate_snapshot is set, the next call to + * allocate_trace_buffers() (called by trace_array_get_by_name()) + * will allocate the snapshot buffer. That will alse clear + * this flag. + */ + allocate_snapshot = true; +} +#endif + __init static void enable_instances(void) { struct trace_array *tr; @@ -10189,6 +10240,9 @@ __init static void enable_instances(void) tok = strsep(&curr_str, ","); + if (IS_ENABLED(CONFIG_TRACER_MAX_TRACE)) + do_allocate_snapshot(tok); + tr = trace_array_get_by_name(tok); if (!tr) { pr_warn("Failed to create instance buffer %s\n", curr_str); @@ -10336,10 +10390,19 @@ __init static int tracer_alloc_buffers(void) void __init ftrace_boot_snapshot(void) { + struct trace_array *tr; + if (snapshot_at_boot) { tracing_snapshot(); internal_trace_puts("** Boot snapshot taken **\n"); } + + list_for_each_entry(tr, &ftrace_trace_arrays, list) { + if (tr == &global_trace) + continue; + trace_array_puts(tr, "** Boot snapshot taken **\n"); + tracing_snapshot_instance(tr); + } } void __init early_trace_init(void)