Commit 58b9a18e authored by Stanislav Fomichev's avatar Stanislav Fomichev Committed by Arnaldo Carvalho de Melo

perf timechart: Get number of CPUs from perf header

Print all CPUs, even if there were no events (use perf header to get
number of CPUs).

This is required to support topology in the next patch.
Signed-off-by: default avatarStanislav Fomichev <stfomichev@yandex-team.ru>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Ramkumar Ramachandra <artagnon@gmail.com>
Link: http://lkml.kernel.org/r/1385995056-20158-4-git-send-email-stfomichev@yandex-team.ruSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent de996228
...@@ -531,12 +531,10 @@ static int process_sample_event(struct perf_tool *tool, ...@@ -531,12 +531,10 @@ static int process_sample_event(struct perf_tool *tool,
tchart->last_time = sample->time; tchart->last_time = sample->time;
} }
if (sample->cpu > tchart->numcpus)
tchart->numcpus = sample->cpu;
if (evsel->handler != NULL) { if (evsel->handler != NULL) {
tracepoint_handler f = evsel->handler; tracepoint_handler f = evsel->handler;
return f(tchart, evsel, sample, cat_backtrace(event, sample, machine)); return f(tchart, evsel, sample,
cat_backtrace(event, sample, machine));
} }
return 0; return 0;
...@@ -1038,8 +1036,6 @@ static void write_svg_file(struct timechart *tchart, const char *filename) ...@@ -1038,8 +1036,6 @@ static void write_svg_file(struct timechart *tchart, const char *filename)
int count; int count;
int thresh = TIME_THRESH; int thresh = TIME_THRESH;
tchart->numcpus++;
if (tchart->power_only) if (tchart->power_only)
tchart->proc_num = 0; tchart->proc_num = 0;
...@@ -1069,6 +1065,25 @@ static void write_svg_file(struct timechart *tchart, const char *filename) ...@@ -1069,6 +1065,25 @@ static void write_svg_file(struct timechart *tchart, const char *filename)
svg_close(); svg_close();
} }
static int process_header(struct perf_file_section *section __maybe_unused,
struct perf_header *ph,
int feat,
int fd __maybe_unused,
void *data)
{
struct timechart *tchart = data;
switch (feat) {
case HEADER_NRCPUS:
tchart->numcpus = ph->env.nr_cpus_avail;
break;
default:
break;
}
return 0;
}
static int __cmd_timechart(struct timechart *tchart, const char *output_name) static int __cmd_timechart(struct timechart *tchart, const char *output_name)
{ {
const struct perf_evsel_str_handler power_tracepoints[] = { const struct perf_evsel_str_handler power_tracepoints[] = {
...@@ -1094,6 +1109,11 @@ static int __cmd_timechart(struct timechart *tchart, const char *output_name) ...@@ -1094,6 +1109,11 @@ static int __cmd_timechart(struct timechart *tchart, const char *output_name)
if (session == NULL) if (session == NULL)
return -ENOMEM; return -ENOMEM;
(void)perf_header__process_sections(&session->header,
perf_data_file__fd(session->file),
tchart,
process_header);
if (!perf_session__has_traces(session, "timechart record")) if (!perf_session__has_traces(session, "timechart record"))
goto out_delete; goto out_delete;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment