lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <CAK8ByeLuh9q24+Rm6CttHfF1ATpbbvyk5OUVxF9WRP-av9wr3Q@mail.gmail.com>
Date:   Thu, 14 Dec 2023 16:46:28 +0100
From:   Łukasz Bartosik <lb@...ihalf.com>
To:     jim.cromie@...il.com
Cc:     Jason Baron <jbaron@...mai.com>,
        Andrew Morton <akpm@...ux-foundation.org>,
        Kees Cook <keescook@...omium.org>,
        Douglas Anderson <dianders@...omium.org>,
        Guenter Roeck <groeck@...gle.com>,
        Yaniv Tzoreff <yanivt@...gle.com>,
        Benson Leung <bleung@...gle.com>,
        Steven Rostedt <rostedt@...dmis.org>,
        Vincent Whitchurch <vincent.whitchurch@...s.com>,
        Pekka Paalanen <ppaalanen@...il.com>,
        Sean Paul <seanpaul@...omium.org>,
        Daniel Vetter <daniel@...ll.ch>, linux-kernel@...r.kernel.org,
        upstream@...ihalf.com
Subject: Re: [PATCH v2 09/15] dyndbg: add trace destination field to _ddebug

czw., 14 gru 2023 o 08:10 <jim.cromie@...il.com> napisał(a):
>
> On Thu, Nov 30, 2023 at 4:41 PM Łukasz Bartosik <lb@...ihalf.com> wrote:
> >
> > Add trace destination field (trace_dst) to the _ddebug structure.
> > The trace destination field is used to determine output of debug
> > logs when +T is set. Setting trace_dst value to TRACE_DST_BITS(63)
> > enables output to prdbg and devdbg trace events. Setting trace_dst
> > value to a value in range of [0..62] enables output to trace instance.
> >
>
> FWIW, I think setting trace_dest = 0  maps naturally to global / event buf.
> The reason class_id DFLT is 63 is that DRM_UT_CORE is 0,
> and DFLT allowed it to remain unchanged.
>

I considered trace_dst value 0 to point to trace events but then I
realized that trace instance table (tr.inst) will be 1-based instead
of 0-based and
based on that I reserved trace destination maximum value (63 when
trace_dst width is 6 bits) for trace events. This simplified the
implementation.

>
> > Signed-off-by: Łukasz Bartosik <lb@...ihalf.com>
> > ---
> >  include/linux/dynamic_debug.h | 14 ++++++++++++--
> >  lib/dynamic_debug.c           | 28 +++++++++++++++++++---------
> >  2 files changed, 31 insertions(+), 11 deletions(-)
> >
> > diff --git a/include/linux/dynamic_debug.h b/include/linux/dynamic_debug.h
> > index 684766289bfc..56f152e75604 100644
> > --- a/include/linux/dynamic_debug.h
> > +++ b/include/linux/dynamic_debug.h
> > @@ -60,9 +60,19 @@ struct _ddebug {
> >  #else
> >  #define _DPRINTK_FLAGS_DEFAULT 0
> >  #endif
> > -       struct {
> > +       struct dd_ctrl {
> >                 unsigned int flags:8;
> > -               unsigned unused:24;
> > +       /*
> > +        * The trace destination field is used to determine output of debug
> > +        * logs when +T is set. Setting trace_dst value to TRACE_DST_MAX(63)
> > +        * enables output to prdbg and devdbg trace events. Setting trace_dst
> > +        * value to a value in range of [0..62] enables output to trace
> > +        * instance.
> > +        */
> > +#define TRACE_DST_BITS 6
> > +               unsigned int trace_dst:TRACE_DST_BITS;
> > +#define TRACE_DST_MAX  ((1 << TRACE_DST_BITS) - 1)
> > +               unsigned unused:18;
> >         } ctrl;
> >  } __attribute__((aligned(8)));
> >
> > diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c
> > index f47cb76e0e3d..0dc9ec76b867 100644
> > --- a/lib/dynamic_debug.c
> > +++ b/lib/dynamic_debug.c
> > @@ -80,14 +80,24 @@ module_param(verbose, int, 0644);
> >  MODULE_PARM_DESC(verbose, " dynamic_debug/control processing "
> >                  "( 0 = off (default), 1 = module add/rm, 2 = >control summary, 3 = parsing, 4 = per-site changes)");
> >
> > +static inline struct dd_ctrl *get_ctrl(struct _ddebug *desc)
> > +{
> > +       return &desc->ctrl;
> > +}
> > +
> > +static inline void set_ctrl(struct _ddebug *desc, struct dd_ctrl *ctrl)
> > +{
> > +       desc->ctrl = *ctrl;
> > +}
> > +
> >  static inline unsigned int get_flags(const struct _ddebug *desc)
> >  {
> >         return desc->ctrl.flags;
> >  }
> >
> > -static inline void set_flags(struct _ddebug *desc, unsigned int val)
> > +static inline unsigned int get_trace_dst(const struct _ddebug *desc)
> >  {
> > -       desc->ctrl.flags = val;
> > +       return desc->ctrl.trace_dst;
> >  }
> >
> >  /* Return the path relative to source root */
> > @@ -190,8 +200,8 @@ static int ddebug_change(const struct ddebug_query *query,
> >  {
> >         int i;
> >         struct ddebug_table *dt;
> > -       unsigned int newflags;
> >         unsigned int nfound = 0;
> > +       struct dd_ctrl nctrl = {0};
> >         struct flagsbuf fbuf, nbuf;
> >         struct ddebug_class_map *map = NULL;
> >         int __outvar valid_class;
> > @@ -257,14 +267,14 @@ static int ddebug_change(const struct ddebug_query *query,
> >
> >                         nfound++;
> >
> > -                       newflags = (get_flags(dp) & modifiers->mask) | modifiers->flags;
> > -                       if (newflags == get_flags(dp))
> > +                       nctrl.flags = (get_flags(dp) & modifiers->mask) | modifiers->flags;
> > +                       if (!memcmp(&nctrl, get_ctrl(dp), sizeof(struct dd_ctrl)))
> >                                 continue;
> >  #ifdef CONFIG_JUMP_LABEL
> >                         if (get_flags(dp) & _DPRINTK_FLAGS_ENABLED) {
> > -                               if (!(newflags & _DPRINTK_FLAGS_ENABLED))
> > +                               if (!(nctrl.flags & _DPRINTK_FLAGS_ENABLED))
> >                                         static_branch_disable(&dp->key.dd_key_true);
> > -                       } else if (newflags & _DPRINTK_FLAGS_ENABLED) {
> > +                       } else if (nctrl.flags & _DPRINTK_FLAGS_ENABLED) {
> >                                 static_branch_enable(&dp->key.dd_key_true);
> >                         }
> >  #endif
> > @@ -272,8 +282,8 @@ static int ddebug_change(const struct ddebug_query *query,
> >                                   trim_prefix(dp->filename), dp->lineno,
> >                                   dt->mod_name, dp->function,
> >                                   ddebug_describe_flags(get_flags(dp), &fbuf),
> > -                                 ddebug_describe_flags(newflags, &nbuf));
> > -                       set_flags(dp, newflags);
> > +                                 ddebug_describe_flags(nctrl.flags, &nbuf));
> > +                       set_ctrl(dp, &nctrl);
> >                 }
> >         }
> >         mutex_unlock(&ddebug_lock);
> > --
> > 2.43.0.rc2.451.g8631bc7472-goog
> >

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