The trace settings (pattern list, directory, buffer size, mode) were
previously stored directly in the internal struct trace singleton during
arg parsing, via helper functions. Move these setting into eal_user_cfg
and drop the helper functions.

NOTE: after these changes, eal_cleanup_config needs a non-const user
config pointer to cleanup. Rather than making the pointer in
rte_eal_cleanup non-const, make eal_cleanup_config like all the other
functions in the cleanup chain in taking no parameters. Then it can
define its own non-const user config pointer internally.

Signed-off-by: Bruce Richardson <[email protected]>
---
 lib/eal/common/eal_common_options.c     |  53 ++++++++++--
 lib/eal/common/eal_common_trace.c       |  30 +++++--
 lib/eal/common/eal_common_trace_utils.c | 104 ------------------------
 lib/eal/common/eal_internal_cfg.h       |  15 ++++
 lib/eal/common/eal_options.h            |   2 +-
 lib/eal/common/eal_trace.h              |  11 ---
 lib/eal/freebsd/eal.c                   |   3 +-
 lib/eal/linux/eal.c                     |   2 +-
 lib/eal/windows/eal.c                   |   4 +-
 9 files changed, 87 insertions(+), 137 deletions(-)

diff --git a/lib/eal/common/eal_common_options.c 
b/lib/eal/common/eal_common_options.c
index 835e518e2c..18d6ee3f5a 100644
--- a/lib/eal/common/eal_common_options.c
+++ b/lib/eal/common/eal_common_options.c
@@ -14,6 +14,7 @@
 #include <sys/queue.h>
 #ifndef RTE_EXEC_ENV_WINDOWS
 #include <dlfcn.h>
+#include <fnmatch.h>
 #include <libgen.h>
 #endif
 #include <sys/stat.h>
@@ -475,6 +476,7 @@ eal_reset_internal_config(void)
 
        TAILQ_INIT(&user_cfg->devopt_list);
        TAILQ_INIT(&user_cfg->plugin_list);
+       STAILQ_INIT(&user_cfg->trace_patterns);
        TAILQ_INIT(&runtime_state->loaded_plugins);
        user_cfg->memory = 0;
        user_cfg->force_nrank = 0;
