perf report: Remove the time slices number limitation

Previously it was only allowed to use at most 10 time slices in 'perf
report --time'.

This patch removes this limitation.
For example, following command line is OK (12 time slices)

perf report --stdio --time 1%/1,1%/2,1%/3,1%/4,1%/5,1%/6,1%/7,1%/8,1%/9,1%/10,1%/11,1%/12

Signed-off-by: Jin Yao <yao.jin@linux.intel.com>
Suggested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Reviewed-by: Jiri Olsa <jolsa@redhat.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Kan Liang <kan.liang@intel.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: http://lkml.kernel.org/r/1515596433-24653-8-git-send-email-yao.jin@linux.intel.com
[ No need to check for NULL to call free, use zfree ]
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
Jin Yao 2018-01-10 23:00:32 +08:00 committed by Arnaldo Carvalho de Melo
parent 5a031f887c
commit 0a3cc3ae05
2 changed files with 17 additions and 7 deletions

View file

@ -403,7 +403,7 @@ OPTIONS
to end of file. to end of file.
Also support time percent with multiple time range. Time string is Also support time percent with multiple time range. Time string is
'a%/n,b%/m,...' or 'a%-b%,c%-%d,...'. The maximum number of slices is 10. 'a%/n,b%/m,...' or 'a%-b%,c%-%d,...'.
For example: For example:
Select the second 10% time slice: Select the second 10% time slice:

View file

@ -54,8 +54,6 @@
#include <unistd.h> #include <unistd.h>
#include <linux/mman.h> #include <linux/mman.h>
#define PTIME_RANGE_MAX 10
struct report { struct report {
struct perf_tool tool; struct perf_tool tool;
struct perf_session *session; struct perf_session *session;
@ -76,7 +74,8 @@ struct report {
const char *cpu_list; const char *cpu_list;
const char *symbol_filter_str; const char *symbol_filter_str;
const char *time_str; const char *time_str;
struct perf_time_interval ptime_range[PTIME_RANGE_MAX]; struct perf_time_interval *ptime_range;
int range_size;
int range_num; int range_num;
float min_percent; float min_percent;
u64 nr_entries; u64 nr_entries;
@ -1300,24 +1299,33 @@ int cmd_report(int argc, const char **argv)
if (symbol__init(&session->header.env) < 0) if (symbol__init(&session->header.env) < 0)
goto error; goto error;
report.ptime_range = perf_time__range_alloc(report.time_str,
&report.range_size);
if (!report.ptime_range) {
ret = -ENOMEM;
goto error;
}
if (perf_time__parse_str(report.ptime_range, report.time_str) != 0) { if (perf_time__parse_str(report.ptime_range, report.time_str) != 0) {
if (session->evlist->first_sample_time == 0 && if (session->evlist->first_sample_time == 0 &&
session->evlist->last_sample_time == 0) { session->evlist->last_sample_time == 0) {
pr_err("HINT: no first/last sample time found in perf data.\n" pr_err("HINT: no first/last sample time found in perf data.\n"
"Please use latest perf binary to execute 'perf record'\n" "Please use latest perf binary to execute 'perf record'\n"
"(if '--buildid-all' is enabled, please set '--timestamp-boundary').\n"); "(if '--buildid-all' is enabled, please set '--timestamp-boundary').\n");
return -EINVAL; ret = -EINVAL;
goto error;
} }
report.range_num = perf_time__percent_parse_str( report.range_num = perf_time__percent_parse_str(
report.ptime_range, PTIME_RANGE_MAX, report.ptime_range, report.range_size,
report.time_str, report.time_str,
session->evlist->first_sample_time, session->evlist->first_sample_time,
session->evlist->last_sample_time); session->evlist->last_sample_time);
if (report.range_num < 0) { if (report.range_num < 0) {
pr_err("Invalid time string\n"); pr_err("Invalid time string\n");
return -EINVAL; ret = -EINVAL;
goto error;
} }
} else { } else {
report.range_num = 1; report.range_num = 1;
@ -1333,6 +1341,8 @@ int cmd_report(int argc, const char **argv)
ret = 0; ret = 0;
error: error:
zfree(&report.ptime_range);
perf_session__delete(session); perf_session__delete(session);
return ret; return ret;
} }