X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=lib%2Flibrte_eal%2Fcommon%2Feal_common_trace_utils.c;h=64f58fb66a1576b5c8d69e9b7d984fc7d0c49604;hb=84fb33fec179ea96f814aed9f658d5a2df20745d;hp=7c86a6648ea0ef5c9e57d6aa6bad88c594c4f8cd;hpb=3d26a70ae33853ac4116b135e55f3d475f148939;p=dpdk.git diff --git a/lib/librte_eal/common/eal_common_trace_utils.c b/lib/librte_eal/common/eal_common_trace_utils.c index 7c86a6648e..64f58fb66a 100644 --- a/lib/librte_eal/common/eal_common_trace_utils.c +++ b/lib/librte_eal/common/eal_common_trace_utils.c @@ -118,29 +118,41 @@ fail: return -rte_errno; } -int -eal_trace_args_save(const char *optarg) +static int +trace_dir_update(const char *str) { struct trace *trace = trace_obj_get(); - char *trace_args; - uint8_t nb_args; + int rc, remaining; + + remaining = sizeof(trace->dir) - trace->dir_offset; + rc = rte_strscpy(&trace->dir[0] + trace->dir_offset, str, remaining); + if (rc < 0) + goto fail; + + trace->dir_offset += rc; +fail: + return rc; +} - nb_args = trace->args.nb_args; +int +eal_trace_args_save(const char *val) +{ + struct trace *trace = trace_obj_get(); + struct trace_arg *arg = malloc(sizeof(*arg)); - if (nb_args >= TRACE_MAX_ARGS) { - trace_err("ignoring trace %s as limit exceeds", optarg); - return 0; + if (arg == NULL) { + trace_err("failed to allocate memory for %s", val); + return -ENOMEM; } - trace_args = calloc(1, (strlen(optarg) + 1)); - if (trace_args == NULL) { - trace_err("fail to allocate memory for %s", optarg); + arg->val = strdup(val); + if (arg->val == NULL) { + trace_err("failed to allocate memory for %s", val); + free(arg); return -ENOMEM; } - memcpy(trace_args, optarg, strlen(optarg)); - trace->args.args[nb_args++] = trace_args; - trace->args.nb_args = nb_args; + STAILQ_INSERT_TAIL(&trace->args, arg, next); return 0; } @@ -148,35 +160,110 @@ 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); } } int trace_args_apply(const char *arg) { - char *str; - - str = strdup(arg); - if (str == NULL) + if (rte_trace_regexp(arg, true) < 0) { + trace_err("cannot enable trace for %s", arg); return -1; + } - if (rte_trace_regexp(str, true) < 0) { - trace_err("cannot enable trace for %s", str); - free(str); - return -1; + 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) +{ + struct trace *trace = trace_obj_get(); + + if (trace->buff_len == 0) + 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; } - free(str); + trace->mode = tmp; + free(pattern); return 0; } +int +eal_trace_dir_args_save(char const *val) +{ + struct trace *trace = trace_obj_get(); + char *dir_path; + int rc; + + if (strlen(val) >= sizeof(trace->dir) - 1) { + trace_err("input string is too big"); + return -ENAMETOOLONG; + } + + 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) { @@ -247,6 +334,10 @@ trace_mkdir(void) return rc; } + rc = trace_dir_update(dir_path); + free(dir_path); + if (rc < 0) + return rc; } /* Create the path if it t exist, no "mkdir -p" available here */ @@ -258,6 +349,9 @@ trace_mkdir(void) } rc = trace_session_name_generate(session); + if (rc < 0) + return rc; + rc = trace_dir_update(session); if (rc < 0) return rc;