From nobody Sat Feb 7 17:55:27 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 CCE3B2D595D; Fri, 14 Nov 2025 19:23:00 +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=1763148180; cv=none; b=MTJrS8kZ3WTfECbQqC/bOOzIHFgVXoS/rtExZd9jphAJ30Ja1a4em677j+IIKvGEILZpqGyj+/5grY8GTwKJ2jhM0VoBlNNPFLUlONhHq1z2uwvUiO7X8NuC3VVZ/4vWjzdDH6sRIuvV+nb/wDqvrwcDaQ2a8hezHgVxjKC+xbM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763148180; c=relaxed/simple; bh=+Zkc7CFdjwsh53Uw+ky0k7Ftc5rFO3cpR5Z83cqWyNk=; h=Message-ID:Date:From:To:Cc:Subject:References:MIME-Version: Content-Type; b=sz4gyItPD18NPw9hps5vbv/417HaMd/8VYt+UANGMOevWz/9LxDClZbkUb4BoE3eSW4BcNeC3B/uZHJqg1JseOoRFFcVvDjdSxtfqjFn+p7HUyYTaTpxONhCydBgOFFGAS8RaE/Cd5jYAL/Mjh8N+cZCMX63zXlMFyK28D3T6FU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=lYl6ESo+; 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="lYl6ESo+" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 5F9B6C4CEF8; Fri, 14 Nov 2025 19:23:00 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1763148180; bh=+Zkc7CFdjwsh53Uw+ky0k7Ftc5rFO3cpR5Z83cqWyNk=; h=Date:From:To:Cc:Subject:References:From; b=lYl6ESo+Kd/fwDaLRhAxZa96KBnrGy5vYM2Hfnt4BwRJTctX3kx5C/jJDOwtFYLaS 22lf+1J7ZPxoPBUQrSS2lL3cbyat3yGy7tOL8m+ezCANHspGgjE1rrFduIS+u8/PaN QVK7hk6dygFhaK5qeBqT1yuKN7nhEr3LS7LXbavF5ziP8SGX+FOLOhhkUrezXvaSid N0IJMLd+s4NBUUwZnpuqQ7bBSm7x3DI204XsfIZ0nP8CCThUwckTPb7FrSPUH6AFsm vdzMEw4xmQZc8FKqNab8I8TSYQCkKDgI4CmMIbtziz8QPATj9senW8FGzLwic7fDq1 kPVcQ4GQkXl+w== Received: from rostedt by gandalf with local (Exim 4.98.2) (envelope-from ) id 1vJzOA-00000001p84-3Bxv; Fri, 14 Nov 2025 14:23:18 -0500 Message-ID: <20251114192318.613867934@kernel.org> User-Agent: quilt/0.68 Date: Fri, 14 Nov 2025 14:22:30 -0500 From: Steven Rostedt To: linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org Cc: Masami Hiramatsu , Mark Rutland , Mathieu Desnoyers , Andrew Morton Subject: [PATCH 1/4] tracing: Have function graph tracer option funcgraph-irqs be per instance References: <20251114192229.829042264@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. 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 Sat Feb 7 17:55:27 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 046262F0C7C; Fri, 14 Nov 2025 19:23:00 +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=1763148181; cv=none; b=DYexwoacJGCWG4yt5u1GfMGLf0smOeqHgoU5qFFmNvbok9Q2zKKvKMC2rf+MX38Kzcxyz/w3yy9OVh/RTZ4IuWjdkDMY2jLrTGo0s0x4gCaClR6DO/QTLUplw1yc2wr+8evgBMU1r2JYwNyjK/G/RAq2gaA0jhF8TbBVLzI0j9U= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763148181; c=relaxed/simple; bh=PVgrYQ5KGD7dADyqvB1WQz0bU0jVkV7FpTxE3x/icRQ=; h=Message-ID:Date:From:To:Cc:Subject:References:MIME-Version: Content-Type; b=Ef5xT41a/sVDj8ssYGoGe3zz3DGsqggGaF6xbxXYHKADsBQ7O/VSxQOMKM8k4HN71y5oJecsj+bwHYzwbdzhbxRUGb1oCwcoevBEtNXHezUyU74rLAn6VEGNF+CzHUdlMIt11WapqlwFKFzi4q8YK8dA+n/eU9ku/zP5Dv/7LMA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=JiGmyEAz; 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="JiGmyEAz" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 690E9C113D0; Fri, 14 Nov 2025 19:23:00 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1763148180; bh=PVgrYQ5KGD7dADyqvB1WQz0bU0jVkV7FpTxE3x/icRQ=; h=Date:From:To:Cc:Subject:References:From; b=JiGmyEAz9jZwEZ+gUwonQsmUTo/MwUgk+3i9rCAFNZRxCqqt9xyCZ2SJMZWlHbcYm Oboytc/fanAlAsfiwRELwidXQVdPgHf3cjtAA+roaiCAph5XyDpVUmVY4MqZhmHBTq EH/H4UVjR6KbWfzPJxOg8XAP90Im7sbv9IluHuvI1I0qpJ+Zrv18B/R0y/q+RkklZ5 3eFW5p+2SxsRwS0Pdi2pjMjkxM+GqWnUnR08ok6hg1XKBRUJxhdTOoHVZ+w9Co3tsT Kt6c0GXR4QJWAI9cB17kxNtnIhxvrNEF4UKIKOhHUsm27o8Se0OvSRGXkKwsBOB4L6 c1ZLwO+BZyjQA== Received: from rostedt by gandalf with local (Exim 4.98.2) (envelope-from ) id 1vJzOA-00000001p8Y-3tfg; Fri, 14 Nov 2025 14:23:18 -0500 Message-ID: <20251114192318.781711154@kernel.org> User-Agent: quilt/0.68 Date: Fri, 14 Nov 2025 14:22:31 -0500 From: Steven Rostedt To: linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org Cc: Masami Hiramatsu , Mark Rutland , Mathieu Desnoyers , Andrew Morton Subject: [PATCH 2/4] tracing: Move graph-time out of function graph options References: <20251114192229.829042264@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. 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 Sat Feb 7 17:55:27 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 046AC2F0C7F; Fri, 14 Nov 2025 19:23:00 +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=1763148181; cv=none; b=daSvVLuV+50SSWLoUzQ3HOJ6mtSr+WEDwFA8xRvS1mstKoGdOYyyHAQLpTYvowbtRTvg42RASJecLn2/ujcTlz7F2a3z+roAw9yKYchpgknHFdSFChsQk3yWVD4bmz2KeqVCcoM0e7keBSs6Bx50HX4dXtskTEZ/iQ78qGtlvcg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763148181; c=relaxed/simple; bh=3S/XwAFsk6FcTU+x67JTdQ+SP7uURqCbol3zO7ZOPjw=; h=Message-ID:Date:From:To:Cc:Subject:References:MIME-Version: Content-Type; b=nGC4sUiVxfSTS4GvJ4PE/Bf/TchHDyOWFQmKXlcUzS/i1A0A5Q4cuj7bHf2F83Wo+CEvdTyaTTNepU+5fvFk4O524oRDRH1TwFUHLoP4qn0r8nebr14E7zsVZeqqV9ub1NU/BezcoNJLhRB/iSXrp6HQxkymxuKoIQU8B1wY3yE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=gliiENBW; 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="gliiENBW" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 9A4D2C116D0; Fri, 14 Nov 2025 19:23:00 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1763148180; bh=3S/XwAFsk6FcTU+x67JTdQ+SP7uURqCbol3zO7ZOPjw=; h=Date:From:To:Cc:Subject:References:From; b=gliiENBWJ5EIN2wIlkM+AJOIgVNaj5UoCSBSIA/A47uxZMaJNnNeHONCROivMM4jx 85ri4i3ZP2+2eU80A6PHFxftF7wEmB5IxYLKhRekNkUEm9AYQ5iuJsTfWZalqO12aP ECTvJxiQy3FBidi9EU9IbIYPM3RhMO2cwxbWQzm6MuQZ/Mvmpe9wVZYG2oe1P38iJt 3RGE6Gg+puCz0H/xyFevRIeelssRluLl59Cn+Ymy8JRaHnW11W386Ql2KIkQeZ+ysM IctmPduPAAyHzJeO06FmuPlh7aQrzCLuEa68+Nb3OVEU0oZxSgNFUIjfa4PD0Zcr8u 3mgdjt2zsK6KA== Received: from rostedt by gandalf with local (Exim 4.98.2) (envelope-from ) id 1vJzOB-00000001p92-0PJu; Fri, 14 Nov 2025 14:23:19 -0500 Message-ID: <20251114192318.950255167@kernel.org> User-Agent: quilt/0.68 Date: Fri, 14 Nov 2025 14:22:32 -0500 From: Steven Rostedt To: linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org Cc: Masami Hiramatsu , Mark Rutland , Mathieu Desnoyers , Andrew Morton Subject: [PATCH 3/4] tracing: Have function graph tracer option sleep-time be per instance References: <20251114192229.829042264@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. 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 Sat Feb 7 17:55:27 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 33BC92F12CF; Fri, 14 Nov 2025 19:23:00 +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=1763148181; cv=none; b=iemKEJhQrgFgQ954e868Dt3mtPZh46yGYAJRXKmTXFFRH+KhxnPh9KT3Y41m2WcmaZSns4vaqEJo7g6Ki0iWpoQRomtMdLhkjV5i98HMoVNNnxz0p10fOYRQ3a+rg0nIO6wvhO/MH10ZuIYnEK2F/+vSU6sA2YmJ3XAYjngliXU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763148181; c=relaxed/simple; bh=q+p/ydHkrE15q7zh6goHjjrRvmWFN9DIXiJYtL0jZkg=; h=Message-ID:Date:From:To:Cc:Subject:References:MIME-Version: Content-Type; b=AvYLvEPrrFuyQDC4Tah233fgi3ALcqJWKww50fcaT81wjYp8kqG24EiVDoMOJTAwf5QyaqiyQvKbzR9bPsmiUTZEXDEJzhAzUOdQo6l8jhjnNGHdPiczuDba0i+VhIn9VloNs3v/opdQZU/gBQC+VBVE0ytYsPJEONZomA8WwZ8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=kzDY8r6u; 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="kzDY8r6u" Received: by smtp.kernel.org (Postfix) with ESMTPSA id BD1E3C19422; Fri, 14 Nov 2025 19:23:00 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1763148180; bh=q+p/ydHkrE15q7zh6goHjjrRvmWFN9DIXiJYtL0jZkg=; h=Date:From:To:Cc:Subject:References:From; b=kzDY8r6u6T8Ly13owgnfoEgukQnH3nPzmKHexMbqNVAJ46otozKebmMmdbxGaEaoZ VmEiHscVZj9Bgrfr5Lo4ZEs407DiBzVIs1VdXmq2VrSX1P0S3kdAbjdrDiK16KRAzs iNJZvOWlwt+pzPyV0jhC7LEwE4Kj+NmpFDbrGNYThsrAIG2wycRbqY6zO37/83Uc9L OWXPDFmImHm/+MyNwXEnLbZjypgXBfeWmWLnj+M5DhB2zCqMnXxHgpmMf8Fp5MXWl1 miQPeNFJHqQ6KVfyHWYSk39buGcclnTidXOBg/uxkjVGX9sfPXubBSUMSbA+JfpNXz V/hmPOOZycHBw== Received: from rostedt by gandalf with local (Exim 4.98.2) (envelope-from ) id 1vJzOB-00000001p9W-16bS; Fri, 14 Nov 2025 14:23:19 -0500 Message-ID: <20251114192319.117123664@kernel.org> User-Agent: quilt/0.68 Date: Fri, 14 Nov 2025 14:22:33 -0500 From: Steven Rostedt To: linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org Cc: Masami Hiramatsu , Mark Rutland , Mathieu Desnoyers , Andrew Morton Subject: [PATCH 4/4] tracing: Convert function graph set_flags() to use a switch() statement References: <20251114192229.829042264@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. 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