Re: [PATCH RESEND] libtraceevent: Pretty print function parameters of enum-type

Donglin Peng <[email protected]> Sat, 7 Feb 2026 13:04:02 +0800
Newsgroups org.kernel.vger.linux-trace-devel
Message-ID <CAErzpmt8EQXD_noaR+gsBaAV90xAQSMJ38BgBd_8r-Q_40-abA@mail.gmail.com>
On Fri, Feb 6, 2026 at 11:01=E2=80=AFPM Steven Rostedt <[email protected]=
> wrote:
>
> On Fri,  6 Feb 2026 17:15:12 +0800
> Donglin Peng <[email protected]> wrote:
>
> > From: Donglin Peng <[email protected]>
>
> Hi Donglin,
>
> >
> > The tep_btf_print_args() function currently prints values of
> > enum parameters in decimal format, which reduces readability.
> >
> > Utilize the BTF information to resolve enum type parameters
> > and print their symbolic names where possible. This enhances
> > the trace log readability by displaying meaningful identifiers
> > instead of raw numbers.
> >
> > Before:
> > mod_memcg_lruvec_state(lruvec=3D0xffff88800c18a540, idx=3D5, val=3D320)
> >
> > After:
> > mod_memcg_lruvec_state(lruvec=3D0xffff88800c18a540, idx=3D5 [NR_SLAB_RE=
CLAIMABLE_B], val=3D320)
> >
> > Cc: Steven Rostedt <[email protected]>
> > Cc: Masami Hiramatsu <[email protected]>
> > Signed-off-by: Donglin Peng <[email protected]>
> > ---
> >  src/trace-btf.c | 20 +++++++++++++++++++-
> >  1 file changed, 19 insertions(+), 1 deletion(-)
> >
> > diff --git a/src/trace-btf.c b/src/trace-btf.c
> > index 859b0860ce2a..85f5fefb4d3b 100644
> > --- a/src/trace-btf.c
> > +++ b/src/trace-btf.c
> > @@ -32,6 +32,16 @@ struct tep_btf {
> >  #define REALLOC_SIZE (1 << 10)
> >  #define REALLOC_MASK (REALLOC_SIZE - 1)
> >
> > +#define for_each_enum(i, enum_type, member)                  \
> > +     for (i =3D 0, member =3D btf_enum(enum_type);               \
> > +          i < BTF_INFO_VLEN(enum_type->info);                \
> > +          i++, member++)
>
>
> You can make the above into:
>
>  #define for_each_enum(enum_type, member)                       \
>         for (int __i =3D 0, member =3D btf_enum(enum_type);         \
>              __i < BTF_INFO_VLEN((enum_type)->info);            \
>              __i++, member++)
>
> Then you don't need to pass in the counter "i".

Sorry, I found that the previous change causes a build failure.

The error occurs in trace-btf.c:36:
warning: initialization of 'int' from 'struct btf_enum *' makes
integer from pointer without a cast [-Wint-conversion]
   36 |         for (int __i =3D 0, member =3D btf_enum(enum_type); \

This is due to the member variable being redefined as an int type,
conflicting with its assignment of a struct btf_enum *pointer from
btf_enum(enum_type).

>
> (also it's good to put parenthesis around "enum_type").
>
> > +
> > +static inline struct btf_enum *btf_enum(const struct btf_type *t)
> > +{
> > +     return (struct btf_enum *)(t + 1);
> > +}
> > +
> >  static const char *btf_name(struct tep_btf *btf, int off)
> >  {
> >       if (off < btf->hdr->str_len)
> > @@ -546,10 +556,11 @@ int tep_btf_print_args(struct tep_handle *tep, st=
ruct trace_seq *s, void *args,
> >       struct tep_btf *btf =3D tep->btf;
> >       struct btf_type *type =3D tep_btf_find_func(btf, func);
> >       struct btf_param *param;
> > +     struct btf_enum *enump;
> >       unsigned long long arg;
> >       unsigned int encode;
> >       const char *param_name;
> > -     int a, p, x, nr;
> > +     int a, p, x, nr, i;
>
> And the above doesn't need to be changed.
>
> Thanks,
>
> -- Steve
>
> >
> >       if (!func)
> >               return -1;
> > @@ -628,6 +639,13 @@ int tep_btf_print_args(struct tep_handle *tep, str=
uct trace_seq *s, void *args,
> >                       break;
> >               case BTF_KIND_ENUM:
> >                       trace_seq_printf(s, "%lld", arg);
> > +                     for_each_enum(i, t, enump) {
> > +                             if (arg =3D=3D enump->val) {
> > +                                     trace_seq_printf(s, " [%s]",
> > +                                             btf_name(btf, enump->name=
_off));
> > +                                     break;
> > +                             }
> > +                     }
> >                       break;
> >               default:
> >                       /* This does not handle complex arguments */
>