From patchwork Sat Dec 10 13:58:14 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Steven Rostedt X-Patchwork-Id: 32042 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:adf:f944:0:0:0:0:0 with SMTP id q4csp1349410wrr; Sat, 10 Dec 2022 06:57:18 -0800 (PST) X-Google-Smtp-Source: AA0mqf7KUZNgcppkW3ZqWrVuql1pL8fUjOQeB6PpPygivYIaWXqBgbk+K1U9bpefemjBmWGY217R X-Received: by 2002:a05:6a20:429c:b0:a3:254f:e82 with SMTP id o28-20020a056a20429c00b000a3254f0e82mr14309436pzj.53.1670681390764; Sat, 10 Dec 2022 06:09:50 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1670681390; cv=none; d=google.com; s=arc-20160816; b=QljnlZmHm6F8cwgImNwCH35TlAlRxSXKfaWvYyYHWYySUumQQiluX+yPr7eRUWUmh6 UEsA9lsXYH+EUlAgPSKVRyhB/75P6qeBxuUUXZlxtYgZOQi/wKxjizLllF/wOzvKbz5v ihoJM+lRjHt7Ly9hbNsduPt9L6QgBzKjEbwcFdPUxc1gJw3ZTjUNIZp6G1uo3k6rm+eh TaiMvAiFsRe0fvUjRdnJqTB+vTlraGcO/6IPFnWvORm4yOICVGIuWf8UqWLIGmIG04nG 7D/mh7QXIeGYpTDLNG/qDrCXvPbmsD4VOC5UcXLFqZmpp2TN78dIcCwUB1Ebd1hXWl1P pBKw== 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=TwzIR+m+7jmBfdK9+aHp/lFgY+BYfkQpxktvsIAMhUo=; b=dGK0ECTWvTdZR8kNjwJ3DGFmaTzDfz4R8fyw5Lmp2Y6LujvNK/4wzuz6PrFnl3tft7 6eZFzAXL2SHvQRgpiilC/xfdAmJzz0VyWDqqzh8iQQTFq/ksNNtsdjsedZ7j2Mzdwl/K 11Hu4H5rc16yIWbcCWMiwvMwkCuQFE7RLZQkkbwsbq9pPQ4Z2UAhNaEeemIq7VlBq3Gg Yk57R+exKE6MM+M1jzbqvZOVLU5OfyixxhP0/j13uyjAyRUcsXdbrLh0J/3RZNubWy9t 5mLCS/UYv3/RVznMdNwhftca5pJWO2FT82BPZnzdS10oRjfyIOQ4vvG3eikaKsLtAYtc A8TQ== 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 y11-20020a056a00190b00b005639db953adsi4794845pfi.68.2022.12.10.06.09.37; Sat, 10 Dec 2022 06:09:50 -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 S230143AbiLJN7x (ORCPT + 99 others); Sat, 10 Dec 2022 08:59:53 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34912 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229863AbiLJN6a (ORCPT ); Sat, 10 Dec 2022 08:58:30 -0500 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 3A6DF186FA for ; Sat, 10 Dec 2022 05:58:28 -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 1C30160C1A for ; Sat, 10 Dec 2022 13:58:28 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id EB354C433F1; Sat, 10 Dec 2022 13:58:27 +0000 (UTC) Received: from rostedt by gandalf.local.home with local (Exim 4.96) (envelope-from ) id 1p40N1-000kwM-0E; Sat, 10 Dec 2022 08:58:27 -0500 Message-ID: <20221210135826.943530120@goodmis.org> User-Agent: quilt/0.66 Date: Sat, 10 Dec 2022 08:58:14 -0500 From: Steven Rostedt To: linux-kernel@vger.kernel.org Cc: Masami Hiramatsu , Andrew Morton , "Suggested-by: Clark Williams" , Juri Lelli , Bagas Sanjaya , Daniel Bristot de Oliveira , Jonathan Corbet Subject: [for-next][PATCH 24/25] tracing/osnoise: Add preempt and/or irq disabled options References: <20221210135750.425719934@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?1751836410021044592?= X-GMAIL-MSGID: =?utf-8?q?1751836410021044592?= From: Daniel Bristot de Oliveira The osnoise workload runs with preemption and IRQs enabled in such a way as to allow all sorts of noise to disturb osnoise's execution. hwlat tracer has a similar workload but works with irq disabled, allowing only NMIs and the hardware to generate noise. While thinking about adding an options file to hwlat tracer to allow the system to panic, and other features I was thinking to add, like having a tracepoint at each noise detection, it came to my mind that is easier to make osnoise and also do hardware latency detection than making hwlat "feature compatible" with osnoise. Other points are: - osnoise already has an independent cpu file. - osnoise has a more intuitive interface, e.g., runtime/period vs. window/width (and people often need help remembering what it is). - osnoise: tracepoints - osnoise stop options - osnoise options file itself Moreover, the user-space side (in rtla) is simplified by reusing the existing osnoise code. Finally, people have been asking me about using osnoise for hw latency detection, and I have to explain that it was sufficient but not necessary. These options make it sufficient and necessary. Adding a Suggested-by Clark, as he often asked me about this possibility. Link: https://lkml.kernel.org/r/d9c6c19135497054986900f94c8e47410b15316a.1670623111.git.bristot@kernel.org Cc: Suggested-by: Clark Williams Cc: Juri Lelli Cc: Bagas Sanjaya Cc: Daniel Bristot de Oliveira Cc: Masami Hiramatsu Cc: Jonathan Corbet Signed-off-by: Daniel Bristot de Oliveira Signed-off-by: Steven Rostedt (Google) --- kernel/trace/trace_osnoise.c | 48 ++++++++++++++++++++++++++++++++---- 1 file changed, 43 insertions(+), 5 deletions(-) diff --git a/kernel/trace/trace_osnoise.c b/kernel/trace/trace_osnoise.c index 5a7613942223..94c1b5eb1dc0 100644 --- a/kernel/trace/trace_osnoise.c +++ b/kernel/trace/trace_osnoise.c @@ -55,10 +55,17 @@ enum osnoise_options_index { OSN_DEFAULTS = 0, OSN_WORKLOAD, OSN_PANIC_ON_STOP, + OSN_PREEMPT_DISABLE, + OSN_IRQ_DISABLE, OSN_MAX }; -static const char * const osnoise_options_str[OSN_MAX] = { "DEFAULTS", "OSNOISE_WORKLOAD", "PANIC_ON_STOP" }; +static const char * const osnoise_options_str[OSN_MAX] = { + "DEFAULTS", + "OSNOISE_WORKLOAD", + "PANIC_ON_STOP", + "OSNOISE_PREEMPT_DISABLE", + "OSNOISE_IRQ_DISABLE" }; #define OSN_DEFAULT_OPTIONS 0x2 static unsigned long osnoise_options = OSN_DEFAULT_OPTIONS; @@ -1308,18 +1315,26 @@ static void notify_new_max_latency(u64 latency) */ static int run_osnoise(void) { + bool disable_irq = test_bit(OSN_IRQ_DISABLE, &osnoise_options); struct osnoise_variables *osn_var = this_cpu_osn_var(); u64 start, sample, last_sample; u64 last_int_count, int_count; s64 noise = 0, max_noise = 0; s64 total, last_total = 0; struct osnoise_sample s; + bool disable_preemption; unsigned int threshold; u64 runtime, stop_in; u64 sum_noise = 0; int hw_count = 0; int ret = -1; + /* + * Disabling preemption is only required if IRQs are enabled, + * and the options is set on. + */ + disable_preemption = !disable_irq && test_bit(OSN_PREEMPT_DISABLE, &osnoise_options); + /* * Considers the current thread as the workload. */ @@ -1335,6 +1350,15 @@ static int run_osnoise(void) */ threshold = tracing_thresh ? : 5000; + /* + * Apply PREEMPT and IRQ disabled options. + */ + if (disable_irq) + local_irq_disable(); + + if (disable_preemption) + preempt_disable(); + /* * Make sure NMIs see sampling first */ @@ -1422,16 +1446,21 @@ static int run_osnoise(void) * cond_resched() */ if (IS_ENABLED(CONFIG_PREEMPT_RCU)) { - local_irq_disable(); + if (!disable_irq) + local_irq_disable(); + rcu_momentary_dyntick_idle(); - local_irq_enable(); + + if (!disable_irq) + local_irq_enable(); } /* * For the non-preemptive kernel config: let threads runs, if - * they so wish. + * they so wish, unless set not do to so. */ - cond_resched(); + if (!disable_irq && !disable_preemption) + cond_resched(); last_sample = sample; last_int_count = int_count; @@ -1450,6 +1479,15 @@ static int run_osnoise(void) */ barrier(); + /* + * Return to the preemptive state. + */ + if (disable_preemption) + preempt_enable(); + + if (disable_irq) + local_irq_enable(); + /* * Save noise info. */