perf record: Implement compatibility checks
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>
This commit is contained in:
parent
f466e5ed6c
commit
b5f2511d4b
@ -805,6 +805,12 @@ static int record__auxtrace_init(struct record *rec)
|
|||||||
{
|
{
|
||||||
int err;
|
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) {
|
if (!rec->itr) {
|
||||||
rec->itr = auxtrace_record__init(rec->evlist, &err);
|
rec->itr = auxtrace_record__init(rec->evlist, &err);
|
||||||
if (err)
|
if (err)
|
||||||
@ -2198,6 +2204,17 @@ static int __cmd_record(struct record *rec, int argc, const char **argv)
|
|||||||
return PTR_ERR(session);
|
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);
|
fd = perf_data__fd(data);
|
||||||
rec->session = session;
|
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
|
* --switch-output=signal, as we'll send a SIGUSR2 from the side band
|
||||||
* thread to its parent.
|
* 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;
|
goto do_signal;
|
||||||
|
}
|
||||||
|
|
||||||
if (!s->set)
|
if (!s->set)
|
||||||
return 0;
|
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")) {
|
if (!strcmp(s->str, "signal")) {
|
||||||
do_signal:
|
do_signal:
|
||||||
s->signal = true;
|
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",
|
"Set affinity mask of trace reading thread to NUMA node cpu mask or cpu of processed mmap buffer",
|
||||||
record__parse_affinity),
|
record__parse_affinity),
|
||||||
#ifdef HAVE_ZSTD_SUPPORT
|
#ifdef HAVE_ZSTD_SUPPORT
|
||||||
OPT_CALLBACK_OPTARG('z', "compression-level", &record.opts, &comp_level_default,
|
OPT_CALLBACK_OPTARG('z', "compression-level", &record.opts, &comp_level_default, "n",
|
||||||
"n", "Compressed records using specified level (default: 1 - fastest compression, 22 - greatest compression)",
|
"Compress records using specified level (default: 1 - fastest compression, 22 - greatest compression)",
|
||||||
record__parse_comp_level),
|
record__parse_comp_level),
|
||||||
#endif
|
#endif
|
||||||
OPT_CALLBACK(0, "max-size", &record.output_max_size,
|
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))
|
if (rec->opts.kcore || record__threads_enabled(rec))
|
||||||
rec->data.is_dir = true;
|
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) {
|
if (rec->opts.comp_level != 0) {
|
||||||
pr_debug("Compression enabled, disabling build id collection at the end of the session.\n");
|
pr_debug("Compression enabled, disabling build id collection at the end of the session.\n");
|
||||||
rec->no_buildid = true;
|
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
|
* Allow aliases to facilitate the lookup of symbols for address
|
||||||
* filters. Refer to auxtrace_parse_filters().
|
* filters. Refer to auxtrace_parse_filters().
|
||||||
|
Loading…
Reference in New Issue
Block a user