Skip to content

Commit

Permalink
perf script: Fix --reltime with --time
Browse files Browse the repository at this point in the history
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: 3714437 ("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>
  • Loading branch information
Andi Kleen authored and Arnaldo Carvalho de Melo committed Oct 15, 2019
1 parent bb91a07 commit b3509b6
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 5 deletions.
5 changes: 3 additions & 2 deletions tools/perf/builtin-script.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down
27 changes: 24 additions & 3 deletions tools/perf/util/time-utils.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -471,15 +472,17 @@ 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"
"Please use latest perf binary to execute 'perf record'\n"
"(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,
Expand All @@ -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;
Expand All @@ -504,6 +516,15 @@ int perf_time__parse_for_ranges(const char *time_str,
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;
Expand Down
5 changes: 5 additions & 0 deletions tools/perf/util/time-utils.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down

0 comments on commit b3509b6

Please sign in to comment.