[EXT] [PATCH 4/8] trace: fix dynamically enabling trace points
Sunil Kumar Kori
skori at marvell.com
Thu Sep 22 13:18:05 CEST 2022
> -----Original Message-----
> From: David Marchand <david.marchand at redhat.com>
> Sent: Wednesday, September 21, 2022 5:34 PM
> To: dev at dpdk.org
> Cc: stable at dpdk.org; Jerin Jacob Kollanukkaran <jerinj at marvell.com>; Sunil
> Kumar Kori <skori at marvell.com>
> Subject: [EXT] [PATCH 4/8] trace: fix dynamically enabling trace points
>
> External Email
>
> ----------------------------------------------------------------------
> Enabling trace points at runtime was not working if no trace point had been
> enabled first at rte_eal_init() time. The reason was that trace.args reflected
> the arguments passed to --trace= EAL option.
>
> To fix this:
> - the trace subsystem initialisation is updated: trace directory
> creation is deferred to when traces are dumped (to avoid creating
> directories that may not be used),
> - per lcore memory allocation still relies on rte_trace_is_enabled() but
> this helper now tracks if any trace point is enabled. The
> documentation is updated accordingly,
> - cleanup helpers must always be called in rte_eal_cleanup() since some
> trace points might have been enabled and disabled in the lifetime of
> the DPDK application,
>
> With this fix, we can update the unit test and check that a trace point callback
> is invoked when expected.
>
> Note:
> - the 'trace' global variable might be shadowed with the argument
> passed to the functions dealing with trace point handles.
> 'tp' has been used for referring to trace_point object.
> Prefer 't' for referring to handles,
>
> Fixes: 84c4fae4628f ("trace: implement operation APIs")
> Cc: stable at dpdk.org
>
> Signed-off-by: David Marchand <david.marchand at redhat.com>
> ---
> app/test/test_trace.c | 20 ++++++++++
> app/test/test_trace.h | 2 +
> doc/guides/prog_guide/trace_lib.rst | 14 +++++--
> lib/eal/common/eal_common_trace.c | 53 ++++++++++---------------
> lib/eal/common/eal_common_trace_utils.c | 17 +++++++-
> lib/eal/common/eal_trace.h | 3 +-
> 6 files changed, 70 insertions(+), 39 deletions(-)
>
>
[snipped]
> int
> -rte_trace_point_disable(rte_trace_point_t *trace)
> +rte_trace_point_disable(rte_trace_point_t *t)
> {
> - if (trace_point_is_invalid(trace))
> + uint64_t prev;
> +
> + if (trace_point_is_invalid(t))
> return -ERANGE;
>
> - __atomic_and_fetch(trace, ~__RTE_TRACE_FIELD_ENABLE_MASK,
> - __ATOMIC_RELEASE);
> + prev = __atomic_fetch_and(t, ~__RTE_TRACE_FIELD_ENABLE_MASK,
> __ATOMIC_RELEASE);
> + if ((prev & __RTE_TRACE_FIELD_ENABLE_MASK) != 0)
> + __atomic_sub_fetch(&trace.status, 1, __ATOMIC_RELEASE);
> return 0;
> }
>
IMO, above change should go as a separate commit as it just replaces the variable name.
> @@ -413,9 +407,6 @@ trace_mem_free(void)
> struct trace *trace = trace_obj_get();
> uint32_t count;
>
> - if (!rte_trace_is_enabled())
> - return;
> -
> rte_spinlock_lock(&trace->lock);
> for (count = 0; count < trace->nb_trace_mem_list; count++) {
> trace_mem_per_thread_free_unlocked(&trace-
> >lcore_meta[count]);
> diff --git a/lib/eal/common/eal_common_trace_utils.c
> b/lib/eal/common/eal_common_trace_utils.c
> index 2b55dbec65..6340caabbf 100644
> --- a/lib/eal/common/eal_common_trace_utils.c
> +++ b/lib/eal/common/eal_common_trace_utils.c
> @@ -314,14 +314,18 @@ trace_dir_default_path_get(char *dir_path)
> return 0;
> }
>
> -int
> +static int
> trace_mkdir(void)
> {
> struct trace *trace = trace_obj_get();
> char session[TRACE_DIR_STR_LEN];
> + static bool already_done;
> char *dir_path;
> int rc;
>
> + if (already_done)
> + return 0;
> +
> if (!trace->dir_offset) {
> dir_path = calloc(1, sizeof(trace->dir));
> if (dir_path == NULL) {
> @@ -364,7 +368,8 @@ trace_mkdir(void)
> return -rte_errno;
> }
>
> - RTE_LOG(INFO, EAL, "Trace dir: %s\n", trace->dir);
> + RTE_LOG(DEBUG, EAL, "Trace dir: %s\n", trace->dir);
> + already_done = true;
I request you to keep it as INFO only. If a user enables traces, then it will give information directly about the directory without running in debug mode.
> return 0;
> }
>
> @@ -375,6 +380,10 @@ trace_meta_save(struct trace *trace)
> FILE *f;
> int rc;
>
> + rc = trace_mkdir();
> + if (rc < 0)
> + return rc;
> +
Trace directory is being created here and in trace_mem_save() function along with the logic to handle whether it is already done or not.
Instead can't it be called in rte_trace_save() directly. That will suffice the intention, I believe.
> rc = snprintf(file_name, PATH_MAX, "%s/metadata", trace->dir);
> if (rc < 0)
> return rc;
> @@ -406,6 +415,10 @@ trace_mem_save(struct trace *trace, struct
> __rte_trace_header *hdr,
> FILE *f;
> int rc;
>
> + rc = trace_mkdir();
> + if (rc < 0)
> + return rc;
> +
> rc = snprintf(file_name, PATH_MAX, "%s/channel0_%d", trace->dir,
> cnt);
> if (rc < 0)
> return rc;
> --
[snipped]
> 2.37.3
More information about the stable
mailing list