From nobody Sun Feb 8 11:26:40 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C950B18EAB for ; Sat, 15 Nov 2025 14:09:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763215756; cv=none; b=k1qbuhp1TcCJ/KUwnwBfOCCTlONk7IMIDbEH3pTlDMKvNgtSgnfikjEHchpqxeAecDsmMGJvNuHxr7jhg5sa6f2wMZ8dm3Z7aOiEqI83yyvUX1S5OAwPj6SZtNo/p2ksAFfISTnbhJ6+RxKz07UOZ54YeFBFl/6gdkG8xr2wrBg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763215756; c=relaxed/simple; bh=muzfAoQpyW7Hl1nPIqOvXyYVicFITyPpW2MOYJ8iidg=; h=Message-ID:Date:From:To:Cc:Subject:References:MIME-Version: Content-Type; b=D7en+ZxCJpvdh8cF163ooDpI2s5y5NlBUDAU4D5LEYSmvpW0Hews3APEgmqXlSQ/qzlfk/B++YMBgttcTL2dAeOGHMykO5mzGijFj1JDXfEUrZOeF7nolOOkTNCGe/Zw/aagZptsLr29IZ4dmBasPDwh0CkULwKQozkD0goPZfA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=BjJs14dc; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="BjJs14dc" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 609CFC4CEF8; Sat, 15 Nov 2025 14:09:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1763215756; bh=muzfAoQpyW7Hl1nPIqOvXyYVicFITyPpW2MOYJ8iidg=; h=Date:From:To:Cc:Subject:References:From; b=BjJs14dcprpJ9/d2mTDFqq1Kl9DsNVqRppJsGW/iQS1LM2VA+Y7ZeeW25DhPPp5B6 u2+5g7ed8rCt400mTdjZOW2uSikISArHWAYfvK2Gg1SSl1CcFeg1e4GPN9WFMM6TOp /irU2OSSJe6k4aZNOQ4tQQXtLxBHD6rkXwfz56pz11WllXt9OGbeHxA39lO5euikII GrHn7/dtU0cNZWJcSJMIHaQE1u+bd5s6fdaXRGGR/re/ZBqi8DHxnFa8fIOCEPNIPI bn1BDiN2vjdoNcQCU7SBIA1SspCAOxgWS5GJjopJvyN/ahUdUWrkHDCzg8+WSrxxUq dxJNGU4bNa29g== Received: from rostedt by gandalf with local (Exim 4.98.2) (envelope-from ) id 1vKGy8-00000002Asq-2iyU; Sat, 15 Nov 2025 09:09:36 -0500 Message-ID: <20251115140936.505263410@kernel.org> User-Agent: quilt/0.68 Date: Sat, 15 Nov 2025 09:09:11 -0500 From: Steven Rostedt To: linux-kernel@vger.kernel.org Cc: Masami Hiramatsu , Mark Rutland , Mathieu Desnoyers , Andrew Morton , Huang Cun , Yongliang Gao Subject: [for-next][PATCH 1/5] trace/pid_list: optimize pid_list->lock contention References: <20251115140910.386662473@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Yongliang Gao When the system has many cores and task switching is frequent, setting set_ftrace_pid can cause frequent pid_list->lock contention and high system sys usage. For example, in a 288-core VM environment, we observed 267 CPUs experiencing contention on pid_list->lock, with stack traces showing: #4 [ffffa6226fb4bc70] native_queued_spin_lock_slowpath at ffffffff99cd4b7e #5 [ffffa6226fb4bc90] _raw_spin_lock_irqsave at ffffffff99cd3e36 #6 [ffffa6226fb4bca0] trace_pid_list_is_set at ffffffff99267554 #7 [ffffa6226fb4bcc0] trace_ignore_this_task at ffffffff9925c288 #8 [ffffa6226fb4bcd8] ftrace_filter_pid_sched_switch_probe at ffffffff9924= 6efe #9 [ffffa6226fb4bcf0] __schedule at ffffffff99ccd161 Replaces the existing spinlock with a seqlock to allow concurrent readers, while maintaining write exclusivity. Link: https://patch.msgid.link/20251113000252.1058144-1-leonylgao@gmail.com Reviewed-by: Huang Cun Signed-off-by: Yongliang Gao Signed-off-by: Steven Rostedt (Google) --- kernel/trace/pid_list.c | 30 +++++++++++++++++++++--------- kernel/trace/pid_list.h | 1 + 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/kernel/trace/pid_list.c b/kernel/trace/pid_list.c index 090bb5ea4a19..dbee72d69d0a 100644 --- a/kernel/trace/pid_list.c +++ b/kernel/trace/pid_list.c @@ -3,6 +3,7 @@ * Copyright (C) 2021 VMware Inc, Steven Rostedt */ #include +#include #include #include #include "trace.h" @@ -126,7 +127,7 @@ bool trace_pid_list_is_set(struct trace_pid_list *pid_l= ist, unsigned int pid) { union upper_chunk *upper_chunk; union lower_chunk *lower_chunk; - unsigned long flags; + unsigned int seq; unsigned int upper1; unsigned int upper2; unsigned int lower; @@ -138,14 +139,16 @@ bool trace_pid_list_is_set(struct trace_pid_list *pid= _list, unsigned int pid) if (pid_split(pid, &upper1, &upper2, &lower) < 0) return false; =20 - raw_spin_lock_irqsave(&pid_list->lock, flags); - upper_chunk =3D pid_list->upper[upper1]; - if (upper_chunk) { - lower_chunk =3D upper_chunk->data[upper2]; - if (lower_chunk) - ret =3D test_bit(lower, lower_chunk->data); - } - raw_spin_unlock_irqrestore(&pid_list->lock, flags); + do { + seq =3D read_seqcount_begin(&pid_list->seqcount); + ret =3D false; + upper_chunk =3D pid_list->upper[upper1]; + if (upper_chunk) { + lower_chunk =3D upper_chunk->data[upper2]; + if (lower_chunk) + ret =3D test_bit(lower, lower_chunk->data); + } + } while (read_seqcount_retry(&pid_list->seqcount, seq)); =20 return ret; } @@ -178,6 +181,7 @@ int trace_pid_list_set(struct trace_pid_list *pid_list,= unsigned int pid) return -EINVAL; =20 raw_spin_lock_irqsave(&pid_list->lock, flags); + write_seqcount_begin(&pid_list->seqcount); upper_chunk =3D pid_list->upper[upper1]; if (!upper_chunk) { upper_chunk =3D get_upper_chunk(pid_list); @@ -199,6 +203,7 @@ int trace_pid_list_set(struct trace_pid_list *pid_list,= unsigned int pid) set_bit(lower, lower_chunk->data); ret =3D 0; out: + write_seqcount_end(&pid_list->seqcount); raw_spin_unlock_irqrestore(&pid_list->lock, flags); return ret; } @@ -230,6 +235,7 @@ int trace_pid_list_clear(struct trace_pid_list *pid_lis= t, unsigned int pid) return -EINVAL; =20 raw_spin_lock_irqsave(&pid_list->lock, flags); + write_seqcount_begin(&pid_list->seqcount); upper_chunk =3D pid_list->upper[upper1]; if (!upper_chunk) goto out; @@ -250,6 +256,7 @@ int trace_pid_list_clear(struct trace_pid_list *pid_lis= t, unsigned int pid) } } out: + write_seqcount_end(&pid_list->seqcount); raw_spin_unlock_irqrestore(&pid_list->lock, flags); return 0; } @@ -340,8 +347,10 @@ static void pid_list_refill_irq(struct irq_work *iwork) =20 again: raw_spin_lock(&pid_list->lock); + write_seqcount_begin(&pid_list->seqcount); upper_count =3D CHUNK_ALLOC - pid_list->free_upper_chunks; lower_count =3D CHUNK_ALLOC - pid_list->free_lower_chunks; + write_seqcount_end(&pid_list->seqcount); raw_spin_unlock(&pid_list->lock); =20 if (upper_count <=3D 0 && lower_count <=3D 0) @@ -370,6 +379,7 @@ static void pid_list_refill_irq(struct irq_work *iwork) } =20 raw_spin_lock(&pid_list->lock); + write_seqcount_begin(&pid_list->seqcount); if (upper) { *upper_next =3D pid_list->upper_list; pid_list->upper_list =3D upper; @@ -380,6 +390,7 @@ static void pid_list_refill_irq(struct irq_work *iwork) pid_list->lower_list =3D lower; pid_list->free_lower_chunks +=3D lcnt; } + write_seqcount_end(&pid_list->seqcount); raw_spin_unlock(&pid_list->lock); =20 /* @@ -419,6 +430,7 @@ struct trace_pid_list *trace_pid_list_alloc(void) init_irq_work(&pid_list->refill_irqwork, pid_list_refill_irq); =20 raw_spin_lock_init(&pid_list->lock); + seqcount_raw_spinlock_init(&pid_list->seqcount, &pid_list->lock); =20 for (i =3D 0; i < CHUNK_ALLOC; i++) { union upper_chunk *chunk; diff --git a/kernel/trace/pid_list.h b/kernel/trace/pid_list.h index 62e73f1ac85f..0b45fb0eadb9 100644 --- a/kernel/trace/pid_list.h +++ b/kernel/trace/pid_list.h @@ -76,6 +76,7 @@ union upper_chunk { }; =20 struct trace_pid_list { + seqcount_raw_spinlock_t seqcount; raw_spinlock_t lock; struct irq_work refill_irqwork; union upper_chunk *upper[UPPER1_SIZE]; // 1 or 2K in size --=20 2.51.0 From nobody Sun Feb 8 11:26:40 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 262542C0299 for ; Sat, 15 Nov 2025 14:09:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763215757; cv=none; b=fe0qgwbyMulVK4AIq3vhH17J4roQvfaboH4NWf/WpX5ML3zquQ2CB/kxsZh0immzllZIIKz1gXfBNjuH3HB3e9bVEA+QAm4sG9f4dakQKWt6KTgI3o75AhnWXRugu3H296L2dZtbEw6HqMCFuC0Nh5JDumGb3IXiIzDykub9KDs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763215757; c=relaxed/simple; bh=r5s9onqJcIEAGEZEK3kA6m9jrxbHlsaKxj9xseWJ/qk=; h=Message-ID:Date:From:To:Cc:Subject:References:MIME-Version: Content-Type; b=k7I3aGB/uaHpkchIZcfwykTm2urvgHPUy5YwTxLAJp3nTqGQLnmlCxn9zlRWz+ZFEuGlBv8Xye4gL8MUwLLIM5lVUapQ1nG5LAnYg5NPaqSoxzWjWzpWl+mUU9YyaJg0GoHaB47RbzAlL/2dKnIKmj6kqvm4QvNMl/zrFk0fcPc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=TDVn2wg0; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="TDVn2wg0" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 8BC3AC2BCB0; Sat, 15 Nov 2025 14:09:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1763215756; bh=r5s9onqJcIEAGEZEK3kA6m9jrxbHlsaKxj9xseWJ/qk=; h=Date:From:To:Cc:Subject:References:From; b=TDVn2wg03IEq/vhb1nTZbY32vyOK3HyQACWoNd8CqnLZ0wCN/Shlv8HMfJw8qkooN m58jnPetTTxzWr7EHr5xEb88+gp7NRKwM3vO9Z+frjcebOH1jGf9HhSOkAXek3gxXd WEhZ985l1Gkz9XVX+XlFr5HDzGY6dJj/4NrEkQ9iUtqKU1k/WCkghwEUHNN4fjezO2 zxTHWFaf00PVIRVT2RCuYdbukZknbcHQ5+perbsC+V7IGlB6w3VJAxVcrv33Z+WlOz Om8nkX5fzijGDq4NWGxaRxJmmYiGXsXIlygNHQfvmrhX8S3Sw4Uhwfr3tnGnafBQKy bUPrHdHZfFsrw== Received: from rostedt by gandalf with local (Exim 4.98.2) (envelope-from ) id 1vKGy8-00000002AtK-3OUZ; Sat, 15 Nov 2025 09:09:36 -0500 Message-ID: <20251115140936.669631594@kernel.org> User-Agent: quilt/0.68 Date: Sat, 15 Nov 2025 09:09:12 -0500 From: Steven Rostedt To: linux-kernel@vger.kernel.org Cc: Masami Hiramatsu , Mark Rutland , Mathieu Desnoyers , Andrew Morton Subject: [for-next][PATCH 2/5] tracing: Have function graph tracer option funcgraph-irqs be per instance References: <20251115140910.386662473@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Steven Rostedt Currently the option to trace interrupts in the function graph tracer is global when the interface is per-instance. Changing the value in one instance will affect the results of another instance that is also running the function graph tracer. This can lead to confusing results. Cc: Masami Hiramatsu Cc: Mark Rutland Cc: Mathieu Desnoyers Cc: Andrew Morton Link: https://patch.msgid.link/20251114192318.613867934@kernel.org Fixes: c132be2c4fcc1 ("function_graph: Have the instances use their own ftr= ace_ops for filtering") Signed-off-by: Steven Rostedt (Google) --- kernel/trace/trace_functions_graph.c | 41 +++++++++++++++++++++------- 1 file changed, 31 insertions(+), 10 deletions(-) diff --git a/kernel/trace/trace_functions_graph.c b/kernel/trace/trace_func= tions_graph.c index 4e86adf6dd4d..3f55b49cf64e 100644 --- a/kernel/trace/trace_functions_graph.c +++ b/kernel/trace/trace_functions_graph.c @@ -16,7 +16,7 @@ #include "trace.h" #include "trace_output.h" =20 -/* When set, irq functions will be ignored */ +/* When set, irq functions might be ignored */ static int ftrace_graph_skip_irqs; =20 struct fgraph_cpu_data { @@ -190,11 +190,14 @@ int __trace_graph_retaddr_entry(struct trace_array *t= r, } #endif =20 -static inline int ftrace_graph_ignore_irqs(void) +static inline int ftrace_graph_ignore_irqs(struct trace_array *tr) { if (!ftrace_graph_skip_irqs || trace_recursion_test(TRACE_IRQ_BIT)) return 0; =20 + if (tracer_flags_is_set(tr, TRACE_GRAPH_PRINT_IRQS)) + return 0; + return in_hardirq(); } =20 @@ -238,7 +241,7 @@ static int graph_entry(struct ftrace_graph_ent *trace, if (ftrace_graph_ignore_func(gops, trace)) return 0; =20 - if (ftrace_graph_ignore_irqs()) + if (ftrace_graph_ignore_irqs(tr)) return 0; =20 if (fgraph_sleep_time) { @@ -451,6 +454,9 @@ static int graph_trace_init(struct trace_array *tr) else tr->gops->retfunc =3D trace_graph_return; =20 + if (!tracer_flags_is_set(tr, TRACE_GRAPH_PRINT_IRQS)) + ftrace_graph_skip_irqs++; + /* Make gops functions visible before we start tracing */ smp_mb(); =20 @@ -468,10 +474,6 @@ static int ftrace_graph_trace_args(struct trace_array = *tr, int set) { trace_func_graph_ent_t entry; =20 - /* Do nothing if the current tracer is not this tracer */ - if (tr->current_trace !=3D &graph_trace) - return 0; - if (set) entry =3D trace_graph_entry_args; else @@ -492,6 +494,11 @@ static int ftrace_graph_trace_args(struct trace_array = *tr, int set) =20 static void graph_trace_reset(struct trace_array *tr) { + if (!tracer_flags_is_set(tr, TRACE_GRAPH_PRINT_IRQS)) + ftrace_graph_skip_irqs--; + if (WARN_ON_ONCE(ftrace_graph_skip_irqs < 0)) + ftrace_graph_skip_irqs =3D 0; + tracing_stop_cmdline_record(); unregister_ftrace_graph(tr->gops); } @@ -1617,15 +1624,29 @@ void graph_trace_close(struct trace_iterator *iter) static int func_graph_set_flag(struct trace_array *tr, u32 old_flags, u32 bit, int se= t) { - if (bit =3D=3D TRACE_GRAPH_PRINT_IRQS) - ftrace_graph_skip_irqs =3D !set; - if (bit =3D=3D TRACE_GRAPH_SLEEP_TIME) ftrace_graph_sleep_time_control(set); =20 if (bit =3D=3D TRACE_GRAPH_GRAPH_TIME) ftrace_graph_graph_time_control(set); =20 + /* Do nothing if the current tracer is not this tracer */ + if (tr->current_trace !=3D &graph_trace) + return 0; + + /* Do nothing if already set. */ + if (!!set =3D=3D !!(tr->current_trace_flags->val & bit)) + return 0; + + if (bit =3D=3D TRACE_GRAPH_PRINT_IRQS) { + if (set) + ftrace_graph_skip_irqs--; + else + ftrace_graph_skip_irqs++; + if (WARN_ON_ONCE(ftrace_graph_skip_irqs < 0)) + ftrace_graph_skip_irqs =3D 0; + } + if (bit =3D=3D TRACE_GRAPH_ARGS) return ftrace_graph_trace_args(tr, set); =20 --=20 2.51.0 From nobody Sun Feb 8 11:26:40 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1201D29A9CD for ; Sat, 15 Nov 2025 14:09:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763215757; cv=none; b=dwhMYbI0IixynbNaF9GZJ1PjkXG/7c1xbqAsDcOe/PXqRgeD7TcFtle8VEXEGd/ofEV+7Y9Q0YI/YsgMBA/R5Z7Or5FqWJ44g+ZxJZTTJ4dbo1P/A7REpJhEGL8KDbqA1nOnvX34zUi565wYln+SehGnY8JcBmLub3l4w8lUpuU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763215757; c=relaxed/simple; bh=X0HY+ztPEHbQlkYJg3bxEMwPq/D82eFLQb//Uv+/NEw=; h=Message-ID:Date:From:To:Cc:Subject:References:MIME-Version: Content-Type; b=amamAnqzJBJb0CRWVJgITaIBX8eyibQ+A10TWgHCiPmHg32p87Nh3GgGnDnnI5ZOf3+gWNfmGpJmWNtQObuGGq+hJZf92tf2topdjeQ9mVtqr/S060Osy4i0IG1uIhR+JnNU8wUmnMFM+nkuH/Xp0bRB8/0zqESKqByS7dzcRlw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=m3l0Ik/H; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="m3l0Ik/H" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 80CF8C2BCAF; Sat, 15 Nov 2025 14:09:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1763215756; bh=X0HY+ztPEHbQlkYJg3bxEMwPq/D82eFLQb//Uv+/NEw=; h=Date:From:To:Cc:Subject:References:From; b=m3l0Ik/HwOlGu7jAfPozDLFx85ixLoyJrhin7Be9OyoA0IAl7tDHI4DdmvAO1PxVM lh45MNXaz5382U6hf7hkMi/ktnKrsr6Mco/9Vp9mwC2t2gLYUxPvpE0nAyAirRkDTg i+JFoNatCbq8bem4Xf2zHtTNeWSVinHix27l64lgDKao9GLv4cthLw3lndgmNVxBKW 6llWnwe2X2hBX8d0+kEO0Ixq56bkyiDQuyBpREuppM3FYogWU/M65gH1R8neyNJMO7 9ZklUYw5OBuM2JQA4ZM3sKBB5n04PHpxmw0rXRcSjS+NM0kk5ZSZzwHBvvgza3+TVG viUf3ZVjuZLgA== Received: from rostedt by gandalf with local (Exim 4.98.2) (envelope-from ) id 1vKGy8-00000002Ato-42hZ; Sat, 15 Nov 2025 09:09:36 -0500 Message-ID: <20251115140936.827589526@kernel.org> User-Agent: quilt/0.68 Date: Sat, 15 Nov 2025 09:09:13 -0500 From: Steven Rostedt To: linux-kernel@vger.kernel.org Cc: Masami Hiramatsu , Mark Rutland , Mathieu Desnoyers , Andrew Morton Subject: [for-next][PATCH 3/5] tracing: Move graph-time out of function graph options References: <20251115140910.386662473@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Steven Rostedt The option "graph-time" affects the function profiler when it is using the function graph infrastructure. It has nothing to do with the function graph tracer itself. The option only affects the global function profiler and does nothing to the function graph tracer. Move it out of the function graph tracer options and make it a global option that is only available at the top level instance. Cc: Masami Hiramatsu Cc: Mark Rutland Cc: Mathieu Desnoyers Cc: Andrew Morton Link: https://patch.msgid.link/20251114192318.781711154@kernel.org Signed-off-by: Steven Rostedt (Google) --- kernel/trace/trace.c | 14 ++++++++++---- kernel/trace/trace.h | 13 ++++++++++++- kernel/trace/trace_functions_graph.c | 10 +--------- 3 files changed, 23 insertions(+), 14 deletions(-) diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index 9268489d2ce8..8ae95800592d 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c @@ -509,10 +509,10 @@ EXPORT_SYMBOL_GPL(unregister_ftrace_export); =20 /* trace_flags holds trace_options default values */ #define TRACE_DEFAULT_FLAGS \ - (FUNCTION_DEFAULT_FLAGS | \ - TRACE_ITER(PRINT_PARENT) | TRACE_ITER(PRINTK) | \ + (FUNCTION_DEFAULT_FLAGS | FPROFILE_DEFAULT_FLAGS | \ + TRACE_ITER(PRINT_PARENT) | TRACE_ITER(PRINTK) | \ TRACE_ITER(ANNOTATE) | TRACE_ITER(CONTEXT_INFO) | \ - TRACE_ITER(RECORD_CMD) | TRACE_ITER(OVERWRITE) | \ + TRACE_ITER(RECORD_CMD) | TRACE_ITER(OVERWRITE) | \ TRACE_ITER(IRQ_INFO) | TRACE_ITER(MARKERS) | \ TRACE_ITER(HASH_PTR) | TRACE_ITER(TRACE_PRINTK) | \ TRACE_ITER(COPY_MARKER)) @@ -520,7 +520,7 @@ EXPORT_SYMBOL_GPL(unregister_ftrace_export); /* trace_options that are only supported by global_trace */ #define TOP_LEVEL_TRACE_FLAGS (TRACE_ITER(PRINTK) | \ TRACE_ITER(PRINTK_MSGONLY) | TRACE_ITER(RECORD_CMD) | \ - TRACE_ITER(PROF_TEXT_OFFSET)) + TRACE_ITER(PROF_TEXT_OFFSET) | FPROFILE_DEFAULT_FLAGS) =20 /* trace_flags that are default zero for instances */ #define ZEROED_TRACE_FLAGS \ @@ -5331,6 +5331,12 @@ int set_tracer_flag(struct trace_array *tr, u64 mask= , int enabled) trace_printk_start_stop_comm(enabled); trace_printk_control(enabled); break; + +#if defined(CONFIG_FUNCTION_PROFILER) && defined(CONFIG_FUNCTION_GRAPH_TRA= CER) + case TRACE_GRAPH_GRAPH_TIME: + ftrace_graph_graph_time_control(enabled); + break; +#endif } =20 return 0; diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h index 299862aad66c..41b416a22450 100644 --- a/kernel/trace/trace.h +++ b/kernel/trace/trace.h @@ -1368,8 +1368,18 @@ extern int trace_get_user(struct trace_parser *parse= r, const char __user *ubuf, #ifdef CONFIG_FUNCTION_PROFILER # define PROFILER_FLAGS \ C(PROF_TEXT_OFFSET, "prof-text-offset"), +# ifdef CONFIG_FUNCTION_GRAPH_TRACER +# define FPROFILE_FLAGS \ + C(GRAPH_TIME, "graph-time"), +# define FPROFILE_DEFAULT_FLAGS TRACE_ITER(GRAPH_TIME) +# else +# define FPROFILE_FLAGS +# define FPROFILE_DEFAULT_FLAGS 0UL +# endif #else # define PROFILER_FLAGS +# define FPROFILE_FLAGS +# define FPROFILE_DEFAULT_FLAGS 0UL # define TRACE_ITER_PROF_TEXT_OFFSET_BIT -1 #endif =20 @@ -1412,7 +1422,8 @@ extern int trace_get_user(struct trace_parser *parser= , const char __user *ubuf, FGRAPH_FLAGS \ STACK_FLAGS \ BRANCH_FLAGS \ - PROFILER_FLAGS + PROFILER_FLAGS \ + FPROFILE_FLAGS =20 /* * By defining C, we can make TRACE_FLAGS a list of bit names diff --git a/kernel/trace/trace_functions_graph.c b/kernel/trace/trace_func= tions_graph.c index 3f55b49cf64e..53adbe4bfedb 100644 --- a/kernel/trace/trace_functions_graph.c +++ b/kernel/trace/trace_functions_graph.c @@ -85,11 +85,6 @@ static struct tracer_opt trace_opts[] =3D { /* Include sleep time (scheduled out) between entry and return */ { TRACER_OPT(sleep-time, TRACE_GRAPH_SLEEP_TIME) }, =20 -#ifdef CONFIG_FUNCTION_PROFILER - /* Include time within nested functions */ - { TRACER_OPT(graph-time, TRACE_GRAPH_GRAPH_TIME) }, -#endif - { } /* Empty entry */ }; =20 @@ -97,7 +92,7 @@ static struct tracer_flags tracer_flags =3D { /* Don't display overruns, proc, or tail by default */ .val =3D TRACE_GRAPH_PRINT_CPU | TRACE_GRAPH_PRINT_OVERHEAD | TRACE_GRAPH_PRINT_DURATION | TRACE_GRAPH_PRINT_IRQS | - TRACE_GRAPH_SLEEP_TIME | TRACE_GRAPH_GRAPH_TIME, + TRACE_GRAPH_SLEEP_TIME, .opts =3D trace_opts }; =20 @@ -1627,9 +1622,6 @@ func_graph_set_flag(struct trace_array *tr, u32 old_f= lags, u32 bit, int set) if (bit =3D=3D TRACE_GRAPH_SLEEP_TIME) ftrace_graph_sleep_time_control(set); =20 - if (bit =3D=3D TRACE_GRAPH_GRAPH_TIME) - ftrace_graph_graph_time_control(set); - /* Do nothing if the current tracer is not this tracer */ if (tr->current_trace !=3D &graph_trace) return 0; --=20 2.51.0 From nobody Sun Feb 8 11:26:40 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3A3352F5A2A for ; Sat, 15 Nov 2025 14:09:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763215757; cv=none; b=ti7Rm31SaGl+Y+lc5jFb1ioc1YMLq2nlz+BnXva5o9CVXbkQ1wOY0YeOUeoqq2FgFUNdNlT635V8DpS0Tsry/zf3TXCVIVcLwAc/LMUTPyuAXF6hB6xiMa3fKqP+4WJ1jeaQuLvwP5YP84VZ8AK3bDZrLnCV7RMiNcAgwFixX0M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763215757; c=relaxed/simple; bh=/jqkeyUMX0k98d1YiY61xd3cyAETJz3GjeyWP6J++Fs=; h=Message-ID:Date:From:To:Cc:Subject:References:MIME-Version: Content-Type; b=jQ5dvD+eV7EIlp2Fh62IHlMoEYgMzVPdJCJ7Kqejo8maati7W7MsD1pbacojV7D5ndY4iUBE/I1rKTUgHQ+RipZrXesuTdiRs/c8youjBa1T0IED9bV83YD7VRRyX5ukoFnDUZOrFkP6q1fOTRcj4qyy8fYIiAk757FcJPXjCZ0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=IcKiTqWG; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="IcKiTqWG" Received: by smtp.kernel.org (Postfix) with ESMTPSA id C2FAEC113D0; Sat, 15 Nov 2025 14:09:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1763215756; bh=/jqkeyUMX0k98d1YiY61xd3cyAETJz3GjeyWP6J++Fs=; h=Date:From:To:Cc:Subject:References:From; b=IcKiTqWG9W5vJh1VmbnsDmQ3A+DmweTX8ChJ9G/I0vCkVzfq7AeZJn4NS+f8TAaS2 Xl11PNbc60KPgrA2XNEc/15oFBynpw7jHwNpYeiStfd7butwS1Jc6JXWJba25Ocxe1 zGrgMPQrNSK9FYKLIgoUGz7lqYy5b9PKKpeTY9hceVnR9dSPMWYXBXMGt9RR+7Np1K TUlrhCx+y10LqXeN6oUSBfYD6KGO3QT6e8WJAkDygAJGaJBbZzelfb6pdUfeJSJj0G 9eH9LnuyeVGLIQpAUcE/rQYFSTTms0xNRUA277aU5D4DwoAo2lw+S2s3jyVNwhwO3S W37rnLMl+U3XA== Received: from rostedt by gandalf with local (Exim 4.98.2) (envelope-from ) id 1vKGy9-00000002AuI-0WPg; Sat, 15 Nov 2025 09:09:37 -0500 Message-ID: <20251115140936.984627654@kernel.org> User-Agent: quilt/0.68 Date: Sat, 15 Nov 2025 09:09:14 -0500 From: Steven Rostedt To: linux-kernel@vger.kernel.org Cc: Masami Hiramatsu , Mark Rutland , Mathieu Desnoyers , Andrew Morton Subject: [for-next][PATCH 4/5] tracing: Have function graph tracer option sleep-time be per instance References: <20251115140910.386662473@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Steven Rostedt Currently the option to have function graph tracer to ignore time spent when a task is sleeping is global when the interface is per-instance. Changing the value in one instance will affect the results of another instance that is also running the function graph tracer. This can lead to confusing results. Cc: Masami Hiramatsu Cc: Mark Rutland Cc: Mathieu Desnoyers Cc: Andrew Morton Link: https://patch.msgid.link/20251114192318.950255167@kernel.org Fixes: c132be2c4fcc1 ("function_graph: Have the instances use their own ftr= ace_ops for filtering") Signed-off-by: Steven Rostedt (Google) --- kernel/trace/fgraph.c | 10 +---- kernel/trace/ftrace.c | 4 +- kernel/trace/trace.h | 5 +-- kernel/trace/trace_functions_graph.c | 64 +++++++++++++++++++++++----- 4 files changed, 60 insertions(+), 23 deletions(-) diff --git a/kernel/trace/fgraph.c b/kernel/trace/fgraph.c index 484ad7a18463..7fb9b169d6d4 100644 --- a/kernel/trace/fgraph.c +++ b/kernel/trace/fgraph.c @@ -498,9 +498,6 @@ void *fgraph_retrieve_parent_data(int idx, int *size_by= tes, int depth) return get_data_type_data(current, offset); } =20 -/* Both enabled by default (can be cleared by function_graph tracer flags = */ -bool fgraph_sleep_time =3D true; - #ifdef CONFIG_DYNAMIC_FTRACE /* * archs can override this function if they must do something @@ -1023,11 +1020,6 @@ void fgraph_init_ops(struct ftrace_ops *dst_ops, #endif } =20 -void ftrace_graph_sleep_time_control(bool enable) -{ - fgraph_sleep_time =3D enable; -} - /* * Simply points to ftrace_stub, but with the proper protocol. * Defined by the linker script in linux/vmlinux.lds.h @@ -1098,7 +1090,7 @@ ftrace_graph_probe_sched_switch(void *ignore, bool pr= eempt, * Does the user want to count the time a function was asleep. * If so, do not update the time stamps. */ - if (fgraph_sleep_time) + if (!fgraph_no_sleep_time) return; =20 timestamp =3D trace_clock_local(); diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c index ab601cd9638b..7c3bbebeec7a 100644 --- a/kernel/trace/ftrace.c +++ b/kernel/trace/ftrace.c @@ -862,6 +862,8 @@ static int profile_graph_entry(struct ftrace_graph_ent = *trace, return 1; } =20 +bool fprofile_no_sleep_time; + static void profile_graph_return(struct ftrace_graph_ret *trace, struct fgraph_ops *gops, struct ftrace_regs *fregs) @@ -887,7 +889,7 @@ static void profile_graph_return(struct ftrace_graph_re= t *trace, =20 calltime =3D rettime - profile_data->calltime; =20 - if (!fgraph_sleep_time) { + if (fprofile_no_sleep_time) { if (current->ftrace_sleeptime) calltime -=3D current->ftrace_sleeptime - profile_data->sleeptime; } diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h index 41b416a22450..58be6d741d72 100644 --- a/kernel/trace/trace.h +++ b/kernel/trace/trace.h @@ -943,8 +943,6 @@ static __always_inline bool ftrace_hash_empty(struct ft= race_hash *hash) #define TRACE_GRAPH_PRINT_FILL_SHIFT 28 #define TRACE_GRAPH_PRINT_FILL_MASK (0x3 << TRACE_GRAPH_PRINT_FILL_SHIFT) =20 -extern void ftrace_graph_sleep_time_control(bool enable); - #ifdef CONFIG_FUNCTION_PROFILER extern void ftrace_graph_graph_time_control(bool enable); #else @@ -1115,7 +1113,8 @@ static inline void ftrace_graph_addr_finish(struct fg= raph_ops *gops, struct ftra #endif /* CONFIG_DYNAMIC_FTRACE */ =20 extern unsigned int fgraph_max_depth; -extern bool fgraph_sleep_time; +extern unsigned int fgraph_no_sleep_time; +extern bool fprofile_no_sleep_time; =20 static inline bool ftrace_graph_ignore_func(struct fgraph_ops *gops, struct ftrace_graph_ent = *trace) diff --git a/kernel/trace/trace_functions_graph.c b/kernel/trace/trace_func= tions_graph.c index 53adbe4bfedb..12315eb65925 100644 --- a/kernel/trace/trace_functions_graph.c +++ b/kernel/trace/trace_functions_graph.c @@ -19,6 +19,9 @@ /* When set, irq functions might be ignored */ static int ftrace_graph_skip_irqs; =20 +/* Do not record function time when task is sleeping */ +unsigned int fgraph_no_sleep_time; + struct fgraph_cpu_data { pid_t last_pid; int depth; @@ -239,13 +242,14 @@ static int graph_entry(struct ftrace_graph_ent *trace, if (ftrace_graph_ignore_irqs(tr)) return 0; =20 - if (fgraph_sleep_time) { - /* Only need to record the calltime */ - ftimes =3D fgraph_reserve_data(gops->idx, sizeof(ftimes->calltime)); - } else { + if (fgraph_no_sleep_time && + !tracer_flags_is_set(tr, TRACE_GRAPH_SLEEP_TIME)) { ftimes =3D fgraph_reserve_data(gops->idx, sizeof(*ftimes)); if (ftimes) ftimes->sleeptime =3D current->ftrace_sleeptime; + } else { + /* Only need to record the calltime */ + ftimes =3D fgraph_reserve_data(gops->idx, sizeof(ftimes->calltime)); } if (!ftimes) return 0; @@ -331,11 +335,15 @@ void __trace_graph_return(struct trace_array *tr, trace_buffer_unlock_commit_nostack(buffer, event); } =20 -static void handle_nosleeptime(struct ftrace_graph_ret *trace, +static void handle_nosleeptime(struct trace_array *tr, + struct ftrace_graph_ret *trace, struct fgraph_times *ftimes, int size) { - if (fgraph_sleep_time || size < sizeof(*ftimes)) + if (size < sizeof(*ftimes)) + return; + + if (!fgraph_no_sleep_time || tracer_flags_is_set(tr, TRACE_GRAPH_SLEEP_TI= ME)) return; =20 ftimes->calltime +=3D current->ftrace_sleeptime - ftimes->sleeptime; @@ -364,7 +372,7 @@ void trace_graph_return(struct ftrace_graph_ret *trace, if (!ftimes) return; =20 - handle_nosleeptime(trace, ftimes, size); + handle_nosleeptime(tr, trace, ftimes, size); =20 calltime =3D ftimes->calltime; =20 @@ -377,6 +385,7 @@ static void trace_graph_thresh_return(struct ftrace_gra= ph_ret *trace, struct ftrace_regs *fregs) { struct fgraph_times *ftimes; + struct trace_array *tr; int size; =20 ftrace_graph_addr_finish(gops, trace); @@ -390,7 +399,8 @@ static void trace_graph_thresh_return(struct ftrace_gra= ph_ret *trace, if (!ftimes) return; =20 - handle_nosleeptime(trace, ftimes, size); + tr =3D gops->private; + handle_nosleeptime(tr, trace, ftimes, size); =20 if (tracing_thresh && (trace_clock_local() - ftimes->calltime < tracing_thresh)) @@ -452,6 +462,9 @@ static int graph_trace_init(struct trace_array *tr) if (!tracer_flags_is_set(tr, TRACE_GRAPH_PRINT_IRQS)) ftrace_graph_skip_irqs++; =20 + if (!tracer_flags_is_set(tr, TRACE_GRAPH_SLEEP_TIME)) + fgraph_no_sleep_time++; + /* Make gops functions visible before we start tracing */ smp_mb(); =20 @@ -494,6 +507,11 @@ static void graph_trace_reset(struct trace_array *tr) if (WARN_ON_ONCE(ftrace_graph_skip_irqs < 0)) ftrace_graph_skip_irqs =3D 0; =20 + if (!tracer_flags_is_set(tr, TRACE_GRAPH_SLEEP_TIME)) + fgraph_no_sleep_time--; + if (WARN_ON_ONCE(fgraph_no_sleep_time < 0)) + fgraph_no_sleep_time =3D 0; + tracing_stop_cmdline_record(); unregister_ftrace_graph(tr->gops); } @@ -1619,8 +1637,24 @@ void graph_trace_close(struct trace_iterator *iter) static int func_graph_set_flag(struct trace_array *tr, u32 old_flags, u32 bit, int se= t) { - if (bit =3D=3D TRACE_GRAPH_SLEEP_TIME) - ftrace_graph_sleep_time_control(set); +/* + * The function profiler gets updated even if function graph + * isn't the current tracer. Handle it separately. + */ +#ifdef CONFIG_FUNCTION_PROFILER + if (bit =3D=3D TRACE_GRAPH_SLEEP_TIME && (tr->flags & TRACE_ARRAY_FL_GLOB= AL) && + !!set =3D=3D fprofile_no_sleep_time) { + if (set) { + fgraph_no_sleep_time--; + if (WARN_ON_ONCE(fgraph_no_sleep_time < 0)) + fgraph_no_sleep_time =3D 0; + fprofile_no_sleep_time =3D false; + } else { + fgraph_no_sleep_time++; + fprofile_no_sleep_time =3D true; + } + } +#endif =20 /* Do nothing if the current tracer is not this tracer */ if (tr->current_trace !=3D &graph_trace) @@ -1630,6 +1664,16 @@ func_graph_set_flag(struct trace_array *tr, u32 old_= flags, u32 bit, int set) if (!!set =3D=3D !!(tr->current_trace_flags->val & bit)) return 0; =20 + if (bit =3D=3D TRACE_GRAPH_SLEEP_TIME) { + if (set) { + fgraph_no_sleep_time--; + if (WARN_ON_ONCE(fgraph_no_sleep_time < 0)) + fgraph_no_sleep_time =3D 0; + } else { + fgraph_no_sleep_time++; + } + } + if (bit =3D=3D TRACE_GRAPH_PRINT_IRQS) { if (set) ftrace_graph_skip_irqs--; --=20 2.51.0 From nobody Sun Feb 8 11:26:40 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3A2BA2F530A for ; Sat, 15 Nov 2025 14:09:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763215757; cv=none; b=mw/IlVZsoh0WRwFuUmo4j4f7vLNcAU/A5cMBFTqQBDdzOMg0LJomh15dmra6jmxuQ+cf2tiW4VT6CIt2AZy5NxbPZwmOH5mJmLjc/CIG+CrANQbsbowu/Cmc5OByCgn8wtwZozwVyeMOYS2Qdw5AxG6vjxHNJ5PeaSHIykrEgKI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763215757; c=relaxed/simple; bh=U1imZqAOzucoubOP8HAnl0jgyb0CJHci3SamgjNwAf4=; h=Message-ID:Date:From:To:Cc:Subject:References:MIME-Version: Content-Type; b=HjBPJbIPPIAwpjuFpCpxNwamRLu5LRFQvYI+WSE/lzHrvU2JVMhFZzOxRvuGcKbUXNIjFXAyJQuFWe3gXkCGsyKHRQ2UjfpK5a1EXEooJKZeui3ZBEUvf9Gf3ERoD/VsIY3CJjtnYeNJRLLB6aRGTVpoGzwlIAjGACe6vunw2nI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=S0qvR1uA; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="S0qvR1uA" Received: by smtp.kernel.org (Postfix) with ESMTPSA id D778AC19425; Sat, 15 Nov 2025 14:09:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1763215756; bh=U1imZqAOzucoubOP8HAnl0jgyb0CJHci3SamgjNwAf4=; h=Date:From:To:Cc:Subject:References:From; b=S0qvR1uAecdWcopp6u4Qodo4uas3fHBejvbyRoMjsu1ZhZiM4r9Boct46oOZRZMT3 578jECwNfcJQe6hn3ClOJpTEQViI2NP2TS3yurjheywDQp9fDpM0pthImUR+JKcgTE cEyxRiWltADRJUxeb0qwM22KEqm/Jt46Wuh9P8B7X8C4R3XYN5vy5RqpdXYX0zhFpa PSpHO7oAMklRzjE2AICi7B5nVDXg3xs+r5N/jaku+wtjUpKDxPN24HAprN7tbdnbD0 7J9SW1FXerhUpbSKwXDRZ/ktSVSXW00hLi0dL26NC92hfLwl9W/XORgVrPUHh43qj9 qkgo7scbloqcg== Received: from rostedt by gandalf with local (Exim 4.98.2) (envelope-from ) id 1vKGy9-00000002Aum-1By0; Sat, 15 Nov 2025 09:09:37 -0500 Message-ID: <20251115140937.144515988@kernel.org> User-Agent: quilt/0.68 Date: Sat, 15 Nov 2025 09:09:15 -0500 From: Steven Rostedt To: linux-kernel@vger.kernel.org Cc: Masami Hiramatsu , Mark Rutland , Mathieu Desnoyers , Andrew Morton Subject: [for-next][PATCH 5/5] tracing: Convert function graph set_flags() to use a switch() statement References: <20251115140910.386662473@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Steven Rostedt Currently the set_flags() of the function graph tracer has a bunch of: if (bit =3D=3D FLAG1) { [..] } if (bit =3D=3D FLAG2) { [..] } To clean it up a bit, convert it over to a switch statement. Cc: Masami Hiramatsu Cc: Mark Rutland Cc: Mathieu Desnoyers Cc: Andrew Morton Link: https://patch.msgid.link/20251114192319.117123664@kernel.org Signed-off-by: Steven Rostedt (Google) --- kernel/trace/trace_functions_graph.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/kernel/trace/trace_functions_graph.c b/kernel/trace/trace_func= tions_graph.c index 12315eb65925..44d5dc5031e2 100644 --- a/kernel/trace/trace_functions_graph.c +++ b/kernel/trace/trace_functions_graph.c @@ -1664,7 +1664,8 @@ func_graph_set_flag(struct trace_array *tr, u32 old_f= lags, u32 bit, int set) if (!!set =3D=3D !!(tr->current_trace_flags->val & bit)) return 0; =20 - if (bit =3D=3D TRACE_GRAPH_SLEEP_TIME) { + switch (bit) { + case TRACE_GRAPH_SLEEP_TIME: if (set) { fgraph_no_sleep_time--; if (WARN_ON_ONCE(fgraph_no_sleep_time < 0)) @@ -1672,19 +1673,20 @@ func_graph_set_flag(struct trace_array *tr, u32 old= _flags, u32 bit, int set) } else { fgraph_no_sleep_time++; } - } + break; =20 - if (bit =3D=3D TRACE_GRAPH_PRINT_IRQS) { + case TRACE_GRAPH_PRINT_IRQS: if (set) ftrace_graph_skip_irqs--; else ftrace_graph_skip_irqs++; if (WARN_ON_ONCE(ftrace_graph_skip_irqs < 0)) ftrace_graph_skip_irqs =3D 0; - } + break; =20 - if (bit =3D=3D TRACE_GRAPH_ARGS) + case TRACE_GRAPH_ARGS: return ftrace_graph_trace_args(tr, set); + } =20 return 0; } --=20 2.51.0