>-----Original Message----- >From: David Marchand <david.march...@redhat.com> >Sent: Monday, May 4, 2020 2:02 AM >To: dev@dpdk.org >Cc: tho...@monjalon.net; Jerin Jacob Kollanukkaran <jer...@marvell.com>; >Sunil Kumar Kori <sk...@marvell.com> >Subject: [EXT] [PATCH 6/8] trace: remove limitation on patterns number > >External Email > >---------------------------------------------------------------------- >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 <david.march...@redhat.com> >--- > lib/librte_eal/common/eal_common_trace.c | 10 +++--- > .../common/eal_common_trace_utils.c | 33 ++++++++----------- > lib/librte_eal/common/eal_trace.h | 8 ++--- > 3 files changed, 23 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..15384ce4f1 100644 >--- a/lib/librte_eal/common/eal_common_trace_utils.c >+++ b/lib/librte_eal/common/eal_common_trace_utils.c >@@ -138,25 +138,20 @@ 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)); Won't "malloc(sizeof(struct trace_arg))" be more readable ?
> >- 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); "arg" needs to be freed here. > 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 +159,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..943b5ecbc5 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_head, trace_arg) args; "trace_arg_head" is not required. It can be removed. > uint32_t nb_trace_points; > uint32_t nb_trace_mem_list; > struct thread_mem_meta *lcore_meta; >-- >2.23.0