[dpdk-dev] [PATCH v6 05/33] eal/trace: implement trace operation APIs

David Marchand david.marchand at redhat.com
Tue Apr 21 16:09:54 CEST 2020


On Tue, Apr 21, 2020 at 3:47 PM Jerin Jacob <jerinjacobk at gmail.com> wrote:
> > > @@ -20,6 +22,151 @@ static RTE_DEFINE_PER_LCORE(int, ctf_count);
> > >  static struct trace_point_head tp_list = STAILQ_HEAD_INITIALIZER(tp_list);
> > >  static struct trace trace;
> > >
> > > +bool
> > > +rte_trace_is_enabled(void)
> > > +{
> > > +       return trace.status;
> > > +}
> > > +
> > > +static void
> > > +trace_mode_set(rte_trace_point_t *trace, enum rte_trace_mode mode)
> > > +{
> > > +       if (mode == RTE_TRACE_MODE_OVERWRITE)
> > > +               __atomic_and_fetch(trace, ~__RTE_TRACE_FIELD_ENABLE_DISCARD,
> > > +                                  __ATOMIC_RELEASE);
> > > +       else
> > > +               __atomic_or_fetch(trace, __RTE_TRACE_FIELD_ENABLE_DISCARD,
> > > +                                 __ATOMIC_RELEASE);
> > > +}
> > > +
> > > +void
> > > +rte_trace_mode_set(enum rte_trace_mode mode)
> > > +{
> > > +       struct trace_point *tp;
> > > +
> > > +       if (rte_trace_is_enabled() == false)
> > > +               return;
> >
> > rte_trace_is_enabled() returns a boolean, no need to test its value, should be:
> > if (!rte_trace_is_enabled())
>
> I like the ! scheme. I thought, DPDK community like == false scheme.
> I will change it in v7.

Not obvious, but I understand this part as talking about the boolean case:
https://doc.dpdk.org/guides/contributing/coding_style.html#null-pointers

"Do not use ! for tests unless it is a boolean, for example, use:"


> > > +int
> > > +rte_trace_point_enable(rte_trace_point_t *trace)
> > > +{
> > > +       if (trace_point_is_invalid(trace))
> > > +               return -ERANGE;
> > > +
> > > +       __atomic_or_fetch(trace, __RTE_TRACE_FIELD_ENABLE_MASK,
> > > +                         __ATOMIC_RELEASE);
> > > +       return 0;
> > > +}
> > > +
> > > +int
> > > +rte_trace_point_disable(rte_trace_point_t *trace)
> > > +{
> > > +       if (trace_point_is_invalid(trace))
> > > +               return -ERANGE;
> > > +
> > > +       __atomic_and_fetch(trace, ~__RTE_TRACE_FIELD_ENABLE_MASK,
> > > +                          __ATOMIC_RELEASE);
> > > +       return 0;
> > > +}
> >
> > For both rte_trace_point_enable/disable, we only check tracepoint validity.
> > Can't we just return a boolean, do we expect many error codes?
>
> I think, it is better to return "int" so that we may not ABI the
> change in future.

Ok, fair enough.


> > > +
> > > +int
> > > +rte_trace_pattern(const char *pattern, bool enable)
> > > +{
> > > +       struct trace_point *tp;
> > > +       int rc = 0, found = 0;
> > > +
> > > +       STAILQ_FOREACH(tp, &tp_list, next) {
> > > +               if (fnmatch(pattern, tp->name, 0) == 0) {
> > > +                       if (enable)
> > > +                               rc = rte_trace_point_enable(tp->handle);
> > > +                       else
> > > +                               rc = rte_trace_point_disable(tp->handle);
> > > +                       found = 1;
> > > +               }
> > > +               if (rc < 0)
> > > +                       return rc;
> > > +       }
> > > +
> > > +       return rc | found;
> > > +}
> > > +
> > > +int
> > > +rte_trace_regexp(const char *regex, bool enable)
> > > +{
> > > +       struct trace_point *tp;
> > > +       int rc = 0, found = 0;
> > > +       regex_t r;
> > > +
> > > +       if (regcomp(&r, regex, 0) != 0)
> > > +               return -EINVAL;
> > > +
> > > +       STAILQ_FOREACH(tp, &tp_list, next) {
> > > +               if (regexec(&r, tp->name, 0, NULL, 0) == 0) {
> > > +                       if (enable)
> > > +                               rc = rte_trace_point_enable(tp->handle);
> > > +                       else
> > > +                               rc = rte_trace_point_disable(tp->handle);
> > > +                       found = 1;
> > > +               }
> > > +               if (rc < 0)
> > > +                       return rc;
> > > +       }
> > > +       regfree(&r);
> > > +
> > > +       return rc | found;
> > > +}
> >
> > For both rte_trace_pattern/rte_trace_regexp, tp is a member of tp_list.
> > It means this tracepoint went through proper registration.
> > Hence, checking for a return value from rte_trace_point_(en|dis)able
> > is unneeded.
>
> Yes. I thought of it, But I think, it is safe to check the return code
> as it absorbs any
> future rte_trace_point_enable() changes. It slow-path code, so it OK IMO.

Would be odd to predict what happened if we broke for this loop on one
tracepoint error, but ok to leave as is.

-- 
David Marchand



More information about the dev mailing list