Skip to content

Commit

Permalink
perf stat: Document and simplify interval timestamps
Browse files Browse the repository at this point in the history
Rename 'prefix' to 'timestamp' because that's all it does, except in
iostat mode where it's slightly overloaded, but still includes a
timestamp. This reveals a problem with iostat and JSON mode so document
this.

Make it more explicit that these are printed in interval mode by
changing 'if (prefix)' to 'if (interval)' which reveals an unnecessary
'else if (... && !interval)' which can be removed.

Signed-off-by: James Clark <james.clark@linaro.org>
Tested-by: Ian Rogers <irogers@google.com>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Kan Liang <kan.liang@linux.intel.com>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Tim Chen <tim.c.chen@linux.intel.com>
Cc: Yicong Yang <yangyicong@hisilicon.com>
Link: https://lore.kernel.org/r/20241112160048.951213-5-james.clark@linaro.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
  • Loading branch information
james-c-linaro authored and acmel committed Dec 26, 2024
1 parent d226f43 commit dd56668
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 24 deletions.
4 changes: 4 additions & 0 deletions tools/perf/arch/x86/util/iostat.c
Original file line number Diff line number Diff line change
Expand Up @@ -403,6 +403,10 @@ void iostat_prefix(struct evlist *evlist,
struct iio_root_port *rp = evlist->selected->priv;

if (rp) {
/*
* TODO: This is the incorrect format in JSON mode.
* See prepare_timestamp()
*/
if (ts)
sprintf(prefix, "%6lu.%09lu%s%04x:%02x%s",
ts->tv_sec, ts->tv_nsec,
Expand Down
45 changes: 21 additions & 24 deletions tools/perf/util/stat-display.c
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,8 @@ struct outstate {
FILE *fh;
bool newline;
bool first;
const char *prefix;
/* Lines are timestamped in --interval-print mode */
char timestamp[64];
int nfields;
int aggr_nr;
struct aggr_cpu_id id;
Expand Down Expand Up @@ -419,8 +420,8 @@ static inline void __new_line_std_csv(struct perf_stat_config *config,
struct outstate *os)
{
fputc('\n', os->fh);
if (os->prefix)
fputs(os->prefix, os->fh);
if (config->interval)
fputs(os->timestamp, os->fh);
aggr_printout(config, os, os->evsel, os->id, os->aggr_nr);
}

Expand Down Expand Up @@ -523,8 +524,8 @@ static void new_line_json(struct perf_stat_config *config, void *ctx)

fputs("\n{", os->fh);
os->first = true;
if (os->prefix)
json_out(os, "%s", os->prefix);
if (config->interval)
json_out(os, "%s", os->timestamp);

aggr_printout(config, os, os->evsel, os->id, os->aggr_nr);
}
Expand Down Expand Up @@ -1091,13 +1092,13 @@ static void print_counter_aggrdata(struct perf_stat_config *config,
os->first = true;
fputc('{', output);
}
if (os->prefix) {
if (config->interval) {
if (config->json_output)
json_out(os, "%s", os->prefix);
json_out(os, "%s", os->timestamp);
else
fprintf(output, "%s", os->prefix);
fprintf(output, "%s", os->timestamp);
} else if (config->summary && config->csv_output &&
!config->no_csv_summary && !config->interval)
!config->no_csv_summary)
fprintf(output, "%s%s", "summary", config->csv_sep);
}

Expand All @@ -1124,11 +1125,11 @@ static void print_metric_begin(struct perf_stat_config *config,
if (config->json_output)
fputc('{', config->output);

if (os->prefix) {
if (config->interval) {
if (config->json_output)
json_out(os, "%s", os->prefix);
json_out(os, "%s", os->timestamp);
else
fprintf(config->output, "%s", os->prefix);
fprintf(config->output, "%s", os->timestamp);
}
evsel = evlist__first(evlist);
id = config->aggr_map->map[aggr_idx];
Expand Down Expand Up @@ -1349,20 +1350,20 @@ static void print_metric_headers(struct perf_stat_config *config,
fputc('\n', config->output);
}

static void prepare_interval(struct perf_stat_config *config,
char *prefix, size_t len, struct timespec *ts)
static void prepare_timestamp(struct perf_stat_config *config,
struct outstate *os, struct timespec *ts)
{
if (config->iostat_run)
return;

if (config->json_output)
scnprintf(prefix, len, "\"interval\" : %lu.%09lu",
scnprintf(os->timestamp, sizeof(os->timestamp), "\"interval\" : %lu.%09lu",
(unsigned long) ts->tv_sec, ts->tv_nsec);
else if (config->csv_output)
scnprintf(prefix, len, "%lu.%09lu%s",
scnprintf(os->timestamp, sizeof(os->timestamp), "%lu.%09lu%s",
(unsigned long) ts->tv_sec, ts->tv_nsec, config->csv_sep);
else
scnprintf(prefix, len, "%6lu.%09lu ",
scnprintf(os->timestamp, sizeof(os->timestamp), "%6lu.%09lu ",
(unsigned long) ts->tv_sec, ts->tv_nsec);
}

Expand Down Expand Up @@ -1685,9 +1686,7 @@ void evlist__print_counters(struct evlist *evlist, struct perf_stat_config *conf
int argc, const char **argv)
{
bool metric_only = config->metric_only;
int interval = config->interval;
struct evsel *counter;
char buf[64];
struct outstate os = {
.fh = config->output,
.first = true,
Expand All @@ -1698,10 +1697,8 @@ void evlist__print_counters(struct evlist *evlist, struct perf_stat_config *conf
if (config->iostat_run)
evlist->selected = evlist__first(evlist);

if (interval) {
os.prefix = buf;
prepare_interval(config, buf, sizeof(buf), ts);
}
if (config->interval)
prepare_timestamp(config, &os, ts);

print_header(config, _target, evlist, argc, argv);

Expand All @@ -1720,7 +1717,7 @@ void evlist__print_counters(struct evlist *evlist, struct perf_stat_config *conf
case AGGR_THREAD:
case AGGR_GLOBAL:
if (config->iostat_run) {
iostat_print_counters(evlist, config, ts, buf,
iostat_print_counters(evlist, config, ts, os.timestamp,
(iostat_print_counter_t)print_counter, &os);
} else if (config->cgroup_list) {
print_cgroup_counter(config, evlist, &os);
Expand Down

0 comments on commit dd56668

Please sign in to comment.