[dpdk-dev] [PATCH v6 05/33] eal/trace: implement trace operation APIs
Jerin Jacob
jerinjacobk at gmail.com
Tue Apr 21 15:40:55 CEST 2020
On Tue, Apr 21, 2020 at 6:19 PM David Marchand
<david.marchand at redhat.com> wrote:
>
> On Sun, Apr 19, 2020 at 12:02 PM <jerinj at marvell.com> wrote:
> > diff --git a/lib/librte_eal/common/eal_common_trace.c b/lib/librte_eal/common/eal_common_trace.c
> > index 5c5cbd2a1..1ca702f68 100644
> > --- a/lib/librte_eal/common/eal_common_trace.c
> > +++ b/lib/librte_eal/common/eal_common_trace.c
> > @@ -3,7 +3,9 @@
> > */
> >
> > #include <inttypes.h>
> > +#include <fnmatch.h>
> > #include <sys/queue.h>
> > +#include <regex.h>
>
> Alphabetical sort when possible.
Ack. Wil fix it v7
>
> >
> > #include <rte_common.h>
> > #include <rte_errno.h>
> > @@ -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.
>
>
> > +
> > + STAILQ_FOREACH(tp, &tp_list, next)
> > + trace_mode_set(tp->handle, mode);
> > +
> > + trace.mode = mode;
> > +}
> > +
> > +enum
> > +rte_trace_mode rte_trace_mode_get(void)
> > +{
> > + return trace.mode;
> > +}
> > +
> > +static bool
> > +trace_point_is_invalid(rte_trace_point_t *t)
> > +{
> > + if (t == NULL)
> > + return false;
>
> Should be "return true"?
>
> Or maybe simply rewrite as:
>
> static bool
> trace_point_is_invalid(rte_trace_point_t *t)
> {
> return (t == NULL) || (trace_id_get(t) >= trace.nb_trace_points);
> }
Ack.
>
> > +
> > + if (trace_id_get(t) >= trace.nb_trace_points)
> > + return true;
> > +
> > + return false;
> > +}
> > +
> > +bool
> > +rte_trace_point_is_enabled(rte_trace_point_t *trace)
> > +{
> > + uint64_t val;
> > +
> > + if (trace_point_is_invalid(trace))
> > + return false;
> > +
> > + val = __atomic_load_n(trace, __ATOMIC_ACQUIRE);
> > + return val & __RTE_TRACE_FIELD_ENABLE_MASK;
>
> We return a boolean, should be
> return (val & __RTE_TRACE_FIELD_ENABLE_MASK) != 0;
Ack.
>
>
> > +}
> > +
> > +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.
>
>
> > +
> > +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.
>
>
> --
> David Marchand
>
More information about the dev
mailing list