On Thu, 22 Jan 2026 20:38:22 -0500 Steven Rostedt <[email protected]> wrote:
> From: Steven Rostedt <[email protected]> > > 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: 0000000043d62762 > > 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) <[email protected]> Thanks, > > Signed-off-by: Steven Rostedt (Google) <[email protected]> > --- > 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 seq_file *m, > unsigned long flags) > { > @@ -5909,6 +5921,7 @@ static int hist_field_debug_show(struct seq_file *m, > seq_printf(m, " type: %s\n", field->type); > seq_printf(m, " size: %u\n", field->size); > seq_printf(m, " is_signed: %u\n", field->is_signed); > + seq_printf(m, " function: hist_field_%s()\n", > field_funcs[field->fn_num]); > > return 0; > } > -- > 2.51.0 > -- Masami Hiramatsu (Google) <[email protected]>
