Messages in this thread | | | Date | Thu, 2 Apr 2020 16:17:58 +0200 | From | Jiri Olsa <> | Subject | Re: [PATCH v1 3/8] perf stat: introduce control descriptors and --ctl-fd[-ack] options |
| |
On Fri, Mar 27, 2020 at 11:47:40AM +0300, Alexey Budankov wrote: > > 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.
could you please separate those 2 changes? also for record change
thanks, jirka
> > 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 > >
| |