Re: [PATCH] tracing: Have hist_debug show what function a field uses

2026-01-28 Thread Google
On Thu, 22 Jan 2026 20:38:22 -0500
Steven Rostedt  wrote:

> From: Steven Rostedt 
> 
> When CONFIG_HIST_TRIGGERS_DEBUG is enabled, each trace event has a
> "hist_debug" file that explains the histogram internal data. This is very
> useful for debugging histograms.
> 
> One bit of data that was missing from this file was what function a
> histogram field uses to process its data. The hist_field structure now has
> a fn_num that is used by a switch statement in hist_fn_call() to call a
> function directly (to avoid spectre mitigations).
> 
> Instead of displaying that number, create a string array that maps to the
> histogram function enums so that the function for a field may be
> displayed:
> 
>  ~# cat /sys/kernel/tracing/events/sched/sched_switch/hist_debug
> [..]
> hist_data: 43d62762
> 
>   n_vals: 2
>   n_keys: 1
>   n_fields: 3
> 
>   val fields:
> 
> hist_data->fields[0]:
>   flags:
> VAL: HIST_FIELD_FL_HITCOUNT
>   type: u64
>   size: 8
>   is_signed: 0
>   function: hist_field_counter()
> 
> hist_data->fields[1]:
>   flags:
> HIST_FIELD_FL_VAR
>   var.name: __arg_3921_2
>   var.idx (into tracing_map_elt.vars[]): 0
>   type: unsigned long[]
>   size: 128
>   is_signed: 0
>   function: hist_field_nop()
> 
>   key fields:
> 
> hist_data->fields[2]:
>   flags:
> HIST_FIELD_FL_KEY
>   ftrace_event_field name: prev_pid
>   type: pid_t
>   size: 8
>   is_signed: 1
>   function: hist_field_s32()
> 
> The "function:" field above is added.

Looks good to me.

Acked-by: Masami Hiramatsu (Google) 

Thanks,


> 
> Signed-off-by: Steven Rostedt (Google) 
> ---
>  kernel/trace/trace_events_hist.c | 75 +++-
>  1 file changed, 44 insertions(+), 31 deletions(-)
> 
> diff --git a/kernel/trace/trace_events_hist.c 
> b/kernel/trace/trace_events_hist.c
> index 4a7f945e368d..24441b30a1a4 100644
> --- a/kernel/trace/trace_events_hist.c
> +++ b/kernel/trace/trace_events_hist.c
> @@ -105,38 +105,44 @@ enum field_op_id {
>   FIELD_OP_MULT,
>  };
>  
> +#define FIELD_FUNCS  \
> + C(NOP,  "nop"), \
> + C(VAR_REF,  "var_ref"), \
> + C(COUNTER,  "counter"), \
> + C(CONST,"const"),   \
> + C(LOG2, "log2"),\
> + C(BUCKET,   "bucket"),  \
> + C(TIMESTAMP,"timestamp"),   \
> + C(CPU,  "cpu"), \
> + C(COMM, "comm"),\
> + C(STRING,   "string"),  \
> + C(DYNSTRING,"dynstring"),   \
> + C(RELDYNSTRING, "reldynstring"),\
> + C(PSTRING,  "pstring"), \
> + C(S64,  "s64"), \
> + C(U64,  "u64"), \
> + C(S32,  "s32"), \
> + C(U32,  "u32"), \
> + C(S16,  "s16"), \
> + C(U16,  "u16"), \
> + C(S8,   "s8"),  \
> + C(U8,   "u8"),  \
> + C(UMINUS,   "uminus"),  \
> + C(MINUS,"minus"),   \
> + C(PLUS, "plus"),\
> + C(DIV,  "div"), \
> + C(MULT, "mult"),\
> + C(DIV_POWER2,   "div_power2"),  \
> + C(DIV_NOT_POWER2,   "div_not_power2"),  \
> + C(DIV_MULT_SHIFT,   "div_mult_shift"),  \
> + C(EXECNAME, "execname"),\
> + C(STACK,"stack"),
> +
> +#undef C
> +#define C(a, b)  HIST_FIELD_FN_##a
> +
>  enum hist_field_fn {
> - HIST_FIELD_FN_NOP,
> - HIST_FIELD_FN_VAR_REF,
> - HIST_FIELD_FN_COUNTER,
> - HIST_FIELD_FN_CONST,
> - HIST_FIELD_FN_LOG2,
> - HIST_FIELD_FN_BUCKET,
> - HIST_FIELD_FN_TIMESTAMP,
> - HIST_FIELD_FN_CPU,
> - HIST_FIELD_FN_COMM,
> - HIST_FIELD_FN_STRING,
> - HIST_FIELD_FN_DYNSTRING,
> - HIST_FIELD_FN_RELDYNSTRING,
> - HIST_FIELD_FN_PSTRING,
> - HIST_FIELD_FN_S64,
> - HIST_FIELD_FN_U64,
> - HIST_FIELD_FN_S32,
> - HIST_FIELD_FN_U32,
> - HIST_FIELD_FN_S16,
> - HIST_FIELD_FN_U16,
> - HIST_FIELD_FN_S8,
> - HIST_FIELD_FN_U8,
> - HIST_FIELD_FN_UMINUS,
> - HIST_FIELD_FN_MINUS,
> - HIST_FIELD_FN_PLUS,
> - HIST_FIELD_FN_DIV,
> - HIST_FIELD_FN_MULT,
> - HIST_FIELD_FN_DIV_POWER2,
> - HIST_FIELD_FN_DIV_NOT_POWER2,
> - HIST_FIELD_FN_DIV_MULT_SHIFT,
> - HIST_FIELD_FN_EXECNAME,
> - HIST_FIELD_FN_STACK,
> + FIELD_FUNCS
>  };
>  

Re: [PATCH] tracing: Have hist_debug show what function a field uses

2026-01-25 Thread Tom Zanussi
Hi Steve,

On Thu, 2026-01-22 at 20:38 -0500, Steven Rostedt wrote:
> From: Steven Rostedt 
> 
> When CONFIG_HIST_TRIGGERS_DEBUG is enabled, each trace event has a
> "hist_debug" file that explains the histogram internal data. This is very
> useful for debugging histograms.
> 
> One bit of data that was missing from this file was what function a
> histogram field uses to process its data. The hist_field structure now has
> a fn_num that is used by a switch statement in hist_fn_call() to call a
> function directly (to avoid spectre mitigations).
> 
> Instead of displaying that number, create a string array that maps to the
> histogram function enums so that the function for a field may be
> displayed:
> 
>  ~# cat /sys/kernel/tracing/events/sched/sched_switch/hist_debug
> [..]
> hist_data: 43d62762
> 
>   n_vals: 2
>   n_keys: 1
>   n_fields: 3
> 
>   val fields:
> 
>     hist_data->fields[0]:
>   flags:
>     VAL: HIST_FIELD_FL_HITCOUNT
>   type: u64
>   size: 8
>   is_signed: 0
>   function: hist_field_counter()
> 
>     hist_data->fields[1]:
>   flags:
>     HIST_FIELD_FL_VAR
>   var.name: __arg_3921_2
>   var.idx (into tracing_map_elt.vars[]): 0
>   type: unsigned long[]
>   size: 128
>   is_signed: 0
>   function: hist_field_nop()
> 
>   key fields:
> 
>     hist_data->fields[2]:
>   flags:
>     HIST_FIELD_FL_KEY
>   ftrace_event_field name: prev_pid
>   type: pid_t
>   size: 8
>   is_signed: 1
>   function: hist_field_s32()
> 
> The "function:" field above is added.
> 
> Signed-off-by: Steven Rostedt (Google) 

Nice and useful addition, thanks!

Reviewed-by: Tom Zanussi 
Tested-by: Tom Zanussi 

Tom

> ---
>  kernel/trace/trace_events_hist.c | 75 +++-
>  1 file changed, 44 insertions(+), 31 deletions(-)
> 
> diff --git a/kernel/trace/trace_events_hist.c 
> b/kernel/trace/trace_events_hist.c
> index 4a7f945e368d..24441b30a1a4 100644
> --- a/kernel/trace/trace_events_hist.c
> +++ b/kernel/trace/trace_events_hist.c
> @@ -105,38 +105,44 @@ enum field_op_id {
>   FIELD_OP_MULT,
>  };
>  
> +#define FIELD_FUNCS  \
> + C(NOP,  "nop"), \
> + C(VAR_REF,  "var_ref"), \
> + C(COUNTER,  "counter"), \
> + C(CONST,"const"),   \
> + C(LOG2, "log2"),\
> + C(BUCKET,   "bucket"),  \
> + C(TIMESTAMP,"timestamp"),   \
> + C(CPU,  "cpu"), \
> + C(COMM, "comm"),\
> + C(STRING,   "string"),  \
> + C(DYNSTRING,"dynstring"),   \
> + C(RELDYNSTRING, "reldynstring"),\
> + C(PSTRING,  "pstring"), \
> + C(S64,  "s64"), \
> + C(U64,  "u64"), \
> + C(S32,  "s32"), \
> + C(U32,  "u32"), \
> + C(S16,  "s16"), \
> + C(U16,  "u16"), \
> + C(S8,   "s8"),  \
> + C(U8,   "u8"),  \
> + C(UMINUS,   "uminus"),  \
> + C(MINUS,"minus"),   \
> + C(PLUS, "plus"),\
> + C(DIV,  "div"), \
> + C(MULT, "mult"),\
> + C(DIV_POWER2,   "div_power2"),  \
> + C(DIV_NOT_POWER2,   "div_not_power2"),  \
> + C(DIV_MULT_SHIFT,   "div_mult_shift"),  \
> + C(EXECNAME, "execname"),\
> + C(STACK,"stack"),
> +
> +#undef C
> +#define C(a, b)  HIST_FIELD_FN_##a
> +
>  enum hist_field_fn {
> - HIST_FIELD_FN_NOP,
> - HIST_FIELD_FN_VAR_REF,
> - HIST_FIELD_FN_COUNTER,
> - HIST_FIELD_FN_CONST,
> - HIST_FIELD_FN_LOG2,
> - HIST_FIELD_FN_BUCKET,
> - HIST_FIELD_FN_TIMESTAMP,
> - HIST_FIELD_FN_CPU,
> - HIST_FIELD_FN_COMM,
> - HIST_FIELD_FN_STRING,
> - HIST_FIELD_FN_DYNSTRING,
> - HIST_FIELD_FN_RELDYNSTRING,
> - HIST_FIELD_FN_PSTRING,
> - HIST_FIELD_FN_S64,
> - HIST_FIELD_FN_U64,
> - HIST_FIELD_FN_S32,
> - HIST_FIELD_FN_U32,
> - HIST_FIELD_FN_S16,
> - HIST_FIELD_FN_U16,
> - HIST_FIELD_FN_S8,
> - HIST_FIELD_FN_U8,
> - HIST_FIELD_FN_UMINUS,
> - HIST_FIELD_FN_MINUS,
> - HIST_FIELD_FN_PLUS,
> - HIST_FIELD_FN_DIV,
> - HIST_FIELD_FN_MULT,
> - HIST_FIELD_FN_DIV_POWER2,
> - HIST_FIELD_FN_DIV_NOT_POWER2,
> - HIST_FIELD_FN_DIV_MULT_SHIFT,
> - HIST_FIELD_FN_EXECNAME,
> - HIST_FIELD_FN_STA

[PATCH] tracing: Have hist_debug show what function a field uses

2026-01-22 Thread Steven Rostedt
From: Steven Rostedt 

When CONFIG_HIST_TRIGGERS_DEBUG is enabled, each trace event has a
"hist_debug" file that explains the histogram internal data. This is very
useful for debugging histograms.

One bit of data that was missing from this file was what function a
histogram field uses to process its data. The hist_field structure now has
a fn_num that is used by a switch statement in hist_fn_call() to call a
function directly (to avoid spectre mitigations).

Instead of displaying that number, create a string array that maps to the
histogram function enums so that the function for a field may be
displayed:

 ~# cat /sys/kernel/tracing/events/sched/sched_switch/hist_debug
[..]
hist_data: 43d62762

  n_vals: 2
  n_keys: 1
  n_fields: 3

  val fields:

hist_data->fields[0]:
  flags:
VAL: HIST_FIELD_FL_HITCOUNT
  type: u64
  size: 8
  is_signed: 0
  function: hist_field_counter()

hist_data->fields[1]:
  flags:
HIST_FIELD_FL_VAR
  var.name: __arg_3921_2
  var.idx (into tracing_map_elt.vars[]): 0
  type: unsigned long[]
  size: 128
  is_signed: 0
  function: hist_field_nop()

  key fields:

hist_data->fields[2]:
  flags:
HIST_FIELD_FL_KEY
  ftrace_event_field name: prev_pid
  type: pid_t
  size: 8
  is_signed: 1
  function: hist_field_s32()

The "function:" field above is added.

Signed-off-by: Steven Rostedt (Google) 
---
 kernel/trace/trace_events_hist.c | 75 +++-
 1 file changed, 44 insertions(+), 31 deletions(-)

diff --git a/kernel/trace/trace_events_hist.c b/kernel/trace/trace_events_hist.c
index 4a7f945e368d..24441b30a1a4 100644
--- a/kernel/trace/trace_events_hist.c
+++ b/kernel/trace/trace_events_hist.c
@@ -105,38 +105,44 @@ enum field_op_id {
FIELD_OP_MULT,
 };
 
+#define FIELD_FUNCS\
+   C(NOP,  "nop"), \
+   C(VAR_REF,  "var_ref"), \
+   C(COUNTER,  "counter"), \
+   C(CONST,"const"),   \
+   C(LOG2, "log2"),\
+   C(BUCKET,   "bucket"),  \
+   C(TIMESTAMP,"timestamp"),   \
+   C(CPU,  "cpu"), \
+   C(COMM, "comm"),\
+   C(STRING,   "string"),  \
+   C(DYNSTRING,"dynstring"),   \
+   C(RELDYNSTRING, "reldynstring"),\
+   C(PSTRING,  "pstring"), \
+   C(S64,  "s64"), \
+   C(U64,  "u64"), \
+   C(S32,  "s32"), \
+   C(U32,  "u32"), \
+   C(S16,  "s16"), \
+   C(U16,  "u16"), \
+   C(S8,   "s8"),  \
+   C(U8,   "u8"),  \
+   C(UMINUS,   "uminus"),  \
+   C(MINUS,"minus"),   \
+   C(PLUS, "plus"),\
+   C(DIV,  "div"), \
+   C(MULT, "mult"),\
+   C(DIV_POWER2,   "div_power2"),  \
+   C(DIV_NOT_POWER2,   "div_not_power2"),  \
+   C(DIV_MULT_SHIFT,   "div_mult_shift"),  \
+   C(EXECNAME, "execname"),\
+   C(STACK,"stack"),
+
+#undef C
+#define C(a, b)HIST_FIELD_FN_##a
+
 enum hist_field_fn {
-   HIST_FIELD_FN_NOP,
-   HIST_FIELD_FN_VAR_REF,
-   HIST_FIELD_FN_COUNTER,
-   HIST_FIELD_FN_CONST,
-   HIST_FIELD_FN_LOG2,
-   HIST_FIELD_FN_BUCKET,
-   HIST_FIELD_FN_TIMESTAMP,
-   HIST_FIELD_FN_CPU,
-   HIST_FIELD_FN_COMM,
-   HIST_FIELD_FN_STRING,
-   HIST_FIELD_FN_DYNSTRING,
-   HIST_FIELD_FN_RELDYNSTRING,
-   HIST_FIELD_FN_PSTRING,
-   HIST_FIELD_FN_S64,
-   HIST_FIELD_FN_U64,
-   HIST_FIELD_FN_S32,
-   HIST_FIELD_FN_U32,
-   HIST_FIELD_FN_S16,
-   HIST_FIELD_FN_U16,
-   HIST_FIELD_FN_S8,
-   HIST_FIELD_FN_U8,
-   HIST_FIELD_FN_UMINUS,
-   HIST_FIELD_FN_MINUS,
-   HIST_FIELD_FN_PLUS,
-   HIST_FIELD_FN_DIV,
-   HIST_FIELD_FN_MULT,
-   HIST_FIELD_FN_DIV_POWER2,
-   HIST_FIELD_FN_DIV_NOT_POWER2,
-   HIST_FIELD_FN_DIV_MULT_SHIFT,
-   HIST_FIELD_FN_EXECNAME,
-   HIST_FIELD_FN_STACK,
+   FIELD_FUNCS
 };
 
 /*
@@ -5845,6 +5851,12 @@ const struct file_operations event_hist_fops = {
 };
 
 #ifdef CONFIG_HIST_TRIGGERS_DEBUG
+
+#undef C
+#define C(a, b)b
+
+static const char * const field_funcs[] = { FIELD_FUNCS };
+
 static void hist_field_debug_show_flags(struct se