Commit 0a892c1c authored by Ian Rogers's avatar Ian Rogers Committed by Arnaldo Carvalho de Melo

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: default avatarStephane Eranian <eranian@google.com>
Signed-off-by: default avatarIan 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: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 5885a202
...@@ -825,19 +825,28 @@ static int record__open(struct record *rec) ...@@ -825,19 +825,28 @@ static int record__open(struct record *rec)
int rc = 0; int rc = 0;
/* /*
* For initial_delay we need to add a dummy event so that we can track * For initial_delay or system wide, we need to add a dummy event so
* PERF_RECORD_MMAP while we wait for the initial delay to enable the * that we can track PERF_RECORD_MMAP to cover the delay of waiting or
* real events, the ones asked by the user. * event synthesis.
*/ */
if (opts->initial_delay) { if (opts->initial_delay || target__has_cpu(&opts->target)) {
if (perf_evlist__add_dummy(evlist)) if (perf_evlist__add_dummy(evlist))
return -ENOMEM; return -ENOMEM;
/* Disable tracking of mmaps on lead event. */
pos = evlist__first(evlist); pos = evlist__first(evlist);
pos->tracking = 0; pos->tracking = 0;
/* Set up dummy event. */
pos = evlist__last(evlist); pos = evlist__last(evlist);
pos->tracking = 1; 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); perf_evlist__config(evlist, opts, &callchain_param);
......
# 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 ...@@ -9,6 +9,14 @@ cpu=0
# no enable on exec for CPU attached # no enable on exec for CPU attached
enable_on_exec=0 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 # + 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]
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment