perf record: Implement compatibility checks
authorAlexey Bayduraev <alexey.v.bayduraev@linux.intel.com>
Mon, 17 Jan 2022 18:34:34 +0000 (21:34 +0300)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Thu, 10 Feb 2022 19:27:13 +0000 (16:27 -0300)
Implement compatibility checks for other modes and related command line
options: asynchronous (--aio) trace streaming and affinity (--affinity)
modes, pipe mode, AUX area tracing --snapshot and --aux-sample options,
--switch-output, --switch-output-event, --switch-max-files and
--timestamp-filename options. Parallel data streaming is compatible with
Zstd compression (--compression-level) and external control commands
(--control). CPU mask provided via -C option filters --threads
specification masks.

Reviewed-by: Riccardo Mancini <rickyman7@gmail.com>
Signed-off-by: Alexey Bayduraev <alexey.v.bayduraev@linux.intel.com>
Tested-by: Jiri Olsa <jolsa@kernel.org>
Tested-by: Riccardo Mancini <rickyman7@gmail.com>
Acked-by: Namhyung Kim <namhyung@gmail.com>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Alexander Antonov <alexander.antonov@linux.intel.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Alexei Budankov <abudankov@huawei.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: https://lore.kernel.org/r/fadc1cf74057af4d5766248fcfe5cdde40732aa9.1642440724.git.alexey.v.bayduraev@linux.intel.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/builtin-record.c

index d8adf5f..0bc6529 100644 (file)
@@ -805,6 +805,12 @@ static int record__auxtrace_init(struct record *rec)
 {
        int err;
 
+       if ((rec->opts.auxtrace_snapshot_opts || rec->opts.auxtrace_sample_opts)
+           && record__threads_enabled(rec)) {
+               pr_err("AUX area tracing options are not available in parallel streaming mode.\n");
+               return -EINVAL;
+       }
+
        if (!rec->itr) {
                rec->itr = auxtrace_record__init(rec->evlist, &err);
                if (err)
@@ -2198,6 +2204,17 @@ static int __cmd_record(struct record *rec, int argc, const char **argv)
                return PTR_ERR(session);
        }
 
+       if (record__threads_enabled(rec)) {
+               if (perf_data__is_pipe(&rec->data)) {
+                       pr_err("Parallel trace streaming is not available in pipe mode.\n");
+                       return -1;
+               }
+               if (rec->opts.full_auxtrace) {
+                       pr_err("Parallel trace streaming is not available in AUX area tracing mode.\n");
+                       return -1;
+               }
+       }
+
        fd = perf_data__fd(data);
        rec->session = session;
 
@@ -2938,12 +2955,22 @@ static int switch_output_setup(struct record *rec)
         * --switch-output=signal, as we'll send a SIGUSR2 from the side band
         *  thread to its parent.
         */
-       if (rec->switch_output_event_set)
+       if (rec->switch_output_event_set) {
+               if (record__threads_enabled(rec)) {
+                       pr_warning("WARNING: --switch-output-event option is not available in parallel streaming mode.\n");
+                       return 0;
+               }
                goto do_signal;
+       }
 
        if (!s->set)
                return 0;
 
+       if (record__threads_enabled(rec)) {
+               pr_warning("WARNING: --switch-output option is not available in parallel streaming mode.\n");
+               return 0;
+       }
+
        if (!strcmp(s->str, "signal")) {
 do_signal:
                s->signal = true;
@@ -3262,8 +3289,8 @@ static struct option __record_options[] = {
                     "Set affinity mask of trace reading thread to NUMA node cpu mask or cpu of processed mmap buffer",
                     record__parse_affinity),
 #ifdef HAVE_ZSTD_SUPPORT
-       OPT_CALLBACK_OPTARG('z', "compression-level", &record.opts, &comp_level_default,
-                           "n", "Compressed records using specified level (default: 1 - fastest compression, 22 - greatest compression)",
+       OPT_CALLBACK_OPTARG('z', "compression-level", &record.opts, &comp_level_default, "n",
+                           "Compress records using specified level (default: 1 - fastest compression, 22 - greatest compression)",
                            record__parse_comp_level),
 #endif
        OPT_CALLBACK(0, "max-size", &record.output_max_size,
@@ -3758,6 +3785,17 @@ int cmd_record(int argc, const char **argv)
        if (rec->opts.kcore || record__threads_enabled(rec))
                rec->data.is_dir = true;
 
+       if (record__threads_enabled(rec)) {
+               if (rec->opts.affinity != PERF_AFFINITY_SYS) {
+                       pr_err("--affinity option is mutually exclusive to parallel streaming mode.\n");
+                       goto out_opts;
+               }
+               if (record__aio_enabled(rec)) {
+                       pr_err("Asynchronous streaming mode (--aio) is mutually exclusive to parallel streaming mode.\n");
+                       goto out_opts;
+               }
+       }
+
        if (rec->opts.comp_level != 0) {
                pr_debug("Compression enabled, disabling build id collection at the end of the session.\n");
                rec->no_buildid = true;
@@ -3791,6 +3829,11 @@ int cmd_record(int argc, const char **argv)
                }
        }
 
+       if (rec->timestamp_filename && record__threads_enabled(rec)) {
+               rec->timestamp_filename = false;
+               pr_warning("WARNING: --timestamp-filename option is not available in parallel streaming mode.\n");
+       }
+
        /*
         * Allow aliases to facilitate the lookup of symbols for address
         * filters. Refer to auxtrace_parse_filters().