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); |
