Commit 3f229f0e authored by Jim Harris's avatar Jim Harris
Browse files

app/trace: calculate per-core overlaps correctly



Remove the calculation of g_last_tsc.  This was erroneously
cutting out valid data - for example, when reactor X has
an event that happened very early on, then reactor Y fills
its buffer before reactor X has another event.  All of reactor
Y's data would be ignored until reactor X processed another
event.

While here, remove some code that should have been removed
as part of the fudge_factor removal.  Also use SPDK_COUNTOF
to simplify calculation of the number of entries per
reactor buffer.

Reported-by: John Kariuki
Signed-off-by: default avatarJim Harris <james.r.harris@intel.com>
Change-Id: I16c7f80cbfc8b4bb5f90a195d30df69e07b4ff85

Reviewed-on: https://review.gerrithub.io/424615


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Chandler-Test-Pool: SPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: default avatarShuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-by: default avatarBen Walker <benjamin.walker@intel.com>
parent ea0afee0
Loading
Loading
Loading
Loading
+8 −22
Original line number Diff line number Diff line
@@ -37,6 +37,7 @@

extern "C" {
#include "spdk/trace.h"
#include "spdk/util.h"
}

static struct spdk_trace_histories *g_histories;
@@ -84,7 +85,6 @@ static int g_verbose = 1;

static uint64_t g_tsc_rate;
static uint64_t g_first_tsc = 0x0;
static uint64_t g_last_tsc = -1ULL;

static float
get_us_from_tsc(uint64_t tsc, uint64_t tsc_rate)
@@ -212,15 +212,13 @@ process_event(struct spdk_trace_entry *e, uint64_t tsc_rate,
static int
populate_events(struct spdk_trace_history *history)
{
	int i, entry_size, history_size, num_entries, num_entries_filled;
	int i, num_entries, num_entries_filled;
	struct spdk_trace_entry *e;
	int first, last, lcore;

	lcore = history->lcore;

	entry_size = sizeof(history->entries[0]);
	history_size = sizeof(history->entries);
	num_entries = history_size / entry_size;
	num_entries = SPDK_COUNTOF(history->entries);

	e = history->entries;

@@ -239,32 +237,20 @@ populate_events(struct spdk_trace_history *history)
				last = i;
			}
		}

		if (first >= num_entries) {
			first -= num_entries;
		}

		if (last < 0) {
			last += num_entries;
		}
	} else {
		first = 0;
		last = num_entries_filled - 1;
	}

	/*
	 * We keep track of the highest first TSC out of all reactors and
	 *  the lowest last TSC out of all reactors.  We will ignore any
	 *  events outside the range of these two TSC values.  This will
	 *  ensure we only print data for the subset of time where we have
	 *  data across all reactors.
	 * We keep track of the highest first TSC out of all reactors.
	 *  We will ignore any events that occured before this TSC on any
	 *  other reactors.  This will ensure we only print data for the
	 *  subset of time where we have data across all reactors.
	 */
	if (e[first].tsc > g_first_tsc) {
		g_first_tsc = e[first].tsc;
	}
	if (e[last].tsc < g_last_tsc) {
		g_last_tsc = e[last].tsc;
	}

	i = first;
	while (1) {
@@ -416,7 +402,7 @@ int main(int argc, char **argv)

	tsc_offset = g_first_tsc;
	for (entry_map::iterator it = g_entry_map.begin(); it != g_entry_map.end(); it++) {
		if (it->first.tsc < g_first_tsc || it->first.tsc > g_last_tsc) {
		if (it->first.tsc < g_first_tsc) {
			continue;
		}
		process_event(it->second, g_tsc_rate, tsc_offset, it->first.lcore);