[PATCH 5/5] perf record: All config tracking are integrated into record__config_tracking_events()

From: Yang Jihong
Date: Tue Jul 04 2023 - 03:44:55 EST


The current perf-record also config tracking events in record__open(),
move it to the record__config_tracking_events().

The sys_perf_event_open invoked is as follows:

# perf --debug verbose=3 record -e cpu-clock -D 100 true
<SNIP>
Opening: cpu-clock
------------------------------------------------------------
perf_event_attr:
type 1
size 136
{ sample_period, sample_freq } 4000
sample_type IP|TID|TIME|ID|PERIOD
read_format ID|LOST
disabled 1
inherit 1
freq 1
sample_id_all 1
exclude_guest 1
------------------------------------------------------------
sys_perf_event_open: pid 3569 cpu 0 group_fd -1 flags 0x8 = 5
sys_perf_event_open: pid 3569 cpu 1 group_fd -1 flags 0x8 = 6
sys_perf_event_open: pid 3569 cpu 2 group_fd -1 flags 0x8 = 7
sys_perf_event_open: pid 3569 cpu 3 group_fd -1 flags 0x8 = 9
sys_perf_event_open: pid 3569 cpu 4 group_fd -1 flags 0x8 = 10
sys_perf_event_open: pid 3569 cpu 5 group_fd -1 flags 0x8 = 11
sys_perf_event_open: pid 3569 cpu 6 group_fd -1 flags 0x8 = 12
sys_perf_event_open: pid 3569 cpu 7 group_fd -1 flags 0x8 = 13
Opening: dummy:HG
------------------------------------------------------------
perf_event_attr:
type 1
size 136
config 0x9
{ sample_period, sample_freq } 4000
sample_type IP|TID|TIME|ID|PERIOD
read_format ID|LOST
disabled 1
inherit 1
mmap 1
comm 1
freq 1
enable_on_exec 1
task 1
sample_id_all 1
mmap2 1
comm_exec 1
ksymbol 1
bpf_event 1
------------------------------------------------------------
sys_perf_event_open: pid 3569 cpu 0 group_fd -1 flags 0x8 = 14
sys_perf_event_open: pid 3569 cpu 1 group_fd -1 flags 0x8 = 15
sys_perf_event_open: pid 3569 cpu 2 group_fd -1 flags 0x8 = 16
sys_perf_event_open: pid 3569 cpu 3 group_fd -1 flags 0x8 = 17
sys_perf_event_open: pid 3569 cpu 4 group_fd -1 flags 0x8 = 18
sys_perf_event_open: pid 3569 cpu 5 group_fd -1 flags 0x8 = 19
sys_perf_event_open: pid 3569 cpu 6 group_fd -1 flags 0x8 = 20
sys_perf_event_open: pid 3569 cpu 7 group_fd -1 flags 0x8 = 21
<SNIP>

Signed-off-by: Yang Jihong <yangjihong1@xxxxxxxxxx>
---
tools/perf/builtin-record.c | 46 ++++++++++++++++---------------------
1 file changed, 20 insertions(+), 26 deletions(-)

diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
index 69e0d8c75aab..1e21f64e4cfa 100644
--- a/tools/perf/builtin-record.c
+++ b/tools/perf/builtin-record.c
@@ -915,15 +915,31 @@ static int record__config_tracking_events(struct record *rec)
struct record_opts *opts = &rec->opts;

/*
- * User space tasks can migrate between CPUs, so when tracing
- * selected CPUs, sideband for all CPUs is still needed.
+ * For initial_delay, system wide or a hybrid system, 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->target.cpu_list) {
+ if (opts->target.initial_delay || target__has_cpu(&opts->target) ||
+ perf_pmus__num_core_pmus() > 1) {
evsel = evlist__findnew_tracking_event(evlist);
if (!evsel)
return -ENOMEM;

- if (!evsel->core.system_wide) {
+ /*
+ * Enable the dummy event when the process is forked for
+ * initial_delay, immediately for system wide.
+ */
+ if (opts->target.initial_delay && !evsel->immediate &&
+ !target__has_cpu(&opts->target))
+ evsel->core.attr.enable_on_exec = 1;
+ else
+ evsel->immediate = 1;
+
+ /*
+ * User space tasks can migrate between CPUs, so when tracing
+ * selected CPUs, sideband for all CPUs is still needed.
+ */
+ if (opts->target.cpu_list && !evsel->core.system_wide) {
evsel->core.system_wide = true;
evsel__set_sample_bit(evsel, TIME);
perf_evlist__propagate_maps(&evlist->core, &evsel->core);
@@ -1313,28 +1329,6 @@ static int record__open(struct record *rec)
struct record_opts *opts = &rec->opts;
int rc = 0;

- /*
- * For initial_delay, system wide or a hybrid system, 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->target.initial_delay || target__has_cpu(&opts->target) ||
- perf_pmus__num_core_pmus() > 1) {
- pos = evlist__findnew_tracking_event(evlist);
- if (!pos)
- return -ENOMEM;
-
- /*
- * Enable the dummy event when the process is forked for
- * initial_delay, immediately for system wide.
- */
- if (opts->target.initial_delay && !pos->immediate &&
- !target__has_cpu(&opts->target))
- pos->core.attr.enable_on_exec = 1;
- else
- pos->immediate = 1;
- }
-
evlist__config(evlist, opts, &callchain_param);

evlist__for_each_entry(evlist, pos) {
--
2.30.GIT