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

David Marchand david.marchand at redhat.com
Tue Apr 21 14:49:36 CEST 2020


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.


>
>  #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())


> +
> +       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);
}


> +
> +       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;


> +}
> +
> +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?


> +
> +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.


-- 
David Marchand



More information about the dev mailing list