Messages in this thread Patch in this message | | | Subject | [PATCH v1 3/8] perf stat: introduce control descriptors and --ctl-fd[-ack] options | From | Alexey Budankov <> | Date | Fri, 27 Mar 2020 11:47:40 +0300 |
| |
Introduce control file descriptors and --ctl-fd[-ack] options to pass control descriptors from command line. Extend --delay option with -1 value to start collection in paused mode to be resumed later by resume command provided via control file descriptor.
Signed-off-by: Alexey Budankov <alexey.budankov@linux.intel.com> --- tools/perf/builtin-stat.c | 28 ++++++++++++++++++++++++---- tools/perf/util/evlist.h | 3 +++ tools/perf/util/stat.h | 4 +++- 3 files changed, 30 insertions(+), 5 deletions(-)
diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c index ec053dc1e35c..0a1b79fd3f48 100644 --- a/tools/perf/builtin-stat.c +++ b/tools/perf/builtin-stat.c @@ -187,6 +187,8 @@ static struct perf_stat_config stat_config = { .metric_only_len = METRIC_ONLY_LEN, .walltime_nsecs_stats = &walltime_nsecs_stats, .big_num = true, + .ctl_fd = -1, + .ctl_fd_ack = -1 }; static inline void diff_timespec(struct timespec *r, struct timespec *a, @@ -373,16 +375,26 @@ static void process_interval(void) static void enable_counters(void) { - if (stat_config.initial_delay) + if (stat_config.initial_delay < 0) { + pr_info(PERF_EVLIST__PAUSED_MSG); + return; + } + + if (stat_config.initial_delay > 0) { + pr_info(PERF_EVLIST__PAUSED_MSG); usleep(stat_config.initial_delay * USEC_PER_MSEC); + } /* * We need to enable counters only if: * - we don't have tracee (attaching to task or cpu) * - we have initial delay configured */ - if (!target__none(&target) || stat_config.initial_delay) + if (!target__none(&target) || stat_config.initial_delay) { evlist__enable(evsel_list); + if (stat_config.initial_delay > 0) + pr_info(PERF_EVLIST__RESUMED_MSG); + } } static void disable_counters(void) @@ -912,8 +924,8 @@ static struct option stat_options[] = { "aggregate counts per thread", AGGR_THREAD), OPT_SET_UINT(0, "per-node", &stat_config.aggr_mode, "aggregate counts per numa node", AGGR_NODE), - OPT_UINTEGER('D', "delay", &stat_config.initial_delay, - "ms to wait before starting measurement after program start"), + OPT_INTEGER('D', "delay", &stat_config.initial_delay, + "ms to wait before starting measurement after program start (-1: start paused"), OPT_CALLBACK_NOOPT(0, "metric-only", &stat_config.metric_only, NULL, "Only print computed metrics. No raw values", enable_metric_only), OPT_BOOLEAN(0, "topdown", &topdown_run, @@ -933,6 +945,10 @@ static struct option stat_options[] = { "Use with 'percore' event qualifier to show the event " "counts of one hardware thread by sum up total hardware " "threads of same physical core"), + OPT_INTEGER(0, "ctl-fd", &stat_config.ctl_fd, + "Listen on fd descriptor for command to control measurement ('r': resume, 'p': pause)"), + OPT_INTEGER(0, "ctl-fd-ack", &stat_config.ctl_fd_ack, + "Send control command completion ('a') to fd ack descriptor"), OPT_END() }; @@ -2129,6 +2145,8 @@ int cmd_stat(int argc, const char **argv) signal(SIGALRM, skip_signal); signal(SIGABRT, skip_signal); + perf_evlist__initialize_ctlfd(evsel_list, stat_config.ctl_fd, stat_config.ctl_fd_ack); + status = 0; for (run_idx = 0; forever || run_idx < stat_config.run_count; run_idx++) { if (stat_config.run_count != 1 && verbose > 0) @@ -2148,6 +2166,8 @@ int cmd_stat(int argc, const char **argv) if (!forever && status != -1 && !interval) print_counters(NULL, argc, argv); + perf_evlist__finalize_ctlfd(evsel_list); + if (STAT_RECORD) { /* * We synthesize the kernel mmap record just so that older tools diff --git a/tools/perf/util/evlist.h b/tools/perf/util/evlist.h index a94b2993fafc..c91368483074 100644 --- a/tools/perf/util/evlist.h +++ b/tools/perf/util/evlist.h @@ -369,6 +369,9 @@ enum evlist_ctl_cmd { CTL_CMD_ACK = 'a' }; +#define PERF_EVLIST__RESUMED_MSG "Monitoring resumed\n" +#define PERF_EVLIST__PAUSED_MSG "Monitoring paused\n" + int perf_evlist__initialize_ctlfd(struct evlist *evlist, int ctl_fd, int ctl_fd_ack); int perf_evlist__finalize_ctlfd(struct evlist *evlist); int perf_evlist__ctlfd_process(struct evlist *evlist, enum evlist_ctl_cmd *cmd); diff --git a/tools/perf/util/stat.h b/tools/perf/util/stat.h index b4fdfaa7f2c0..0b0fa3a2cde2 100644 --- a/tools/perf/util/stat.h +++ b/tools/perf/util/stat.h @@ -113,7 +113,7 @@ struct perf_stat_config { FILE *output; unsigned int interval; unsigned int timeout; - unsigned int initial_delay; + int initial_delay; unsigned int unit_width; unsigned int metric_only_len; int times; @@ -130,6 +130,8 @@ struct perf_stat_config { struct perf_cpu_map *cpus_aggr_map; u64 *walltime_run; struct rblist metric_events; + int ctl_fd; + int ctl_fd_ack; }; void update_stats(struct stats *stats, u64 val); -- 2.24.1
| |