]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
tracing: Pretty-print enum parameters in function arguments
authorDonglin Peng <pengdonglin@xiaomi.com>
Mon, 9 Feb 2026 07:19:49 +0000 (15:19 +0800)
committerSteven Rostedt (Google) <rostedt@goodmis.org>
Tue, 24 Mar 2026 00:28:54 +0000 (20:28 -0400)
Currently, print_function_args() prints enum parameter values
in decimal format, reducing trace log readability.

Use BTF information to resolve enum parameters and print their
symbolic names (where available). This improves readability by
showing meaningful identifiers instead of raw numbers.

Before:
  mod_memcg_lruvec_state(lruvec=0xffff..., idx=5, val=320)

After:
  mod_memcg_lruvec_state(lruvec=0xffff..., idx=5 [NR_SLAB_RECLAIMABLE_B], val=320)

Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Masami Hiramatsu <mhiramat@kernel.org>
Link: https://patch.msgid.link/20260209071949.4040193-1-dolinux.peng@gmail.com
Signed-off-by: Donglin Peng <pengdonglin@xiaomi.com>
Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
kernel/trace/trace_output.c

index 1996d7aba038327edb5e45a0687cbb914205f9bf..be0755400f9b622df42a99751ecfc6f7e99fba9a 100644 (file)
@@ -719,12 +719,13 @@ void print_function_args(struct trace_seq *s, unsigned long *args,
 {
        const struct btf_param *param;
        const struct btf_type *t;
+       const struct btf_enum *enums;
        const char *param_name;
        char name[KSYM_NAME_LEN];
        unsigned long arg;
        struct btf *btf;
        s32 tid, nr = 0;
-       int a, p, x;
+       int a, p, x, i;
        u16 encode;
 
        trace_seq_printf(s, "(");
@@ -778,6 +779,15 @@ void print_function_args(struct trace_seq *s, unsigned long *args,
                        break;
                case BTF_KIND_ENUM:
                        trace_seq_printf(s, "%ld", arg);
+                       enums = btf_enum(t);
+                       for (i = 0; i < btf_vlen(t); i++) {
+                               if (arg == enums[i].val) {
+                                       trace_seq_printf(s, " [%s]",
+                                                        btf_name_by_offset(btf,
+                                                        enums[i].name_off));
+                                       break;
+                               }
+                       }
                        break;
                default:
                        /* This does not handle complex arguments */