trace: remove limitation on patterns number
authorDavid Marchand <david.marchand@redhat.com>
Thu, 30 Apr 2020 16:31:55 +0000 (18:31 +0200)
committerDavid Marchand <david.marchand@redhat.com>
Wed, 6 May 2020 13:07:07 +0000 (15:07 +0200)
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.marchand@redhat.com>
Acked-by: Sunil Kumar Kori <skori@marvell.com>
lib/librte_eal/common/eal_common_trace.c
lib/librte_eal/common/eal_common_trace_utils.c
lib/librte_eal/common/eal_trace.h

index 5a365c6..875553d 100644 (file)
@@ -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);
 
index 4077acf..77ea8f7 100644 (file)
@@ -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);
        }
 }
 
index 7d95bd2..8f60616 100644 (file)
@@ -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;