diff --git a/app/iscsi_top/iscsi_top.cpp b/app/iscsi_top/iscsi_top.cpp index ba59bfdab..ca18decb9 100644 --- a/app/iscsi_top/iscsi_top.cpp +++ b/app/iscsi_top/iscsi_top.cpp @@ -169,7 +169,7 @@ int main(int argc, char **argv) memset(last_tasks_done, 0, sizeof(last_tasks_done)); for (i = 0; i < SPDK_TRACE_MAX_LCORE; i++) { - history = spdk_get_per_lcore_history(histories, i, histories->flags.num_entries); + history = spdk_get_per_lcore_history(histories, i); last_tasks_done[i] = history->tpoint_count[TRACE_ISCSI_TASK_DONE]; } @@ -227,7 +227,7 @@ int main(int argc, char **argv) printf("=============\n"); total_tasks_done_per_sec = 0; for (i = 0; i < SPDK_TRACE_MAX_LCORE; i++) { - history = spdk_get_per_lcore_history(histories, i, histories->flags.num_entries); + history = spdk_get_per_lcore_history(histories, i); tasks_done = history->tpoint_count[TRACE_ISCSI_TASK_DONE]; tasks_done_delta = tasks_done - last_tasks_done[i]; if (tasks_done_delta == 0) { diff --git a/app/trace/trace.cpp b/app/trace/trace.cpp index d17e2d5a1..2c6f4e8b9 100644 --- a/app/trace/trace.cpp +++ b/app/trace/trace.cpp @@ -284,7 +284,8 @@ static void usage(void) int main(int argc, char **argv) { void *history_ptr; - struct spdk_trace_history *history_entries, *history; + struct spdk_trace_history *history; + struct spdk_trace_histories *histories; int fd, i; int lcore = SPDK_TRACE_MAX_LCORE; uint64_t tsc_offset; @@ -293,9 +294,7 @@ int main(int argc, char **argv) int op; char shm_name[64]; int shm_id = -1, shm_pid = -1; - uint64_t num_entries; uint64_t trace_histories_size; - uint64_t lcore_history_size; g_exe_name = argv[0]; while ((op = getopt(argc, argv, "c:f:i:p:qs:")) != -1) { @@ -375,15 +374,12 @@ int main(int argc, char **argv) exit(-1); } - num_entries = g_histories->flags.num_entries; - if (g_verbose) { printf("TSC Rate: %ju\n", g_tsc_rate); - printf("Number Trace Entries per lcore: %ju\n", num_entries); } /* Remap the entire trace file */ - trace_histories_size = spdk_get_trace_histories_size(num_entries); + trace_histories_size = spdk_get_trace_histories_size(g_histories); munmap(history_ptr, sizeof(*g_histories)); history_ptr = mmap(NULL, trace_histories_size, PROT_READ, MAP_SHARED, fd, 0); if (history_ptr == MAP_FAILED) { @@ -394,26 +390,34 @@ int main(int argc, char **argv) g_histories = (struct spdk_trace_histories *)history_ptr; - lcore_history_size = spdk_get_trace_history_size(num_entries); - history_entries = (struct spdk_trace_history *)malloc(lcore_history_size * SPDK_TRACE_MAX_LCORE); - if (history_entries == NULL) { + histories = (struct spdk_trace_histories *)malloc(trace_histories_size); + if (histories == NULL) { goto cleanup; } - memcpy(history_entries, g_histories->per_lcore_history, - lcore_history_size * SPDK_TRACE_MAX_LCORE); + + memcpy(histories, g_histories, trace_histories_size); if (lcore == SPDK_TRACE_MAX_LCORE) { for (i = 0; i < SPDK_TRACE_MAX_LCORE; i++) { - history = spdk_get_per_lcore_history(g_histories, i, num_entries); + history = spdk_get_per_lcore_history(histories, i); if (history->entries[0].tsc == 0) { continue; } - populate_events(history, num_entries); + + if (g_verbose && history->num_entries) { + printf("Trace Size of lcore (%d): %ju\n", i, history->num_entries); + } + + populate_events(history, history->num_entries); } } else { - history = spdk_get_per_lcore_history(g_histories, lcore, num_entries); + history = spdk_get_per_lcore_history(histories, lcore); if (history->entries[0].tsc != 0) { - populate_events(history, num_entries); + if (g_verbose && history->num_entries) { + printf("Trace Size of lcore (%d): %ju\n", lcore, history->num_entries); + } + + populate_events(history, history->num_entries); } } @@ -425,7 +429,7 @@ int main(int argc, char **argv) process_event(it->second, g_tsc_rate, tsc_offset, it->first.lcore); } - free(history_entries); + free(histories); cleanup: munmap(history_ptr, trace_histories_size); diff --git a/include/spdk/trace.h b/include/spdk/trace.h index 2bbc6b1a4..d246aa105 100644 --- a/include/spdk/trace.h +++ b/include/spdk/trace.h @@ -92,6 +92,9 @@ struct spdk_trace_history { /** Logical core number associated with this structure instance. */ int lcore; + /** Number of trace_entries contained in each trace_history. */ + uint64_t num_entries; + /** * Running count of number of occurrences of each tracepoint on this * lcore. Debug tools can use this to easily count tracepoints such as @@ -115,11 +118,15 @@ struct spdk_trace_history { struct spdk_trace_flags { uint64_t tsc_rate; - uint64_t num_entries; uint64_t tpoint_mask[SPDK_TRACE_MAX_GROUP_ID]; struct spdk_trace_owner owner[UCHAR_MAX + 1]; struct spdk_trace_object object[UCHAR_MAX + 1]; struct spdk_trace_tpoint tpoint[SPDK_TRACE_MAX_TPOINT_ID]; + + /** Offset of each trace_history from the beginning of this data structure. + * The last one is the offset of the file end. + */ + uint64_t lcore_history_offsets[SPDK_TRACE_MAX_LCORE + 1]; }; extern struct spdk_trace_flags *g_trace_flags; extern struct spdk_trace_histories *g_trace_histories; @@ -144,24 +151,22 @@ spdk_get_trace_history_size(uint64_t num_entries) } static inline uint64_t -spdk_get_trace_histories_size(uint64_t num_entries) +spdk_get_trace_histories_size(struct spdk_trace_histories *trace_histories) { - int size; - - size = sizeof(struct spdk_trace_flags); - size += spdk_get_trace_history_size(num_entries) * SPDK_TRACE_MAX_LCORE; - - return size; + return trace_histories->flags.lcore_history_offsets[SPDK_TRACE_MAX_LCORE]; } static inline struct spdk_trace_history * -spdk_get_per_lcore_history(struct spdk_trace_histories *trace_histories, unsigned lcore, - uint64_t num_entries) +spdk_get_per_lcore_history(struct spdk_trace_histories *trace_histories, unsigned lcore) { char *lcore_history_offset; - lcore_history_offset = (char *)trace_histories->per_lcore_history; - lcore_history_offset += lcore * spdk_get_trace_history_size(num_entries); + if (lcore >= SPDK_TRACE_MAX_LCORE) { + return NULL; + } + + lcore_history_offset = (char *)trace_histories; + lcore_history_offset += trace_histories->flags.lcore_history_offsets[lcore]; return (struct spdk_trace_history *)lcore_history_offset; } diff --git a/lib/trace/trace.c b/lib/trace/trace.c index e31f52d93..e4c06058b 100644 --- a/lib/trace/trace.c +++ b/lib/trace/trace.c @@ -36,6 +36,7 @@ #include "spdk/env.h" #include "spdk/string.h" #include "spdk/trace.h" +#include "spdk/util.h" static int g_trace_fd = -1; static char g_shm_name[64]; @@ -55,8 +56,7 @@ _spdk_trace_record(uint64_t tsc, uint16_t tpoint_id, uint16_t poller_id, uint32_ return; } - lcore_history = spdk_get_per_lcore_history(g_trace_histories, lcore, - g_trace_histories->flags.num_entries); + lcore_history = spdk_get_per_lcore_history(g_trace_histories, lcore); if (tsc == 0) { tsc = spdk_get_ticks(); } @@ -72,7 +72,7 @@ _spdk_trace_record(uint64_t tsc, uint16_t tpoint_id, uint16_t poller_id, uint32_ next_entry->arg1 = arg1; lcore_history->next_entry++; - if (lcore_history->next_entry == g_trace_histories->flags.num_entries) { + if (lcore_history->next_entry == lcore_history->num_entries) { lcore_history->next_entry = 0; } } @@ -81,7 +81,14 @@ int spdk_trace_init(const char *shm_name, uint64_t num_entries) { int i = 0; - int histories_size = spdk_get_trace_histories_size(num_entries); + int histories_size; + uint64_t lcore_offsets[SPDK_TRACE_MAX_LCORE + 1]; + + lcore_offsets[0] = sizeof(struct spdk_trace_flags); + for (i = 1; i < (int)SPDK_COUNTOF(lcore_offsets); i++) { + lcore_offsets[i] = spdk_get_trace_history_size(num_entries) + lcore_offsets[i - 1]; + } + histories_size = sizeof(struct spdk_trace_flags) + lcore_offsets[SPDK_TRACE_MAX_LCORE]; snprintf(g_shm_name, sizeof(g_shm_name), "%s", shm_name); @@ -123,14 +130,16 @@ spdk_trace_init(const char *shm_name, uint64_t num_entries) g_trace_flags = &g_trace_histories->flags; g_trace_flags->tsc_rate = spdk_get_ticks_hz(); - g_trace_flags->num_entries = num_entries; for (i = 0; i < SPDK_TRACE_MAX_LCORE; i++) { struct spdk_trace_history *lcore_history; - lcore_history = spdk_get_per_lcore_history(g_trace_histories, i, num_entries); + g_trace_flags->lcore_history_offsets[i] = lcore_offsets[i]; + lcore_history = spdk_get_per_lcore_history(g_trace_histories, i); lcore_history->lcore = i; + lcore_history->num_entries = num_entries; } + g_trace_flags->lcore_history_offsets[SPDK_TRACE_MAX_LCORE] = lcore_offsets[SPDK_TRACE_MAX_LCORE]; spdk_trace_flags_init();