@@ -2178,28 +2180,56 @@ eal_parse_args(void)
                EAL_LOG(WARNING, "Tracing is not supported on Windows, ignoring 
tracing parameters");
 #else
        TAILQ_FOREACH(arg, &args.trace, next) {
-               if (eal_trace_args_save(arg->arg) < 0) {
-                       EAL_LOG(ERR, "invalid trace parameter, '%s'", arg->arg);
+               struct eal_trace_arg *ta = malloc(sizeof(*ta));
+               if (ta == NULL) {
+                       EAL_LOG(ERR, "failed to allocate trace arg for '%s'", 
arg->arg);
                        return -1;
                }
+               ta->val = strdup(arg->arg);
+               if (ta->val == NULL) {
+                       EAL_LOG(ERR, "failed to allocate trace arg for '%s'", 
arg->arg);
+                       free(ta);
+                       return -1;
+               }
+               STAILQ_INSERT_TAIL(&user_cfg->trace_patterns, ta, next);
        }
        if (args.trace_dir != NULL) {
-               if (eal_trace_dir_args_save(args.trace_dir) < 0) {
+               if (asprintf(&user_cfg->trace_dir, "%s/", args.trace_dir) == 
-1) {
                        EAL_LOG(ERR, "invalid trace directory, '%s'", 
args.trace_dir);
                        return -1;
                }
        }
        if (args.trace_bufsz != NULL) {
-               if (eal_trace_bufsz_args_save(args.trace_bufsz) < 0) {
+               uint64_t bufsz = rte_str_to_size(args.trace_bufsz);
+               if (bufsz == 0) {
                        EAL_LOG(ERR, "invalid trace buffer size, '%s'", 
args.trace_bufsz);
                        return -1;
                }
+               user_cfg->trace_bufsz = bufsz;
        }
        if (args.trace_mode != NULL) {
-               if (eal_trace_mode_args_save(args.trace_mode) < 0) {
+               size_t len = strlen(args.trace_mode);
+               char *pattern;
+               if (len == 0) {
+                       EAL_LOG(ERR, "trace mode value is empty");
+                       return -1;
+               }
+               pattern = calloc(1, len + 2);
+               if (pattern == NULL) {
+                       EAL_LOG(ERR, "failed to allocate memory for trace 
mode");
+                       return -1;
+               }
+               sprintf(pattern, "%s*", args.trace_mode);
+               if (fnmatch(pattern, "overwrite", 0) == 0)
+                       user_cfg->trace_mode = RTE_TRACE_MODE_OVERWRITE;
+               else if (fnmatch(pattern, "discard", 0) == 0)
+                       user_cfg->trace_mode = RTE_TRACE_MODE_DISCARD;
+               else {
                        EAL_LOG(ERR, "invalid trace mode, '%s'", 
args.trace_mode);
+                       free(pattern);
                        return -1;
                }
+               free(pattern);
        }
 #endif
 
@@ -2318,8 +2348,19 @@ compute_ctrl_threads_cpuset(void)
 }
 
 int
-eal_cleanup_config(const struct eal_user_cfg *user_cfg)
+eal_cleanup_config(void)
 {
+       struct eal_user_cfg *user_cfg = eal_get_user_configuration();
+       struct eal_trace_arg *ta;
+
+       /* free trace patterns list */
+       while (!STAILQ_EMPTY(&user_cfg->trace_patterns)) {
+               ta = STAILQ_FIRST(&user_cfg->trace_patterns);
+               STAILQ_REMOVE_HEAD(&user_cfg->trace_patterns, next);
+               free(ta->val);
+               free(ta);
+       }
+       free(user_cfg->trace_dir);
        free(user_cfg->hugefile_prefix);
        free(user_cfg->hugepage_dir);
        free(user_cfg->user_mbuf_pool_ops_name);
diff --git a/lib/eal/common/eal_common_trace.c 
b/lib/eal/common/eal_common_trace.c
index a76dff0017..3d984ac8b1 100644
--- a/lib/eal/common/eal_common_trace.c
+++ b/lib/eal/common/eal_common_trace.c
@@ -24,7 +24,7 @@ RTE_DEFINE_PER_LCORE(void *, trace_mem);
 static RTE_DEFINE_PER_LCORE(char *, ctf_field);
 
 static struct trace_point_head tp_list = STAILQ_HEAD_INITIALIZER(tp_list);
-static struct trace trace = { .args = STAILQ_HEAD_INITIALIZER(trace.args), };
+static struct trace trace;
 
 struct trace *
 trace_obj_get(void)
@@ -41,7 +41,8 @@ trace_list_head_get(void)
 int
 eal_trace_init(void)
 {
-       struct trace_arg *arg;
+       const struct eal_user_cfg *user_cfg = eal_get_user_configuration();
+       const struct eal_trace_arg *arg;
 
        /* Trace memory should start with 8B aligned for natural alignment */
        RTE_BUILD_BUG_ON((offsetof(struct __rte_trace_header, mem) % 8) != 0);
@@ -58,14 +59,24 @@ eal_trace_init(void)
        if (trace_has_duplicate_entry())
                goto fail;
 
+       /* Copy trace directory from user config (trace.dir may be reallocated 
later) */
+       if (user_cfg->trace_dir != NULL) {
+               trace.dir = strdup(user_cfg->trace_dir);
+               if (trace.dir == NULL) {
+                       rte_errno = ENOMEM;
+                       goto fail;
+               }
+       }
+
+       /* Apply buffer size from user config, then fill in default if still 0 
*/
+       trace.buff_len = user_cfg->trace_bufsz;
+       trace_bufsz_args_apply();
+
        /* Generate UUID ver 4 with total size of events and number of
         * events
         */
        trace_uuid_generate();
 
-       /* Apply buffer size configuration for trace output */
-       trace_bufsz_args_apply();
-
        /* Generate CTF TDSL metadata */
        if (trace_metadata_create() < 0)
                goto fail;
@@ -74,11 +85,11 @@ eal_trace_init(void)
        if (trace_epoch_time_save() < 0)
                goto free_meta;
 
-       /* Apply global configurations */
-       STAILQ_FOREACH(arg, &trace.args, next)
+       /* Apply trace pattern filters from user config */
+       STAILQ_FOREACH(arg, &user_cfg->trace_patterns, next)
                trace_args_apply(arg->val);
 
-       rte_trace_mode_set(trace.mode);
+       rte_trace_mode_set(user_cfg->trace_mode);
 
        return 0;
 
@@ -94,7 +105,8 @@ eal_trace_fini(void)
 {
        trace_mem_free();
        trace_metadata_destroy();
-       eal_trace_args_free();
+       free(trace.dir);
+       trace.dir = NULL;
 }
 
 RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_trace_is_enabled, 20.05)
diff --git a/lib/eal/common/eal_common_trace_utils.c 
b/lib/eal/common/eal_common_trace_utils.c
index e1996433b7..821036b4bb 100644
--- a/lib/eal/common/eal_common_trace_utils.c
+++ b/lib/eal/common/eal_common_trace_utils.c
@@ -2,7 +2,6 @@
  * Copyright(C) 2020 Marvell International Ltd.
  */
 
-#include <fnmatch.h>
 #include <pwd.h>
 #include <sys/stat.h>
 #include <time.h>
@@ -132,42 +131,6 @@ trace_dir_update(const char *str)
        return rc;
 }
 
-int
-eal_trace_args_save(const char *val)
-{
-       struct trace *trace = trace_obj_get();
-       struct trace_arg *arg = malloc(sizeof(*arg));
-
-       if (arg == NULL) {
-               trace_err("failed to allocate memory for %s", val);
-               return -ENOMEM;
-       }
-
-       arg->val = strdup(val);
-       if (arg->val == NULL) {
-               trace_err("failed to allocate memory for %s", val);
-               free(arg);
-               return -ENOMEM;
-       }
-
-       STAILQ_INSERT_TAIL(&trace->args, arg, next);
-       return 0;
-}
-
-void
-eal_trace_args_free(void)
-{
-       struct trace *trace = trace_obj_get();
-       struct trace_arg *arg;
-
-       while (!STAILQ_EMPTY(&trace->args)) {
-               arg = STAILQ_FIRST(&trace->args);
-               STAILQ_REMOVE_HEAD(&trace->args, next);
-               free(arg->val);
-               free(arg);
-       }
-}
-
 int
 trace_args_apply(const char *arg)
 {
@@ -179,22 +142,6 @@ trace_args_apply(const char *arg)
        return 0;
 }
 
-int
-eal_trace_bufsz_args_save(char const *val)
-{
-       struct trace *trace = trace_obj_get();
-       uint64_t bufsz;
-
-       bufsz = rte_str_to_size(val);
-       if (bufsz == 0) {
-               trace_err("buffer size cannot be zero");
-               return -EINVAL;
-       }
-
-       trace->buff_len = bufsz;
-       return 0;
-}
-
 void
 trace_bufsz_args_apply(void)
 {
@@ -204,57 +151,6 @@ trace_bufsz_args_apply(void)
                trace->buff_len = 1024 * 1024; /* 1MB */
 }
 
-int
-eal_trace_mode_args_save(const char *val)
-{
-       struct trace *trace = trace_obj_get();
-       size_t len = strlen(val);
-       unsigned long tmp;
-       char *pattern;
-
-       if (len == 0) {
-               trace_err("value is not provided with option");
-               return -EINVAL;
-       }
-
-       pattern = (char *)calloc(1, len + 2);
-       if (pattern == NULL) {
-               trace_err("fail to allocate memory");
-               return -ENOMEM;
-       }
-
-       sprintf(pattern, "%s*", val);
-
-       if (fnmatch(pattern, "overwrite", 0) == 0)
-               tmp = RTE_TRACE_MODE_OVERWRITE;
-       else if (fnmatch(pattern, "discard", 0) == 0)
-               tmp = RTE_TRACE_MODE_DISCARD;
-       else {
-               free(pattern);
-               return -EINVAL;
-       }
-
-       trace->mode = tmp;
-       free(pattern);
-       return 0;
-}
-
-int
-eal_trace_dir_args_save(char const *val)
-{
-       char *dir_path;
-       int rc;
-
-       if (asprintf(&dir_path, "%s/", val) == -1) {
-               trace_err("failed to copy directory: %s", strerror(errno));
-               return -ENOMEM;
-       }
-
-       rc = trace_dir_update(dir_path);
-       free(dir_path);
-       return rc;
-}
-
 int
 trace_epoch_time_save(void)
 {
diff --git a/lib/eal/common/eal_internal_cfg.h 
b/lib/eal/common/eal_internal_cfg.h
index 6894bbf9d5..79722577a5 100644
--- a/lib/eal/common/eal_internal_cfg.h
+++ b/lib/eal/common/eal_internal_cfg.h
@@ -16,6 +16,7 @@
 #include <rte_eal.h>
 #include <rte_os_shim.h>
 #include <rte_pci_dev_feature_defs.h>
+#include <rte_trace.h>
 #include <stdint.h>
 #include <stdbool.h>
 
@@ -57,6 +58,16 @@ struct hugepage_file_discipline {
        bool unlink_existing;
 };
 
+/**
+ * A saved trace pattern string from --trace, staged during arg parsing.
+ * Lives in user_cfg->trace_patterns; applied during eal_trace_init().
+ */
+struct eal_trace_arg {
+       STAILQ_ENTRY(eal_trace_arg) next;
+       char *val;
+};
+STAILQ_HEAD(eal_trace_arg_list, eal_trace_arg);
+
 /**
  * A plugin path provided by the user via -d, staged during arg parsing.
  * Lives in user_cfg->plugin_list; consumed by eal_plugins_init().
@@ -85,6 +96,10 @@ TAILQ_HEAD(eal_devopt_list, device_option);
 struct eal_user_cfg {
        struct eal_devopt_list devopt_list; /**< staged device options 
(-a/-b/--vdev) */
        struct eal_plugin_path_list plugin_list; /**< user-provided plugin 
paths (-d) */
+       struct eal_trace_arg_list trace_patterns; /**< saved --trace patterns */
+       char *trace_dir;        /**< trace output directory (NULL = use 
default) */
+       uint64_t trace_bufsz;   /**< trace buffer size in bytes (0 = use 
default 1 MB) */
+       enum rte_trace_mode trace_mode; /**< trace mode (default 
RTE_TRACE_MODE_OVERWRITE) */
        size_t memory;           /**< amount of asked memory */
        size_t huge_worker_stack_size; /**< worker thread stack size */
        enum rte_proc_type_t process_type; /**< requested process type */
diff --git a/lib/eal/common/eal_options.h b/lib/eal/common/eal_options.h
index d5ad7a4720..d20381a48f 100644
--- a/lib/eal/common/eal_options.h
+++ b/lib/eal/common/eal_options.h
@@ -14,7 +14,7 @@ int eal_parse_log_options(void);
 int eal_parse_args(void);
 int eal_option_device_parse(void);
 int eal_apply_runtime_state(void);
-int eal_cleanup_config(const struct eal_user_cfg *user_cfg);
+int eal_cleanup_config(void);
 enum rte_proc_type_t eal_proc_type_detect(void);
 int eal_plugins_init(void);
 int eal_save_args(int argc, char **argv);
diff --git a/lib/eal/common/eal_trace.h b/lib/eal/common/eal_trace.h
index 55262677e0..c7ef7d12f7 100644
--- a/lib/eal/common/eal_trace.h
+++ b/lib/eal/common/eal_trace.h
@@ -42,11 +42,6 @@ struct thread_mem_meta {
        enum trace_area_e area;
 };
 
-struct trace_arg {
-       STAILQ_ENTRY(trace_arg) next;
-       char *val;
-};
-
 struct trace {
        char *dir;
        int register_errno;
@@ -54,7 +49,6 @@ struct trace {
        enum rte_trace_mode mode;
        rte_uuid_t uuid;
        uint32_t buff_len;
-       STAILQ_HEAD(, trace_arg) args;
        uint32_t nb_trace_points;
        uint32_t nb_trace_mem_list;
        struct thread_mem_meta *lcore_meta;
@@ -107,10 +101,5 @@ void trace_mem_per_thread_free(void);
 /* EAL interface */
 int eal_trace_init(void);
 void eal_trace_fini(void);
-int eal_trace_args_save(const char *val);
-void eal_trace_args_free(void);
-int eal_trace_dir_args_save(const char *val);
-int eal_trace_mode_args_save(const char *val);
-int eal_trace_bufsz_args_save(const char *val);
 
 #endif /* __EAL_TRACE_H */
diff --git a/lib/eal/freebsd/eal.c b/lib/eal/freebsd/eal.c
index 16748f965e..b1155dfc2c 100644
--- a/lib/eal/freebsd/eal.c
+++ b/lib/eal/freebsd/eal.c
@@ -762,7 +762,6 @@ rte_eal_cleanup(void)
                return -1;
        }
 
-       struct eal_user_cfg *user_cfg = eal_get_user_configuration();
        rte_service_finalize();
        eal_bus_cleanup();
        rte_mp_channel_cleanup();
@@ -771,7 +770,7 @@ rte_eal_cleanup(void)
        eal_trace_fini();
        /* after this point, any DPDK pointers will become dangling */
        rte_eal_memory_detach();
-       eal_cleanup_config(user_cfg);
+       eal_cleanup_config();
        eal_lcore_var_cleanup();
        return 0;
 }
diff --git a/lib/eal/linux/eal.c b/lib/eal/linux/eal.c
index 8d67d6744f..4c716f2a09 100644
--- a/lib/eal/linux/eal.c
+++ b/lib/eal/linux/eal.c
@@ -974,7 +974,7 @@ rte_eal_cleanup(void)
        /* after this point, any DPDK pointers will become dangling */
        rte_eal_memory_detach();
        rte_eal_malloc_heap_cleanup();
-       eal_cleanup_config(user_cfg);
+       eal_cleanup_config();
        eal_lcore_var_cleanup();
        rte_eal_log_cleanup();
        return 0;
diff --git a/lib/eal/windows/eal.c b/lib/eal/windows/eal.c
index 8de7d6d715..e0d7c4e612 100644
--- a/lib/eal/windows/eal.c
+++ b/lib/eal/windows/eal.c
@@ -136,14 +136,12 @@ RTE_EXPORT_SYMBOL(rte_eal_cleanup)
 int
 rte_eal_cleanup(void)
 {
-       struct eal_user_cfg *user_cfg = eal_get_user_configuration();
-
        eal_intr_thread_cancel();
        eal_mem_virt2iova_cleanup();
        eal_bus_cleanup();
        /* after this point, any DPDK pointers will become dangling */
        rte_eal_memory_detach();
-       eal_cleanup_config(user_cfg);
+       eal_cleanup_config();
        eal_lcore_var_cleanup();
        return 0;
 }
-- 
2.51.0

Reply via email to