perf record: Add dummy event during system wide synthesis
During the processing of /proc during event synthesis new processes may start. Add a dummy event if /proc is to be processed, to capture mmaps for starting processes. This reuses the existing logic for initial-delay. v3 fixes the attr test of test-record-C0 v2 fixes the dummy event configuration and a branch stack issue. Suggested-by: Stephane Eranian <eranian@google.com> Signed-off-by: Ian Rogers <irogers@google.com> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> Cc: Jiri Olsa <jolsa@redhat.com> Cc: Kan Liang <kan.liang@linux.intel.com> Cc: Mark Rutland <mark.rutland@arm.com> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Stephane Eranian <eranian@google.com> Link: http://lore.kernel.org/lkml/20200422173615.59436-1-irogers@google.com [ split from a larger patch ] Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
5885a202d0
commit
0a892c1c94
@ -825,19 +825,28 @@ static int record__open(struct record *rec)
|
||||
int rc = 0;
|
||||
|
||||
/*
|
||||
* For initial_delay we need to add a dummy event so that we can track
|
||||
* PERF_RECORD_MMAP while we wait for the initial delay to enable the
|
||||
* real events, the ones asked by the user.
|
||||
* For initial_delay or system wide, we need to add a dummy event so
|
||||
* that we can track PERF_RECORD_MMAP to cover the delay of waiting or
|
||||
* event synthesis.
|
||||
*/
|
||||
if (opts->initial_delay) {
|
||||
if (opts->initial_delay || target__has_cpu(&opts->target)) {
|
||||
if (perf_evlist__add_dummy(evlist))
|
||||
return -ENOMEM;
|
||||
|
||||
/* Disable tracking of mmaps on lead event. */
|
||||
pos = evlist__first(evlist);
|
||||
pos->tracking = 0;
|
||||
/* Set up dummy event. */
|
||||
pos = evlist__last(evlist);
|
||||
pos->tracking = 1;
|
||||
pos->core.attr.enable_on_exec = 1;
|
||||
/*
|
||||
* Enable the dummy event when the process is forked for
|
||||
* initial_delay, immediately for system wide.
|
||||
*/
|
||||
if (opts->initial_delay)
|
||||
pos->core.attr.enable_on_exec = 1;
|
||||
else
|
||||
pos->immediate = 1;
|
||||
}
|
||||
|
||||
perf_evlist__config(evlist, opts, &callchain_param);
|
||||
|
50
tools/perf/tests/attr/system-wide-dummy
Normal file
50
tools/perf/tests/attr/system-wide-dummy
Normal file
@ -0,0 +1,50 @@
|
||||
# Event added by system-wide or CPU perf-record to handle the race of
|
||||
# processes starting while /proc is processed.
|
||||
[event]
|
||||
fd=1
|
||||
group_fd=-1
|
||||
cpu=*
|
||||
pid=-1
|
||||
flags=8
|
||||
type=1
|
||||
size=120
|
||||
config=9
|
||||
sample_period=4000
|
||||
sample_type=455
|
||||
read_format=4
|
||||
# Event will be enabled right away.
|
||||
disabled=0
|
||||
inherit=1
|
||||
pinned=0
|
||||
exclusive=0
|
||||
exclude_user=0
|
||||
exclude_kernel=0
|
||||
exclude_hv=0
|
||||
exclude_idle=0
|
||||
mmap=1
|
||||
comm=1
|
||||
freq=1
|
||||
inherit_stat=0
|
||||
enable_on_exec=0
|
||||
task=1
|
||||
watermark=0
|
||||
precise_ip=0
|
||||
mmap_data=0
|
||||
sample_id_all=1
|
||||
exclude_host=0
|
||||
exclude_guest=0
|
||||
exclude_callchain_kernel=0
|
||||
exclude_callchain_user=0
|
||||
mmap2=1
|
||||
comm_exec=1
|
||||
context_switch=0
|
||||
write_backward=0
|
||||
namespaces=0
|
||||
use_clockid=0
|
||||
wakeup_events=0
|
||||
bp_type=0
|
||||
config1=0
|
||||
config2=0
|
||||
branch_sample_type=0
|
||||
sample_regs_user=0
|
||||
sample_stack_user=0
|
@ -9,6 +9,14 @@ cpu=0
|
||||
# no enable on exec for CPU attached
|
||||
enable_on_exec=0
|
||||
|
||||
# PERF_SAMPLE_IP | PERF_SAMPLE_TID PERF_SAMPLE_TIME | # PERF_SAMPLE_PERIOD
|
||||
# PERF_SAMPLE_IP | PERF_SAMPLE_TID | PERF_SAMPLE_TIME |
|
||||
# PERF_SAMPLE_ID | PERF_SAMPLE_PERIOD
|
||||
# + PERF_SAMPLE_CPU added by -C 0
|
||||
sample_type=391
|
||||
sample_type=455
|
||||
|
||||
# Dummy event handles mmaps, comm and task.
|
||||
mmap=0
|
||||
comm=0
|
||||
task=0
|
||||
|
||||
[event:system-wide-dummy]
|
||||
|
Loading…
Reference in New Issue
Block a user