diff options
Diffstat (limited to 'tools/perf/builtin-script.c')
-rw-r--r-- | tools/perf/builtin-script.c | 34 |
1 files changed, 28 insertions, 6 deletions
diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c index 77e47cf39f2c..330dcd9b9b8f 100644 --- a/tools/perf/builtin-script.c +++ b/tools/perf/builtin-script.c | |||
@@ -1436,6 +1436,8 @@ static int perf_sample__fprintf_synth(struct perf_sample *sample, | |||
1436 | return 0; | 1436 | return 0; |
1437 | } | 1437 | } |
1438 | 1438 | ||
1439 | #define PTIME_RANGE_MAX 10 | ||
1440 | |||
1439 | struct perf_script { | 1441 | struct perf_script { |
1440 | struct perf_tool tool; | 1442 | struct perf_tool tool; |
1441 | struct perf_session *session; | 1443 | struct perf_session *session; |
@@ -1449,7 +1451,8 @@ struct perf_script { | |||
1449 | struct thread_map *threads; | 1451 | struct thread_map *threads; |
1450 | int name_width; | 1452 | int name_width; |
1451 | const char *time_str; | 1453 | const char *time_str; |
1452 | struct perf_time_interval ptime; | 1454 | struct perf_time_interval ptime_range[PTIME_RANGE_MAX]; |
1455 | int range_num; | ||
1453 | }; | 1456 | }; |
1454 | 1457 | ||
1455 | static int perf_evlist__max_name_len(struct perf_evlist *evlist) | 1458 | static int perf_evlist__max_name_len(struct perf_evlist *evlist) |
@@ -1734,8 +1737,10 @@ static int process_sample_event(struct perf_tool *tool, | |||
1734 | struct perf_script *scr = container_of(tool, struct perf_script, tool); | 1737 | struct perf_script *scr = container_of(tool, struct perf_script, tool); |
1735 | struct addr_location al; | 1738 | struct addr_location al; |
1736 | 1739 | ||
1737 | if (perf_time__skip_sample(&scr->ptime, sample->time)) | 1740 | if (perf_time__ranges_skip_sample(scr->ptime_range, scr->range_num, |
1741 | sample->time)) { | ||
1738 | return 0; | 1742 | return 0; |
1743 | } | ||
1739 | 1744 | ||
1740 | if (debug_mode) { | 1745 | if (debug_mode) { |
1741 | if (sample->time < last_timestamp) { | 1746 | if (sample->time < last_timestamp) { |
@@ -3360,10 +3365,27 @@ int cmd_script(int argc, const char **argv) | |||
3360 | goto out_delete; | 3365 | goto out_delete; |
3361 | 3366 | ||
3362 | /* needs to be parsed after looking up reference time */ | 3367 | /* needs to be parsed after looking up reference time */ |
3363 | if (perf_time__parse_str(&script.ptime, script.time_str) != 0) { | 3368 | if (perf_time__parse_str(script.ptime_range, script.time_str) != 0) { |
3364 | pr_err("Invalid time string\n"); | 3369 | if (session->evlist->first_sample_time == 0 && |
3365 | err = -EINVAL; | 3370 | session->evlist->last_sample_time == 0) { |
3366 | goto out_delete; | 3371 | pr_err("No first/last sample time in perf data\n"); |
3372 | err = -EINVAL; | ||
3373 | goto out_delete; | ||
3374 | } | ||
3375 | |||
3376 | script.range_num = perf_time__percent_parse_str( | ||
3377 | script.ptime_range, PTIME_RANGE_MAX, | ||
3378 | script.time_str, | ||
3379 | session->evlist->first_sample_time, | ||
3380 | session->evlist->last_sample_time); | ||
3381 | |||
3382 | if (script.range_num < 0) { | ||
3383 | pr_err("Invalid time string\n"); | ||
3384 | err = -EINVAL; | ||
3385 | goto out_delete; | ||
3386 | } | ||
3387 | } else { | ||
3388 | script.range_num = 1; | ||
3367 | } | 3389 | } |
3368 | 3390 | ||
3369 | err = __cmd_script(&script); | 3391 | err = __cmd_script(&script); |