perf trace: Filter own pid to avoid a feedback look in 'perf trace record -a'
When doing a system wide 'perf trace record' we need, just like in 'perf trace' live mode, to filter out perf trace's own pid, so set up a tracepoint filter for the raw_syscalls tracepoints right after adding them to the argv array that is set up to then call cmd_record(). Reported-by: Andi Kleen <ak@linux.intel.com> Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: David Ahern <dsahern@gmail.com> Cc: Jiri Olsa <jolsa@kernel.org> Cc: Luis Cláudio Gonçalves <lclaudio@redhat.com> Cc: Namhyung Kim <namhyung@kernel.org> Link: https://lkml.kernel.org/n/tip-uysx5w8f2y5ndoln5cq370tv@git.kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
da949f507a
commit
7fbfe22cf4
@ -2796,21 +2796,23 @@ static int trace__record(struct trace *trace, int argc, const char **argv)
|
||||
"-m", "1024",
|
||||
"-c", "1",
|
||||
};
|
||||
|
||||
pid_t pid = getpid();
|
||||
char *filter = asprintf__tp_filter_pids(1, &pid);
|
||||
const char * const sc_args[] = { "-e", };
|
||||
unsigned int sc_args_nr = ARRAY_SIZE(sc_args);
|
||||
const char * const majpf_args[] = { "-e", "major-faults" };
|
||||
unsigned int majpf_args_nr = ARRAY_SIZE(majpf_args);
|
||||
const char * const minpf_args[] = { "-e", "minor-faults" };
|
||||
unsigned int minpf_args_nr = ARRAY_SIZE(minpf_args);
|
||||
int err = -1;
|
||||
|
||||
/* +1 is for the event string below */
|
||||
rec_argc = ARRAY_SIZE(record_args) + sc_args_nr + 1 +
|
||||
/* +3 is for the event string below and the pid filter */
|
||||
rec_argc = ARRAY_SIZE(record_args) + sc_args_nr + 3 +
|
||||
majpf_args_nr + minpf_args_nr + argc;
|
||||
rec_argv = calloc(rec_argc + 1, sizeof(char *));
|
||||
|
||||
if (rec_argv == NULL)
|
||||
return -ENOMEM;
|
||||
if (rec_argv == NULL || filter == NULL)
|
||||
goto out_free;
|
||||
|
||||
j = 0;
|
||||
for (i = 0; i < ARRAY_SIZE(record_args); i++)
|
||||
@ -2827,11 +2829,13 @@ static int trace__record(struct trace *trace, int argc, const char **argv)
|
||||
rec_argv[j++] = "syscalls:sys_enter,syscalls:sys_exit";
|
||||
else {
|
||||
pr_err("Neither raw_syscalls nor syscalls events exist.\n");
|
||||
free(rec_argv);
|
||||
return -1;
|
||||
goto out_free;
|
||||
}
|
||||
}
|
||||
|
||||
rec_argv[j++] = "--filter";
|
||||
rec_argv[j++] = filter;
|
||||
|
||||
if (trace->trace_pgfaults & TRACE_PFMAJ)
|
||||
for (i = 0; i < majpf_args_nr; i++)
|
||||
rec_argv[j++] = majpf_args[i];
|
||||
@ -2843,7 +2847,11 @@ static int trace__record(struct trace *trace, int argc, const char **argv)
|
||||
for (i = 0; i < (unsigned int)argc; i++)
|
||||
rec_argv[j++] = argv[i];
|
||||
|
||||
return cmd_record(j, rec_argv);
|
||||
err = cmd_record(j, rec_argv);
|
||||
out_free:
|
||||
free(filter);
|
||||
free(rec_argv);
|
||||
return err;
|
||||
}
|
||||
|
||||
static size_t trace__fprintf_thread_summary(struct trace *trace, FILE *fp);
|
||||
|
Loading…
Reference in New Issue
Block a user