diff --git a/lib/event/app.c b/lib/event/app.c index 8f068cd0a..534662668 100644 --- a/lib/event/app.c +++ b/lib/event/app.c @@ -368,7 +368,8 @@ app_setup_trace(struct spdk_app_opts *opts) { char shm_name[64]; uint64_t tpoint_group_mask; - char *end; + char *end = NULL, *tpoint_group_mask_str; + char *tpoint_group_str, *tp_g_str; if (opts->shm_id >= 0) { snprintf(shm_name, sizeof(shm_name), "/%s_trace.%d", opts->name, opts->shm_id); @@ -380,24 +381,42 @@ app_setup_trace(struct spdk_app_opts *opts) return -1; } - if (opts->tpoint_group_mask != NULL) { - errno = 0; - tpoint_group_mask = strtoull(opts->tpoint_group_mask, &end, 16); - if (*end != '\0' || errno) { - SPDK_ERRLOG("invalid tpoint mask %s\n", opts->tpoint_group_mask); - } else { - SPDK_NOTICELOG("Tracepoint Group Mask %s specified.\n", opts->tpoint_group_mask); - SPDK_NOTICELOG("Use 'spdk_trace -s %s %s %d' to capture a snapshot of events at runtime.\n", - opts->name, - opts->shm_id >= 0 ? "-i" : "-p", - opts->shm_id >= 0 ? opts->shm_id : getpid()); -#if defined(__linux__) - SPDK_NOTICELOG("Or copy /dev/shm%s for offline analysis/debug.\n", shm_name); -#endif - spdk_trace_set_tpoint_group_mask(tpoint_group_mask); - } + if (opts->tpoint_group_mask == NULL) { + return 0; } + tpoint_group_mask_str = strdup(opts->tpoint_group_mask); + if (tpoint_group_mask_str == NULL) { + SPDK_ERRLOG("Unable to get string of tpoint group mask from opts.\n"); + return -1; + } + /* Save a pointer to the original value of the tpoint group mask string + * to free later, because spdk_strsepq() modifies given char*. */ + tp_g_str = tpoint_group_mask_str; + while ((tpoint_group_str = spdk_strsepq(&tpoint_group_mask_str, ",")) != NULL) { + errno = 0; + tpoint_group_mask = strtoull(tpoint_group_str, &end, 16); + if (*end != '\0' || errno) { + break; + } + + spdk_trace_set_tpoint_group_mask(tpoint_group_mask); + } + + if (tpoint_group_str != NULL) { + SPDK_ERRLOG("invalid tpoint mask %s\n", opts->tpoint_group_mask); + } else { + SPDK_NOTICELOG("Tracepoint Group Mask %s specified.\n", opts->tpoint_group_mask); + SPDK_NOTICELOG("Use 'spdk_trace -s %s %s %d' to capture a snapshot of events at runtime.\n", + opts->name, + opts->shm_id >= 0 ? "-i" : "-p", + opts->shm_id >= 0 ? opts->shm_id : getpid()); +#if defined(__linux__) + SPDK_NOTICELOG("Or copy /dev/shm%s for offline analysis/debug.\n", shm_name); +#endif + } + free(tp_g_str); + return 0; }