diff options
Diffstat (limited to 'tools/perf/builtin-stat.c')
-rw-r--r-- | tools/perf/builtin-stat.c | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c index 352fbd7ff4a1..2e637e4c951d 100644 --- a/tools/perf/builtin-stat.c +++ b/tools/perf/builtin-stat.c | |||
@@ -100,6 +100,7 @@ static const char *pre_cmd = NULL; | |||
100 | static const char *post_cmd = NULL; | 100 | static const char *post_cmd = NULL; |
101 | static bool sync_run = false; | 101 | static bool sync_run = false; |
102 | static unsigned int interval = 0; | 102 | static unsigned int interval = 0; |
103 | static unsigned int initial_delay = 0; | ||
103 | static bool forever = false; | 104 | static bool forever = false; |
104 | static struct timespec ref_time; | 105 | static struct timespec ref_time; |
105 | static struct cpu_map *aggr_map; | 106 | static struct cpu_map *aggr_map; |
@@ -254,7 +255,8 @@ static int create_perf_stat_counter(struct perf_evsel *evsel) | |||
254 | if (!perf_target__has_task(&target) && | 255 | if (!perf_target__has_task(&target) && |
255 | perf_evsel__is_group_leader(evsel)) { | 256 | perf_evsel__is_group_leader(evsel)) { |
256 | attr->disabled = 1; | 257 | attr->disabled = 1; |
257 | attr->enable_on_exec = 1; | 258 | if (!initial_delay) |
259 | attr->enable_on_exec = 1; | ||
258 | } | 260 | } |
259 | 261 | ||
260 | return perf_evsel__open_per_thread(evsel, evsel_list->threads); | 262 | return perf_evsel__open_per_thread(evsel, evsel_list->threads); |
@@ -416,6 +418,20 @@ static void print_interval(void) | |||
416 | } | 418 | } |
417 | } | 419 | } |
418 | 420 | ||
421 | static void handle_initial_delay(void) | ||
422 | { | ||
423 | struct perf_evsel *counter; | ||
424 | |||
425 | if (initial_delay) { | ||
426 | const int ncpus = cpu_map__nr(evsel_list->cpus), | ||
427 | nthreads = thread_map__nr(evsel_list->threads); | ||
428 | |||
429 | usleep(initial_delay * 1000); | ||
430 | list_for_each_entry(counter, &evsel_list->entries, node) | ||
431 | perf_evsel__enable(counter, ncpus, nthreads); | ||
432 | } | ||
433 | } | ||
434 | |||
419 | static int __run_perf_stat(int argc, const char **argv) | 435 | static int __run_perf_stat(int argc, const char **argv) |
420 | { | 436 | { |
421 | char msg[512]; | 437 | char msg[512]; |
@@ -486,6 +502,7 @@ static int __run_perf_stat(int argc, const char **argv) | |||
486 | 502 | ||
487 | if (forks) { | 503 | if (forks) { |
488 | perf_evlist__start_workload(evsel_list); | 504 | perf_evlist__start_workload(evsel_list); |
505 | handle_initial_delay(); | ||
489 | 506 | ||
490 | if (interval) { | 507 | if (interval) { |
491 | while (!waitpid(child_pid, &status, WNOHANG)) { | 508 | while (!waitpid(child_pid, &status, WNOHANG)) { |
@@ -497,6 +514,7 @@ static int __run_perf_stat(int argc, const char **argv) | |||
497 | if (WIFSIGNALED(status)) | 514 | if (WIFSIGNALED(status)) |
498 | psignal(WTERMSIG(status), argv[0]); | 515 | psignal(WTERMSIG(status), argv[0]); |
499 | } else { | 516 | } else { |
517 | handle_initial_delay(); | ||
500 | while (!done) { | 518 | while (!done) { |
501 | nanosleep(&ts, NULL); | 519 | nanosleep(&ts, NULL); |
502 | if (interval) | 520 | if (interval) |
@@ -1419,6 +1437,8 @@ int cmd_stat(int argc, const char **argv, const char *prefix __maybe_unused) | |||
1419 | "aggregate counts per processor socket", AGGR_SOCKET), | 1437 | "aggregate counts per processor socket", AGGR_SOCKET), |
1420 | OPT_SET_UINT(0, "per-core", &aggr_mode, | 1438 | OPT_SET_UINT(0, "per-core", &aggr_mode, |
1421 | "aggregate counts per physical processor core", AGGR_CORE), | 1439 | "aggregate counts per physical processor core", AGGR_CORE), |
1440 | OPT_UINTEGER('D', "delay", &initial_delay, | ||
1441 | "ms to wait before starting measurement after program start"), | ||
1422 | OPT_END() | 1442 | OPT_END() |
1423 | }; | 1443 | }; |
1424 | const char * const stat_usage[] = { | 1444 | const char * const stat_usage[] = { |