lib/trace: records num-trace-entries for lcores

With the trace_size records for each lcore, spdk_trace
can read trace_file in which each lcore has different
number of trace entries.
Offset of each trace_history from the beginning of this
data structure.

Change-Id: I06afaba129812fe40ed000265fc66b02c5d9e3d9
Signed-off-by: Liu Xiaodong <xiaodong.liu@intel.com>
Reviewed-on: https://review.gerrithub.io/433503
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Chandler-Test-Pool: SPDK Automated Test System <sys_sgsw@intel.com>
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
This commit is contained in:
Liu Xiaodong 2018-11-15 12:07:01 -05:00 committed by Jim Harris
parent fd4c75721e
commit 9d2f39ab0b
4 changed files with 55 additions and 37 deletions

View File

@ -169,7 +169,7 @@ int main(int argc, char **argv)
memset(last_tasks_done, 0, sizeof(last_tasks_done)); memset(last_tasks_done, 0, sizeof(last_tasks_done));
for (i = 0; i < SPDK_TRACE_MAX_LCORE; i++) { 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]; last_tasks_done[i] = history->tpoint_count[TRACE_ISCSI_TASK_DONE];
} }
@ -227,7 +227,7 @@ int main(int argc, char **argv)
printf("=============\n"); printf("=============\n");
total_tasks_done_per_sec = 0; total_tasks_done_per_sec = 0;
for (i = 0; i < SPDK_TRACE_MAX_LCORE; i++) { 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 = history->tpoint_count[TRACE_ISCSI_TASK_DONE];
tasks_done_delta = tasks_done - last_tasks_done[i]; tasks_done_delta = tasks_done - last_tasks_done[i];
if (tasks_done_delta == 0) { if (tasks_done_delta == 0) {

View File

@ -284,7 +284,8 @@ static void usage(void)
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
void *history_ptr; void *history_ptr;
struct spdk_trace_history *history_entries, *history; struct spdk_trace_history *history;
struct spdk_trace_histories *histories;
int fd, i; int fd, i;
int lcore = SPDK_TRACE_MAX_LCORE; int lcore = SPDK_TRACE_MAX_LCORE;
uint64_t tsc_offset; uint64_t tsc_offset;
@ -293,9 +294,7 @@ int main(int argc, char **argv)
int op; int op;
char shm_name[64]; char shm_name[64];
int shm_id = -1, shm_pid = -1; int shm_id = -1, shm_pid = -1;
uint64_t num_entries;
uint64_t trace_histories_size; uint64_t trace_histories_size;
uint64_t lcore_history_size;
g_exe_name = argv[0]; g_exe_name = argv[0];
while ((op = getopt(argc, argv, "c:f:i:p:qs:")) != -1) { while ((op = getopt(argc, argv, "c:f:i:p:qs:")) != -1) {
@ -375,15 +374,12 @@ int main(int argc, char **argv)
exit(-1); exit(-1);
} }
num_entries = g_histories->flags.num_entries;
if (g_verbose) { if (g_verbose) {
printf("TSC Rate: %ju\n", g_tsc_rate); printf("TSC Rate: %ju\n", g_tsc_rate);
printf("Number Trace Entries per lcore: %ju\n", num_entries);
} }
/* Remap the entire trace file */ /* 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)); munmap(history_ptr, sizeof(*g_histories));
history_ptr = mmap(NULL, trace_histories_size, PROT_READ, MAP_SHARED, fd, 0); history_ptr = mmap(NULL, trace_histories_size, PROT_READ, MAP_SHARED, fd, 0);
if (history_ptr == MAP_FAILED) { if (history_ptr == MAP_FAILED) {
@ -394,26 +390,34 @@ int main(int argc, char **argv)
g_histories = (struct spdk_trace_histories *)history_ptr; g_histories = (struct spdk_trace_histories *)history_ptr;
lcore_history_size = spdk_get_trace_history_size(num_entries); histories = (struct spdk_trace_histories *)malloc(trace_histories_size);
history_entries = (struct spdk_trace_history *)malloc(lcore_history_size * SPDK_TRACE_MAX_LCORE); if (histories == NULL) {
if (history_entries == NULL) {
goto cleanup; 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) { if (lcore == SPDK_TRACE_MAX_LCORE) {
for (i = 0; i < SPDK_TRACE_MAX_LCORE; i++) { 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) { if (history->entries[0].tsc == 0) {
continue; 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 { } 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) { 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); process_event(it->second, g_tsc_rate, tsc_offset, it->first.lcore);
} }
free(history_entries); free(histories);
cleanup: cleanup:
munmap(history_ptr, trace_histories_size); munmap(history_ptr, trace_histories_size);

View File

@ -92,6 +92,9 @@ struct spdk_trace_history {
/** Logical core number associated with this structure instance. */ /** Logical core number associated with this structure instance. */
int lcore; 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 * Running count of number of occurrences of each tracepoint on this
* lcore. Debug tools can use this to easily count tracepoints such as * lcore. Debug tools can use this to easily count tracepoints such as
@ -115,11 +118,15 @@ struct spdk_trace_history {
struct spdk_trace_flags { struct spdk_trace_flags {
uint64_t tsc_rate; uint64_t tsc_rate;
uint64_t num_entries;
uint64_t tpoint_mask[SPDK_TRACE_MAX_GROUP_ID]; uint64_t tpoint_mask[SPDK_TRACE_MAX_GROUP_ID];
struct spdk_trace_owner owner[UCHAR_MAX + 1]; struct spdk_trace_owner owner[UCHAR_MAX + 1];
struct spdk_trace_object object[UCHAR_MAX + 1]; struct spdk_trace_object object[UCHAR_MAX + 1];
struct spdk_trace_tpoint tpoint[SPDK_TRACE_MAX_TPOINT_ID]; 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_flags *g_trace_flags;
extern struct spdk_trace_histories *g_trace_histories; 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 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; return trace_histories->flags.lcore_history_offsets[SPDK_TRACE_MAX_LCORE];
size = sizeof(struct spdk_trace_flags);
size += spdk_get_trace_history_size(num_entries) * SPDK_TRACE_MAX_LCORE;
return size;
} }
static inline struct spdk_trace_history * static inline struct spdk_trace_history *
spdk_get_per_lcore_history(struct spdk_trace_histories *trace_histories, unsigned lcore, spdk_get_per_lcore_history(struct spdk_trace_histories *trace_histories, unsigned lcore)
uint64_t num_entries)
{ {
char *lcore_history_offset; char *lcore_history_offset;
lcore_history_offset = (char *)trace_histories->per_lcore_history; if (lcore >= SPDK_TRACE_MAX_LCORE) {
lcore_history_offset += lcore * spdk_get_trace_history_size(num_entries); 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; return (struct spdk_trace_history *)lcore_history_offset;
} }

View File

@ -36,6 +36,7 @@
#include "spdk/env.h" #include "spdk/env.h"
#include "spdk/string.h" #include "spdk/string.h"
#include "spdk/trace.h" #include "spdk/trace.h"
#include "spdk/util.h"
static int g_trace_fd = -1; static int g_trace_fd = -1;
static char g_shm_name[64]; 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; return;
} }
lcore_history = spdk_get_per_lcore_history(g_trace_histories, lcore, lcore_history = spdk_get_per_lcore_history(g_trace_histories, lcore);
g_trace_histories->flags.num_entries);
if (tsc == 0) { if (tsc == 0) {
tsc = spdk_get_ticks(); 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; next_entry->arg1 = arg1;
lcore_history->next_entry++; 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; lcore_history->next_entry = 0;
} }
} }
@ -81,7 +81,14 @@ int
spdk_trace_init(const char *shm_name, uint64_t num_entries) spdk_trace_init(const char *shm_name, uint64_t num_entries)
{ {
int i = 0; 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); 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 = &g_trace_histories->flags;
g_trace_flags->tsc_rate = spdk_get_ticks_hz(); 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++) { for (i = 0; i < SPDK_TRACE_MAX_LCORE; i++) {
struct spdk_trace_history *lcore_history; 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->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(); spdk_trace_flags_init();