From 970a407648b39944b1fb15a5ebf4bc9f711f3690 Mon Sep 17 00:00:00 2001 From: David Marchand Date: Thu, 30 Apr 2020 18:31:55 +0200 Subject: [PATCH] trace: remove limitation on patterns number There is nothing performance sensitive in this list, use dynamic allocations and remove the arbitrary limit on the number of trace patterns a user can pass. Signed-off-by: David Marchand Acked-by: Sunil Kumar Kori --- lib/librte_eal/common/eal_common_trace.c | 10 +++--- .../common/eal_common_trace_utils.c | 34 ++++++++----------- lib/librte_eal/common/eal_trace.h | 8 ++--- 3 files changed, 24 insertions(+), 28 deletions(-) diff --git a/lib/librte_eal/common/eal_common_trace.c b/lib/librte_eal/common/eal_common_trace.c index 5a365c61da..875553d7e5 100644 --- a/lib/librte_eal/common/eal_common_trace.c +++ b/lib/librte_eal/common/eal_common_trace.c @@ -21,7 +21,7 @@ static RTE_DEFINE_PER_LCORE(char, ctf_field[TRACE_CTF_FIELD_SIZE]); static RTE_DEFINE_PER_LCORE(int, ctf_count); static struct trace_point_head tp_list = STAILQ_HEAD_INITIALIZER(tp_list); -static struct trace trace; +static struct trace trace = { .args = STAILQ_HEAD_INITIALIZER(trace.args), }; struct trace * trace_obj_get(void) @@ -38,7 +38,7 @@ trace_list_head_get(void) int eal_trace_init(void) { - uint8_t i; + struct 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); @@ -49,7 +49,7 @@ eal_trace_init(void) goto fail; } - if (trace.args.nb_args) + if (!STAILQ_EMPTY(&trace.args)) trace.status = true; if (!rte_trace_is_enabled()) @@ -82,8 +82,8 @@ eal_trace_init(void) goto fail; /* Apply global configurations */ - for (i = 0; i < trace.args.nb_args; i++) - trace_args_apply(trace.args.args[i]); + STAILQ_FOREACH(arg, &trace.args, next) + trace_args_apply(arg->val); rte_trace_mode_set(trace.mode); diff --git a/lib/librte_eal/common/eal_common_trace_utils.c b/lib/librte_eal/common/eal_common_trace_utils.c index 4077acf428..77ea8f78e1 100644 --- a/lib/librte_eal/common/eal_common_trace_utils.c +++ b/lib/librte_eal/common/eal_common_trace_utils.c @@ -138,25 +138,21 @@ int eal_trace_args_save(const char *val) { struct trace *trace = trace_obj_get(); - char *trace_args; - uint8_t nb_args; + struct trace_arg *arg = malloc(sizeof(*arg)); - nb_args = trace->args.nb_args; - - if (nb_args >= TRACE_MAX_ARGS) { - trace_err("ignoring trace %s as limit exceeds", val); - return 0; + if (arg == NULL) { + trace_err("failed to allocate memory for %s", val); + return -ENOMEM; } - trace_args = calloc(1, (strlen(val) + 1)); - if (trace_args == NULL) { - trace_err("fail to allocate memory for %s", val); + arg->val = strdup(val); + if (arg->val == NULL) { + trace_err("failed to allocate memory for %s", val); + free(arg); return -ENOMEM; } - memcpy(trace_args, val, strlen(val)); - trace->args.args[nb_args++] = trace_args; - trace->args.nb_args = nb_args; + STAILQ_INSERT_TAIL(&trace->args, arg, next); return 0; } @@ -164,13 +160,13 @@ void eal_trace_args_free(void) { struct trace *trace = trace_obj_get(); - int i; + struct trace_arg *arg; - for (i = 0; i < trace->args.nb_args; i++) { - if (trace->args.args[i]) { - free((void *)trace->args.args[i]); - trace->args.args[i] = NULL; - } + while (!STAILQ_EMPTY(&trace->args)) { + arg = STAILQ_FIRST(&trace->args); + STAILQ_REMOVE_HEAD(&trace->args, next); + free(arg->val); + free(arg); } } diff --git a/lib/librte_eal/common/eal_trace.h b/lib/librte_eal/common/eal_trace.h index 7d95bd2aa9..8f60616156 100644 --- a/lib/librte_eal/common/eal_trace.h +++ b/lib/librte_eal/common/eal_trace.h @@ -46,9 +46,9 @@ struct thread_mem_meta { enum trace_area_e area; }; -struct trace_args { - uint8_t nb_args; - char *args[TRACE_MAX_ARGS]; +struct trace_arg { + STAILQ_ENTRY(trace_arg) next; + char *val; }; struct trace { @@ -59,7 +59,7 @@ struct trace { enum rte_trace_mode mode; rte_uuid_t uuid; uint32_t buff_len; - struct trace_args args; + STAILQ_HEAD(, trace_arg) args; uint32_t nb_trace_points; uint32_t nb_trace_mem_list; struct thread_mem_meta *lcore_meta; -- 2.20.1