perf script: Fix --reltime with --time
My earlier patch to just enable --reltime with --time was a little too
optimistic. The --time parsing would accept absolute time, which is
very confusing to the user.
Support relative time in --time parsing too. This only works with recent
perf record that records the first sample time. Otherwise we error out.
Fixes: 3714437d3f
("perf script: Allow --time with --reltime")
Signed-off-by: Andi Kleen <ak@linux.intel.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Link: http://lore.kernel.org/lkml/20191011182140.8353-1-andi@firstfloor.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
Родитель
bb91a073ed
Коммит
b3509b6ed7
|
@ -3864,10 +3864,11 @@ int cmd_script(int argc, const char **argv)
|
|||
goto out_delete;
|
||||
|
||||
if (script.time_str) {
|
||||
err = perf_time__parse_for_ranges(script.time_str, session,
|
||||
err = perf_time__parse_for_ranges_reltime(script.time_str, session,
|
||||
&script.ptime_range,
|
||||
&script.range_size,
|
||||
&script.range_num);
|
||||
&script.range_num,
|
||||
reltime);
|
||||
if (err < 0)
|
||||
goto out_delete;
|
||||
|
||||
|
|
|
@ -458,10 +458,11 @@ bool perf_time__ranges_skip_sample(struct perf_time_interval *ptime_buf,
|
|||
return true;
|
||||
}
|
||||
|
||||
int perf_time__parse_for_ranges(const char *time_str,
|
||||
int perf_time__parse_for_ranges_reltime(const char *time_str,
|
||||
struct perf_session *session,
|
||||
struct perf_time_interval **ranges,
|
||||
int *range_size, int *range_num)
|
||||
int *range_size, int *range_num,
|
||||
bool reltime)
|
||||
{
|
||||
bool has_percent = strchr(time_str, '%');
|
||||
struct perf_time_interval *ptime_range;
|
||||
|
@ -471,7 +472,7 @@ int perf_time__parse_for_ranges(const char *time_str,
|
|||
if (!ptime_range)
|
||||
return -ENOMEM;
|
||||
|
||||
if (has_percent) {
|
||||
if (has_percent || reltime) {
|
||||
if (session->evlist->first_sample_time == 0 &&
|
||||
session->evlist->last_sample_time == 0) {
|
||||
pr_err("HINT: no first/last sample time found in perf data.\n"
|
||||
|
@ -479,7 +480,9 @@ int perf_time__parse_for_ranges(const char *time_str,
|
|||
"(if '--buildid-all' is enabled, please set '--timestamp-boundary').\n");
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
|
||||
if (has_percent) {
|
||||
num = perf_time__percent_parse_str(
|
||||
ptime_range, size,
|
||||
time_str,
|
||||
|
@ -492,6 +495,15 @@ int perf_time__parse_for_ranges(const char *time_str,
|
|||
if (num < 0)
|
||||
goto error_invalid;
|
||||
|
||||
if (reltime) {
|
||||
int i;
|
||||
|
||||
for (i = 0; i < num; i++) {
|
||||
ptime_range[i].start += session->evlist->first_sample_time;
|
||||
ptime_range[i].end += session->evlist->first_sample_time;
|
||||
}
|
||||
}
|
||||
|
||||
*range_size = size;
|
||||
*range_num = num;
|
||||
*ranges = ptime_range;
|
||||
|
@ -504,6 +516,15 @@ error:
|
|||
return ret;
|
||||
}
|
||||
|
||||
int perf_time__parse_for_ranges(const char *time_str,
|
||||
struct perf_session *session,
|
||||
struct perf_time_interval **ranges,
|
||||
int *range_size, int *range_num)
|
||||
{
|
||||
return perf_time__parse_for_ranges_reltime(time_str, session, ranges,
|
||||
range_size, range_num, false);
|
||||
}
|
||||
|
||||
int timestamp__scnprintf_usec(u64 timestamp, char *buf, size_t sz)
|
||||
{
|
||||
u64 sec = timestamp / NSEC_PER_SEC;
|
||||
|
|
|
@ -26,6 +26,11 @@ bool perf_time__ranges_skip_sample(struct perf_time_interval *ptime_buf,
|
|||
|
||||
struct perf_session;
|
||||
|
||||
int perf_time__parse_for_ranges_reltime(const char *str, struct perf_session *session,
|
||||
struct perf_time_interval **ranges,
|
||||
int *range_size, int *range_num,
|
||||
bool reltime);
|
||||
|
||||
int perf_time__parse_for_ranges(const char *str, struct perf_session *session,
|
||||
struct perf_time_interval **ranges,
|
||||
int *range_size, int *range_num);
|
||||
|
|
Загрузка…
Ссылка в новой задаче