perf tools: fix endless record after being terminated
Subsystems (4)
Adrian Hunter
reviewercover perf tools: fix endless record after being terminated
Hi
Wei Li sent some fixes. I have tweaked them a bit, and added a tidy-up patch.
Adrian Hunter (2):
perf tools: arm-spe: fix endless record after being terminated perf auxtrace: Add auxtrace_record__read_finish()
Wei Li (3):
perf tools: intel-pt: fix endless record after being terminated perf tools: intel-bts: fix endless record after being terminated perf tools: cs-etm: fix endless record after being terminated
tools/perf/arch/arm/util/cs-etm.c | 18 ++---------------- tools/perf/arch/arm64/util/arm-spe.c | 17 ++--------------- tools/perf/arch/x86/util/intel-bts.c | 17 ++--------------- tools/perf/arch/x86/util/intel-pt.c | 17 ++--------------- tools/perf/util/auxtrace.c | 22 +++++++++++++++++++++- tools/perf/util/auxtrace.h | 6 ++++++ 6 files changed, 35 insertions(+), 62 deletions(-)
Regards
Adrian
Adrian Hunter
reviewerPATCH v2 1/5 perf tools: intel-pt: fix endless record after being terminated
From: Wei Li <[email protected]>
In __cmd_record(), when receiving SIGINT(ctrl + c), a done flag will be set and the event list will be disabled by evlist__disable() once.
While in auxtrace_record.read_finish(), the related events will be enabled again, if they are continuous, the recording seems to be endless.
If the intel_pt event is disabled, we don't enable it again here.
Before the patch:
huawei@huawei-2288H-V5:~/linux-5.5-rc4/tools/perf$ ./perf record -e \ intel_pt//u -p 46803 ^C^C^C^C^C^C
After the patch:
huawei@huawei-2288H-V5:~/linux-5.5-rc4/tools/perf$ ./perf record -e \ intel_pt//u -p 48591 ^C[ perf record: Woken up 0 times to write data ] Warning: AUX data lost 504 times out of 4816!
[ perf record: Captured and wrote 2024.405 MB perf.data ]
--- tools/perf/arch/x86/util/intel-pt.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
tools/perf/arch/x86/util/intel-pt.c +4 -1
@@ -1177,9 +1177,12 @@ static int intel_pt_read_finish(struct auxtrace_record *itr, int idx)struct evsel *evsel;evlist__for_each_entry (ptr->evlist, evsel) { -if (evsel->core.attr.type == ptr->intel_pt_pmu->type) +if (evsel->core.attr.type == ptr->intel_pt_pmu->type) { +if (evsel->disabled) +return 0 ;return perf_evlist__enable_event_idx (ptr->evlist, evsel, idx); + } }return -EINVAL ; }
Signature · 1 line
2.17.1
[tip: perf/urgent] perf intel-pt: Fix endless record after being terminated
The following commit has been merged into the perf/urgent branch of tip:
The following commit has been merged into the perf/urgent branch of tip:
Commit-ID: 2da4dd3d6973ffdfba4fa07f53240fda7ab22929 Gitweb: https://git.kernel.org/tip/2da4dd3d6973ffdfba4fa07f53240fda7ab22929 Author: Wei Li <[email protected]> AuthorDate: Fri, 14 Feb 2020 15:26:50 +02:00 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitterDate: Tue, 18 Feb 2020 10:13:29 -03:00
perf intel-pt: Fix endless record after being terminated
In __cmd_record(), when receiving SIGINT(ctrl + c), a 'done' flag will be set and the event list will be disabled by evlist__disable() once.
While in auxtrace_record.read_finish(), the related events will be enabled again, if they are continuous, the recording seems to be endless.
If the intel_pt event is disabled, we don't enable it again here.
Before the patch:
huawei@huawei-2288H-V5:~/linux-5.5-rc4/tools/perf$ ./perf record -e \ intel_pt//u -p 46803 ^C^C^C^C^C^C
After the patch:
huawei@huawei-2288H-V5:~/linux-5.5-rc4/tools/perf$ ./perf record -e \ intel_pt//u -p 48591 ^C[ perf record: Woken up 0 times to write data ] Warning: AUX data lost 504 times out of 4816!
[ perf record: Captured and wrote 2024.405 MB perf.data ]
--- tools/perf/arch/x86/util/intel-pt.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
tools/perf/arch/x86/util/intel-pt.c +4 -1
@@ -1173,9 +1173,12 @@ static int intel_pt_read_finish(struct auxtrace_record *itr, int idx)struct evsel *evsel;evlist__for_each_entry (ptr->evlist, evsel) { -if (evsel->core.attr.type == ptr->intel_pt_pmu->type) +if (evsel->core.attr.type == ptr->intel_pt_pmu->type) { +if (evsel->disabled) +return 0 ;return perf_evlist__enable_event_idx (ptr->evlist, evsel, idx); + } }return -EINVAL ; }
Adrian Hunter
reviewerPATCH 4/5 perf tools: arm-spe: fix endless record after being terminated
In reply to Adrian HunterIn __cmd_record(), when receiving SIGINT(ctrl + c), a done flag will be set and the event list will be disabled by evlist__disable() once.
While in auxtrace_record.read_finish(), the related events will be enabled again, if they are continuous, the recording seems to be endless.
If the event is disabled, don't enable it again here.
--- tools/perf/arch/arm64/util/arm-spe.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
tools/perf/arch/arm64/util/arm-spe.c +4 -1
@@ -165,9 +165,12 @@ static int arm_spe_read_finish(struct auxtrace_record *itr, int idx)struct evsel *evsel;evlist__for_each_entry (sper->evlist, evsel) { -if (evsel->core.attr.type == sper->arm_spe_pmu->type) +if (evsel->core.attr.type == sper->arm_spe_pmu->type) { +if (evsel->disabled) +return 0 ;return perf_evlist__enable_event_idx (sper->evlist, evsel, idx); + } }return -EINVAL ; }
Signature · 1 line
2.17.1
[tip: perf/urgent] perf arm-spe: Fix endless record after being terminated
The following commit has been merged into the perf/urgent branch of tip:
The following commit has been merged into the perf/urgent branch of tip:
Commit-ID: d6bc34c5ec18c3544c4b0d85963768dfbcd24184 Gitweb: https://git.kernel.org/tip/d6bc34c5ec18c3544c4b0d85963768dfbcd24184 Author: Adrian Hunter <[email protected]> AuthorDate: Fri, 14 Feb 2020 15:26:53 +02:00 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitterDate: Tue, 18 Feb 2020 10:13:29 -03:00
perf arm-spe: Fix endless record after being terminated
In __cmd_record(), when receiving SIGINT(ctrl + c), a 'done' flag will be set and the event list will be disabled by evlist__disable() once.
While in auxtrace_record.read_finish(), the related events will be enabled again, if they are continuous, the recording seems to be endless.
If the event is disabled, don't enable it again here.
--- tools/perf/arch/arm64/util/arm-spe.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
tools/perf/arch/arm64/util/arm-spe.c +4 -1
@@ -165,9 +165,12 @@ static int arm_spe_read_finish(struct auxtrace_record *itr, int idx)struct evsel *evsel;evlist__for_each_entry (sper->evlist, evsel) { -if (evsel->core.attr.type == sper->arm_spe_pmu->type) +if (evsel->core.attr.type == sper->arm_spe_pmu->type) { +if (evsel->disabled) +return 0 ;return perf_evlist__enable_event_idx (sper->evlist, evsel, idx); + } }return -EINVAL ; }
Adrian Hunter
reviewerPATCH 5/5 perf auxtrace: Add auxtrace_record__read_finish()
In reply to Adrian HunterAll ->read_finish() implementations are doing the same thing. Add a helper function so that they can share the same implementation.
--- tools/perf/arch/arm/util/cs-etm.c | 21 ++------------------- tools/perf/arch/arm64/util/arm-spe.c | 20 ++------------------ tools/perf/arch/x86/util/intel-bts.c | 20 ++------------------ tools/perf/arch/x86/util/intel-pt.c | 20 ++------------------ tools/perf/util/auxtrace.c | 22 +++++++++++++++++++++- tools/perf/util/auxtrace.h | 6 ++++++ 6 files changed, 35 insertions(+), 74 deletions(-)
tools/perf/arch/arm/util/cs-etm.c +2 -19
@@ -858,24 +858,6 @@ static void cs_etm_recording_free(struct auxtrace_record *itr)free (ptr); } -static int cs_etm_read_finish (struct auxtrace_record *itr,int idx) -{ -struct cs_etm_recording *ptr = - container_of(itr, struct cs_etm_recording, itr); -struct evsel *evsel; - -evlist__for_each_entry (ptr->evlist, evsel) { -if (evsel->core.attr.type == ptr->cs_etm_pmu->type) { -if (evsel->disabled) -return 0 ; -return perf_evlist__enable_event_idx (ptr->evlist, - evsel, idx); - } - } - -return -EINVAL ; -} -struct auxtrace_record *cs_etm_record_init (int *err) {struct perf_pmu *cs_etm_pmu;
@@ -895,6 +877,7 @@ struct auxtrace_record *cs_etm_record_init(int *err) } ptr->cs_etm_pmu = cs_etm_pmu; + ptr->itr.cs_etm_pmu = cs_etm_pmu; ptr->itr.parse_snapshot_options = cs_etm_parse_snapshot_options; ptr->itr.recording_options = cs_etm_recording_options; ptr->itr.info_priv_size = cs_etm_info_priv_size;
@@ -904,7 +887,7 @@ struct auxtrace_record *cs_etm_record_init(int *err) ptr->itr.snapshot_finish = cs_etm_snapshot_finish; ptr->itr.reference = cs_etm_reference; ptr->itr.free = cs_etm_recording_free; - ptr->itr.read_finish = cs_etm_read_finish; + ptr->itr.read_finish = auxtrace_record__read_finish; *err =0 ;return &ptr->itr;
tools/perf/arch/arm64/util/arm-spe.c +2 -18
@@ -158,23 +158,6 @@ static void arm_spe_recording_free(struct auxtrace_record *itr)free (sper); } -static int arm_spe_read_finish (struct auxtrace_record *itr,int idx) -{ -struct arm_spe_recording *sper = - container_of(itr, struct arm_spe_recording, itr); -struct evsel *evsel; - -evlist__for_each_entry (sper->evlist, evsel) { -if (evsel->core.attr.type == sper->arm_spe_pmu->type) { -if (evsel->disabled) -return 0 ; -return perf_evlist__enable_event_idx (sper->evlist, - evsel, idx); - } - } -return -EINVAL ; -} -struct auxtrace_record *arm_spe_recording_init (int *err,struct perf_pmu *arm_spe_pmu) {
@@ -192,12 +175,13 @@ struct auxtrace_record *arm_spe_recording_init(int *err, } sper->arm_spe_pmu = arm_spe_pmu; + sper->itr.pmu = arm_spe_pmu; sper->itr.recording_options = arm_spe_recording_options; sper->itr.info_priv_size = arm_spe_info_priv_size; sper->itr.info_fill = arm_spe_info_fill; sper->itr.free = arm_spe_recording_free; sper->itr.reference = arm_spe_reference; - sper->itr.read_finish = arm_spe_read_finish; + sper->itr.read_finish = auxtrace_record__read_finish; sper->itr.alignment =0 ; *err =0 ;
tools/perf/arch/x86/util/intel-bts.c +2 -18
@@ -413,23 +413,6 @@ static int intel_bts_find_snapshot(struct auxtrace_record *itr, int idx,return err; } -static int intel_bts_read_finish (struct auxtrace_record *itr,int idx) -{ -struct intel_bts_recording *btsr = - container_of(itr, struct intel_bts_recording, itr); -struct evsel *evsel; - -evlist__for_each_entry (btsr->evlist, evsel) { -if (evsel->core.attr.type == btsr->intel_bts_pmu->type) { -if (evsel->disabled) -return 0 ; -return perf_evlist__enable_event_idx (btsr->evlist, - evsel, idx); - } - } -return -EINVAL ; -} -struct auxtrace_record *intel_bts_recording_init (int *err) {struct perf_pmu *intel_bts_pmu =perf_pmu__find (INTEL_BTS_PMU_NAME );
@@ -450,6 +433,7 @@ struct auxtrace_record *intel_bts_recording_init(int *err) } btsr->intel_bts_pmu = intel_bts_pmu; + btsr->itr.pmu = intel_bts_pmu; btsr->itr.recording_options = intel_bts_recording_options; btsr->itr.info_priv_size = intel_bts_info_priv_size; btsr->itr.info_fill = intel_bts_info_fill;
@@ -459,7 +443,7 @@ struct auxtrace_record *intel_bts_recording_init(int *err) btsr->itr.find_snapshot = intel_bts_find_snapshot; btsr->itr.parse_snapshot_options = intel_bts_parse_snapshot_options; btsr->itr.reference = intel_bts_reference; - btsr->itr.read_finish = intel_bts_read_finish; + btsr->itr.read_finish = auxtrace_record__read_finish; btsr->itr.alignment =sizeof (struct branch );return &btsr->itr; }
tools/perf/arch/x86/util/intel-pt.c +2 -18
@@ -1170,23 +1170,6 @@ static u64 intel_pt_reference(struct auxtrace_record *itr __maybe_unused)return rdtsc (); } -static int intel_pt_read_finish (struct auxtrace_record *itr,int idx) -{ -struct intel_pt_recording *ptr = - container_of(itr, struct intel_pt_recording, itr); -struct evsel *evsel; - -evlist__for_each_entry (ptr->evlist, evsel) { -if (evsel->core.attr.type == ptr->intel_pt_pmu->type) { -if (evsel->disabled) -return 0 ; -return perf_evlist__enable_event_idx (ptr->evlist, evsel, - idx); - } - } -return -EINVAL ; -} -struct auxtrace_record *intel_pt_recording_init (int *err) {struct perf_pmu *intel_pt_pmu =perf_pmu__find (INTEL_PT_PMU_NAME );
@@ -1207,6 +1190,7 @@ struct auxtrace_record *intel_pt_recording_init(int *err) } ptr->intel_pt_pmu = intel_pt_pmu; + ptr->itr.pmu = intel_pt_pmu; ptr->itr.recording_options = intel_pt_recording_options; ptr->itr.info_priv_size = intel_pt_info_priv_size; ptr->itr.info_fill = intel_pt_info_fill;
@@ -1216,7 +1200,7 @@ struct auxtrace_record *intel_pt_recording_init(int *err) ptr->itr.find_snapshot = intel_pt_find_snapshot; ptr->itr.parse_snapshot_options = intel_pt_parse_snapshot_options; ptr->itr.reference = intel_pt_reference; - ptr->itr.read_finish = intel_pt_read_finish; + ptr->itr.read_finish = auxtrace_record__read_finish;/* * Decoding starts at a PSB packet. Minimum PSB period is 2K so 4K * should give at least 1 PSB per sample.
tools/perf/util/auxtrace.c +21 -1
@@ -629,8 +629,10 @@ int auxtrace_record__options(struct auxtrace_record *itr,struct evlist *evlist, struct record_opts *opts) { - if (itr) + if (itr) { + itr->evlist = evlist;return itr->recording_options (itr, evlist, opts); + }return 0 ; }
@@ -664,6 +666,24 @@ int auxtrace_parse_snapshot_options(struct auxtrace_record *itr,return -EINVAL ; } +int auxtrace_record__read_finish (struct auxtrace_record *itr,int idx) +{ +struct evsel *evsel; + +if (!itr->evlist || !itr->pmu) +return -EINVAL ; + +evlist__for_each_entry (itr->evlist, evsel) { +if (evsel->core.attr.type == itr->pmu->type) { +if (evsel->disabled) +return 0 ; +return perf_evlist__enable_event_idx (itr->evlist, evsel, + idx); + } + } +return -EINVAL ; +} +/* * Event record size is 16-bit which results in a maximum size of about 64KiB. * Allow about 4KiB for the rest of the sample record, to give a maximum
tools/perf/util/auxtrace.h +6 -0
@@ -29,6 +29,7 @@ struct record_opts;struct perf_record_auxtrace_error ;struct perf_record_auxtrace_info ;struct events_stats ; +struct perf_pmu ;enum auxtrace_error_type {PERF_AUXTRACE_ERROR_ITRACE =1 ,
@@ -322,6 +323,8 @@ struct auxtrace_mmap_params {* @read_finish: called after reading from an auxtrace mmap * @alignment: alignment (if any) for AUX area data * @default_aux_sample_size: default sample size for --aux sample option +* @pmu: associated pmu +* @evlist: selected events list */ struct auxtrace_record { int (*recording_options)(struct auxtrace_record *itr,
@@ -346,6 +349,8 @@ struct auxtrace_record {int (*read_finish)(struct auxtrace_record *itr,int idx);unsigned int alignment;unsigned int default_aux_sample_size; +struct perf_pmu *pmu; +struct evlist *evlist; };/**
@@ -537,6 +542,7 @@ int auxtrace_record__find_snapshot(struct auxtrace_record *itr, int idx,struct auxtrace_mmap *mm, unsigned char *data, u64 *head, u64 *old);u64 auxtrace_record__reference (struct auxtrace_record *itr); +int auxtrace_record__read_finish (struct auxtrace_record *itr,int idx);int auxtrace_index__auxtrace_event (struct list_head *head,union perf_event *event,off_t file_offset);
Signature · 1 line
2.17.1
Adrian Hunter
reviewerRe: [PATCH 5/5] perf auxtrace: Add auxtrace_record__read_finish()
+ Leo Yan <[email protected]>
Quoted 272 lines · Adrian Hunter
All ->read_finish() implementations are doing the same thing. Add a helper function so that they can share the same implementation.
Signed-off-by Adrian Hunter <[email protected]>--- tools/perf/arch/arm/util/cs-etm.c | 21 ++------------------- tools/perf/arch/arm64/util/arm-spe.c | 20 ++------------------ tools/perf/arch/x86/util/intel-bts.c | 20 ++------------------ tools/perf/arch/x86/util/intel-pt.c | 20 ++------------------ tools/perf/util/auxtrace.c | 22 +++++++++++++++++++++- tools/perf/util/auxtrace.h | 6 ++++++ 6 files changed, 35 insertions(+), 74 deletions(-)tools/perf/arch/arm/util/cs-etm.c +2
-19@@ -858,24 +858,6 @@ static void cs_etm_recording_free(struct auxtrace_record *itr)free (ptr); } -static int cs_etm_read_finish (struct auxtrace_record *itr,int idx) -{ -struct cs_etm_recording *ptr = - container_of(itr, struct cs_etm_recording, itr); -struct evsel *evsel; - -evlist__for_each_entry (ptr->evlist, evsel) { -if (evsel->core.attr.type == ptr->cs_etm_pmu->type) { -if (evsel->disabled) -return 0 ; -return perf_evlist__enable_event_idx (ptr->evlist, - evsel, idx); - } - } - -return -EINVAL ; -} -struct auxtrace_record *cs_etm_record_init (int *err) {struct perf_pmu *cs_etm_pmu;@@ -895,6 +877,7 @@ struct auxtrace_record *cs_etm_record_init(int *err) } ptr->cs_etm_pmu = cs_etm_pmu; + ptr->itr.cs_etm_pmu = cs_etm_pmu; ptr->itr.parse_snapshot_options = cs_etm_parse_snapshot_options; ptr->itr.recording_options = cs_etm_recording_options; ptr->itr.info_priv_size = cs_etm_info_priv_size;@@ -904,7 +887,7 @@ struct auxtrace_record *cs_etm_record_init(int *err) ptr->itr.snapshot_finish = cs_etm_snapshot_finish; ptr->itr.reference = cs_etm_reference; ptr->itr.free = cs_etm_recording_free; - ptr->itr.read_finish = cs_etm_read_finish; + ptr->itr.read_finish = auxtrace_record__read_finish; *err =0 ;return &ptr->itr;tools/perf/arch/arm64/util/arm-spe.c +2
-18@@ -158,23 +158,6 @@ static void arm_spe_recording_free(struct auxtrace_record *itr)free (sper); } -static int arm_spe_read_finish (struct auxtrace_record *itr,int idx) -{ -struct arm_spe_recording *sper = - container_of(itr, struct arm_spe_recording, itr); -struct evsel *evsel; - -evlist__for_each_entry (sper->evlist, evsel) { -if (evsel->core.attr.type == sper->arm_spe_pmu->type) { -if (evsel->disabled) -return 0 ; -return perf_evlist__enable_event_idx (sper->evlist, - evsel, idx); - } - } -return -EINVAL ; -} -struct auxtrace_record *arm_spe_recording_init (int *err,struct perf_pmu *arm_spe_pmu) {@@ -192,12 +175,13 @@ struct auxtrace_record *arm_spe_recording_init(int *err, } sper->arm_spe_pmu = arm_spe_pmu; + sper->itr.pmu = arm_spe_pmu; sper->itr.recording_options = arm_spe_recording_options; sper->itr.info_priv_size = arm_spe_info_priv_size; sper->itr.info_fill = arm_spe_info_fill; sper->itr.free = arm_spe_recording_free; sper->itr.reference = arm_spe_reference; - sper->itr.read_finish = arm_spe_read_finish; + sper->itr.read_finish = auxtrace_record__read_finish; sper->itr.alignment =0 ; *err =0 ;tools/perf/arch/x86/util/intel-bts.c +2
-18@@ -413,23 +413,6 @@ static int intel_bts_find_snapshot(struct auxtrace_record *itr, int idx,return err; } -static int intel_bts_read_finish (struct auxtrace_record *itr,int idx) -{ -struct intel_bts_recording *btsr = - container_of(itr, struct intel_bts_recording, itr); -struct evsel *evsel; - -evlist__for_each_entry (btsr->evlist, evsel) { -if (evsel->core.attr.type == btsr->intel_bts_pmu->type) { -if (evsel->disabled) -return 0 ; -return perf_evlist__enable_event_idx (btsr->evlist, - evsel, idx); - } - } -return -EINVAL ; -} -struct auxtrace_record *intel_bts_recording_init (int *err) {struct perf_pmu *intel_bts_pmu =perf_pmu__find (INTEL_BTS_PMU_NAME );@@ -450,6 +433,7 @@ struct auxtrace_record *intel_bts_recording_init(int *err) } btsr->intel_bts_pmu = intel_bts_pmu; + btsr->itr.pmu = intel_bts_pmu; btsr->itr.recording_options = intel_bts_recording_options; btsr->itr.info_priv_size = intel_bts_info_priv_size; btsr->itr.info_fill = intel_bts_info_fill;@@ -459,7 +443,7 @@ struct auxtrace_record *intel_bts_recording_init(int *err) btsr->itr.find_snapshot = intel_bts_find_snapshot; btsr->itr.parse_snapshot_options = intel_bts_parse_snapshot_options; btsr->itr.reference = intel_bts_reference; - btsr->itr.read_finish = intel_bts_read_finish; + btsr->itr.read_finish = auxtrace_record__read_finish; btsr->itr.alignment =sizeof (struct branch );return &btsr->itr; }tools/perf/arch/x86/util/intel-pt.c +2
-18@@ -1170,23 +1170,6 @@ static u64 intel_pt_reference(struct auxtrace_record *itr __maybe_unused)return rdtsc (); } -static int intel_pt_read_finish (struct auxtrace_record *itr,int idx) -{ -struct intel_pt_recording *ptr = - container_of(itr, struct intel_pt_recording, itr); -struct evsel *evsel; - -evlist__for_each_entry (ptr->evlist, evsel) { -if (evsel->core.attr.type == ptr->intel_pt_pmu->type) { -if (evsel->disabled) -return 0 ; -return perf_evlist__enable_event_idx (ptr->evlist, evsel, - idx); - } - } -return -EINVAL ; -} -struct auxtrace_record *intel_pt_recording_init (int *err) {struct perf_pmu *intel_pt_pmu =perf_pmu__find (INTEL_PT_PMU_NAME );@@ -1207,6 +1190,7 @@ struct auxtrace_record *intel_pt_recording_init(int *err) } ptr->intel_pt_pmu = intel_pt_pmu; + ptr->itr.pmu = intel_pt_pmu; ptr->itr.recording_options = intel_pt_recording_options; ptr->itr.info_priv_size = intel_pt_info_priv_size; ptr->itr.info_fill = intel_pt_info_fill;@@ -1216,7 +1200,7 @@ struct auxtrace_record *intel_pt_recording_init(int *err) ptr->itr.find_snapshot = intel_pt_find_snapshot; ptr->itr.parse_snapshot_options = intel_pt_parse_snapshot_options; ptr->itr.reference = intel_pt_reference; - ptr->itr.read_finish = intel_pt_read_finish; + ptr->itr.read_finish = auxtrace_record__read_finish;/* * Decoding starts at a PSB packet. Minimum PSB period is 2K so 4K * should give at least 1 PSB per sample. tools/perf/util/auxtrace.c +21
-1@@ -629,8 +629,10 @@ int auxtrace_record__options(struct auxtrace_record *itr,struct evlist *evlist, struct record_opts *opts) { - if (itr) + if (itr) { + itr->evlist = evlist;return itr->recording_options (itr, evlist, opts); + }return 0 ; }@@ -664,6 +666,24 @@ int auxtrace_parse_snapshot_options(struct auxtrace_record *itr,return -EINVAL ; } +int auxtrace_record__read_finish (struct auxtrace_record *itr,int idx) +{ +struct evsel *evsel; + +if (!itr->evlist || !itr->pmu) +return -EINVAL ; + +evlist__for_each_entry (itr->evlist, evsel) { +if (evsel->core.attr.type == itr->pmu->type) { +if (evsel->disabled) +return 0 ; +return perf_evlist__enable_event_idx (itr->evlist, evsel, + idx); + } + } +return -EINVAL ; +} +/* * Event record size is 16-bit which results in a maximum size of about 64KiB. * Allow about 4KiB for the rest of the sample record, to give a maximum tools/perf/util/auxtrace.h +6
-0@@ -29,6 +29,7 @@ struct record_opts;struct perf_record_auxtrace_error ;struct perf_record_auxtrace_info ;struct events_stats ; +struct perf_pmu ;enum auxtrace_error_type {PERF_AUXTRACE_ERROR_ITRACE =1 ,@@ -322,6 +323,8 @@ struct auxtrace_mmap_params {* @read_finish: called after reading from an auxtrace mmap * @alignment: alignment (if any) for AUX area data * @default_aux_sample_size: default sample size for --aux sample option +* @pmu: associated pmu +* @evlist: selected events list */ struct auxtrace_record { int (*recording_options)(struct auxtrace_record *itr,@@ -346,6 +349,8 @@ struct auxtrace_record {int (*read_finish)(struct auxtrace_record *itr,int idx);unsigned int alignment;unsigned int default_aux_sample_size; +struct perf_pmu *pmu; +struct evlist *evlist; };/** @@ -537,6 +542,7 @@ int auxtrace_record__find_snapshot(struct auxtrace_record *itr, int idx,struct auxtrace_mmap *mm, unsigned char *data, u64 *head, u64 *old);u64 auxtrace_record__reference (struct auxtrace_record *itr); +int auxtrace_record__read_finish (struct auxtrace_record *itr,int idx);int auxtrace_index__auxtrace_event (struct list_head *head,union perf_event *event,off_t file_offset);
Re: [PATCH 5/5] perf auxtrace: Add auxtrace_record__read_finish()
In reply to Adrian HunterQuoted 43 lines · Adrian Hunter
All ->read_finish() implementations are doing the same thing. Add a helper function so that they can share the same implementation.
Signed-off-by Adrian Hunter <[email protected]>--- tools/perf/arch/arm/util/cs-etm.c | 21 ++------------------- tools/perf/arch/arm64/util/arm-spe.c | 20 ++------------------ tools/perf/arch/x86/util/intel-bts.c | 20 ++------------------ tools/perf/arch/x86/util/intel-pt.c | 20 ++------------------ tools/perf/util/auxtrace.c | 22 +++++++++++++++++++++- tools/perf/util/auxtrace.h | 6 ++++++ 6 files changed, 35 insertions(+), 74 deletions(-)tools/perf/arch/arm/util/cs-etm.c +0
-18@@ -858,24 +858,6 @@ static void cs_etm_recording_free(struct auxtrace_record *itr)free (ptr); } -static int cs_etm_read_finish (struct auxtrace_record *itr,int idx) -{ -struct cs_etm_recording *ptr = - container_of(itr, struct cs_etm_recording, itr); -struct evsel *evsel; - -evlist__for_each_entry (ptr->evlist, evsel) { -if (evsel->core.attr.type == ptr->cs_etm_pmu->type) { -if (evsel->disabled) -return 0 ; -return perf_evlist__enable_event_idx (ptr->evlist, - evsel, idx); - } - } - -return -EINVAL ; -} -struct auxtrace_record *cs_etm_record_init (int *err) {struct perf_pmu *cs_etm_pmu;
tools/perf/arch/arm/util/cs-etm.c struct auxtrace_record *cs_etm_record_init(int *err) · line 880
Quoted 4 lines
tools/perf/arch/arm/util/cs-etm.c +1
-0@@ -895,6 +877,7 @@ struct auxtrace_record *cs_etm_record_init(int *err) } ptr->cs_etm_pmu = cs_etm_pmu; + ptr->itr.cs_etm_pmu = cs_etm_pmu;
Should change to:
ptr->itr.pmu = cs_etm_pmu;
With this change:
Quoted 227 lines
tools/perf/arch/arm/util/cs-etm.c +1
-1ptr->itr.parse_snapshot_options = cs_etm_parse_snapshot_options; ptr->itr.recording_options = cs_etm_recording_options; ptr->itr.info_priv_size = cs_etm_info_priv_size;@@ -904,7 +887,7 @@ struct auxtrace_record *cs_etm_record_init(int *err) ptr->itr.snapshot_finish = cs_etm_snapshot_finish; ptr->itr.reference = cs_etm_reference; ptr->itr.free = cs_etm_recording_free; - ptr->itr.read_finish = cs_etm_read_finish; + ptr->itr.read_finish = auxtrace_record__read_finish; *err =0 ;return &ptr->itr;tools/perf/arch/arm64/util/arm-spe.c +2
-18@@ -158,23 +158,6 @@ static void arm_spe_recording_free(struct auxtrace_record *itr)free (sper); } -static int arm_spe_read_finish (struct auxtrace_record *itr,int idx) -{ -struct arm_spe_recording *sper = - container_of(itr, struct arm_spe_recording, itr); -struct evsel *evsel; - -evlist__for_each_entry (sper->evlist, evsel) { -if (evsel->core.attr.type == sper->arm_spe_pmu->type) { -if (evsel->disabled) -return 0 ; -return perf_evlist__enable_event_idx (sper->evlist, - evsel, idx); - } - } -return -EINVAL ; -} -struct auxtrace_record *arm_spe_recording_init (int *err,struct perf_pmu *arm_spe_pmu) {@@ -192,12 +175,13 @@ struct auxtrace_record *arm_spe_recording_init(int *err, } sper->arm_spe_pmu = arm_spe_pmu; + sper->itr.pmu = arm_spe_pmu; sper->itr.recording_options = arm_spe_recording_options; sper->itr.info_priv_size = arm_spe_info_priv_size; sper->itr.info_fill = arm_spe_info_fill; sper->itr.free = arm_spe_recording_free; sper->itr.reference = arm_spe_reference; - sper->itr.read_finish = arm_spe_read_finish; + sper->itr.read_finish = auxtrace_record__read_finish; sper->itr.alignment =0 ; *err =0 ;tools/perf/arch/x86/util/intel-bts.c +2
-18@@ -413,23 +413,6 @@ static int intel_bts_find_snapshot(struct auxtrace_record *itr, int idx,return err; } -static int intel_bts_read_finish (struct auxtrace_record *itr,int idx) -{ -struct intel_bts_recording *btsr = - container_of(itr, struct intel_bts_recording, itr); -struct evsel *evsel; - -evlist__for_each_entry (btsr->evlist, evsel) { -if (evsel->core.attr.type == btsr->intel_bts_pmu->type) { -if (evsel->disabled) -return 0 ; -return perf_evlist__enable_event_idx (btsr->evlist, - evsel, idx); - } - } -return -EINVAL ; -} -struct auxtrace_record *intel_bts_recording_init (int *err) {struct perf_pmu *intel_bts_pmu =perf_pmu__find (INTEL_BTS_PMU_NAME );@@ -450,6 +433,7 @@ struct auxtrace_record *intel_bts_recording_init(int *err) } btsr->intel_bts_pmu = intel_bts_pmu; + btsr->itr.pmu = intel_bts_pmu; btsr->itr.recording_options = intel_bts_recording_options; btsr->itr.info_priv_size = intel_bts_info_priv_size; btsr->itr.info_fill = intel_bts_info_fill;@@ -459,7 +443,7 @@ struct auxtrace_record *intel_bts_recording_init(int *err) btsr->itr.find_snapshot = intel_bts_find_snapshot; btsr->itr.parse_snapshot_options = intel_bts_parse_snapshot_options; btsr->itr.reference = intel_bts_reference; - btsr->itr.read_finish = intel_bts_read_finish; + btsr->itr.read_finish = auxtrace_record__read_finish; btsr->itr.alignment =sizeof (struct branch );return &btsr->itr; }tools/perf/arch/x86/util/intel-pt.c +2
-18@@ -1170,23 +1170,6 @@ static u64 intel_pt_reference(struct auxtrace_record *itr __maybe_unused)return rdtsc (); } -static int intel_pt_read_finish (struct auxtrace_record *itr,int idx) -{ -struct intel_pt_recording *ptr = - container_of(itr, struct intel_pt_recording, itr); -struct evsel *evsel; - -evlist__for_each_entry (ptr->evlist, evsel) { -if (evsel->core.attr.type == ptr->intel_pt_pmu->type) { -if (evsel->disabled) -return 0 ; -return perf_evlist__enable_event_idx (ptr->evlist, evsel, - idx); - } - } -return -EINVAL ; -} -struct auxtrace_record *intel_pt_recording_init (int *err) {struct perf_pmu *intel_pt_pmu =perf_pmu__find (INTEL_PT_PMU_NAME );@@ -1207,6 +1190,7 @@ struct auxtrace_record *intel_pt_recording_init(int *err) } ptr->intel_pt_pmu = intel_pt_pmu; + ptr->itr.pmu = intel_pt_pmu; ptr->itr.recording_options = intel_pt_recording_options; ptr->itr.info_priv_size = intel_pt_info_priv_size; ptr->itr.info_fill = intel_pt_info_fill;@@ -1216,7 +1200,7 @@ struct auxtrace_record *intel_pt_recording_init(int *err) ptr->itr.find_snapshot = intel_pt_find_snapshot; ptr->itr.parse_snapshot_options = intel_pt_parse_snapshot_options; ptr->itr.reference = intel_pt_reference; - ptr->itr.read_finish = intel_pt_read_finish; + ptr->itr.read_finish = auxtrace_record__read_finish;/* * Decoding starts at a PSB packet. Minimum PSB period is 2K so 4K * should give at least 1 PSB per sample. tools/perf/util/auxtrace.c +21
-1@@ -629,8 +629,10 @@ int auxtrace_record__options(struct auxtrace_record *itr,struct evlist *evlist, struct record_opts *opts) { - if (itr) + if (itr) { + itr->evlist = evlist;return itr->recording_options (itr, evlist, opts); + }return 0 ; }@@ -664,6 +666,24 @@ int auxtrace_parse_snapshot_options(struct auxtrace_record *itr,return -EINVAL ; } +int auxtrace_record__read_finish (struct auxtrace_record *itr,int idx) +{ +struct evsel *evsel; + +if (!itr->evlist || !itr->pmu) +return -EINVAL ; + +evlist__for_each_entry (itr->evlist, evsel) { +if (evsel->core.attr.type == itr->pmu->type) { +if (evsel->disabled) +return 0 ; +return perf_evlist__enable_event_idx (itr->evlist, evsel, + idx); + } + } +return -EINVAL ; +} +/* * Event record size is 16-bit which results in a maximum size of about 64KiB. * Allow about 4KiB for the rest of the sample record, to give a maximum tools/perf/util/auxtrace.h +6
-0@@ -29,6 +29,7 @@ struct record_opts;struct perf_record_auxtrace_error ;struct perf_record_auxtrace_info ;struct events_stats ; +struct perf_pmu ;enum auxtrace_error_type {PERF_AUXTRACE_ERROR_ITRACE =1 ,@@ -322,6 +323,8 @@ struct auxtrace_mmap_params {* @read_finish: called after reading from an auxtrace mmap * @alignment: alignment (if any) for AUX area data * @default_aux_sample_size: default sample size for --aux sample option +* @pmu: associated pmu +* @evlist: selected events list */ struct auxtrace_record { int (*recording_options)(struct auxtrace_record *itr,@@ -346,6 +349,8 @@ struct auxtrace_record {int (*read_finish)(struct auxtrace_record *itr,int idx);unsigned int alignment;unsigned int default_aux_sample_size; +struct perf_pmu *pmu; +struct evlist *evlist; };/** @@ -537,6 +542,7 @@ int auxtrace_record__find_snapshot(struct auxtrace_record *itr, int idx,struct auxtrace_mmap *mm, unsigned char *data, u64 *head, u64 *old);u64 auxtrace_record__reference (struct auxtrace_record *itr); +int auxtrace_record__read_finish (struct auxtrace_record *itr,int idx);int auxtrace_index__auxtrace_event (struct list_head *head,union perf_event *event,off_t file_offset);Signature · 1 line
2.17.1
Adrian Hunter
reviewerPATCH v2 5/5 perf auxtrace: Add auxtrace_record__read_finish()
All ->read_finish() implementations are doing the same thing. Add a helper function so that they can share the same implementation.
---
Changes in V2:
Change ptr->itr.cs_etm_pmu to ptr->itr.pmu
tools/perf/arch/arm/util/cs-etm.c | 21 ++------------------- tools/perf/arch/arm64/util/arm-spe.c | 20 ++------------------ tools/perf/arch/x86/util/intel-bts.c | 20 ++------------------ tools/perf/arch/x86/util/intel-pt.c | 20 ++------------------ tools/perf/util/auxtrace.c | 22 +++++++++++++++++++++- tools/perf/util/auxtrace.h | 6 ++++++ 6 files changed, 35 insertions(+), 74 deletions(-)
tools/perf/arch/arm/util/cs-etm.c +2 -19
@@ -858,24 +858,6 @@ static void cs_etm_recording_free(struct auxtrace_record *itr)free (ptr); } -static int cs_etm_read_finish (struct auxtrace_record *itr,int idx) -{ -struct cs_etm_recording *ptr = - container_of(itr, struct cs_etm_recording, itr); -struct evsel *evsel; - -evlist__for_each_entry (ptr->evlist, evsel) { -if (evsel->core.attr.type == ptr->cs_etm_pmu->type) { -if (evsel->disabled) -return 0 ; -return perf_evlist__enable_event_idx (ptr->evlist, - evsel, idx); - } - } - -return -EINVAL ; -} -struct auxtrace_record *cs_etm_record_init (int *err) {struct perf_pmu *cs_etm_pmu;
@@ -895,6 +877,7 @@ struct auxtrace_record *cs_etm_record_init(int *err) } ptr->cs_etm_pmu = cs_etm_pmu; + ptr->itr.pmu = cs_etm_pmu; ptr->itr.parse_snapshot_options = cs_etm_parse_snapshot_options; ptr->itr.recording_options = cs_etm_recording_options; ptr->itr.info_priv_size = cs_etm_info_priv_size;
@@ -904,7 +887,7 @@ struct auxtrace_record *cs_etm_record_init(int *err) ptr->itr.snapshot_finish = cs_etm_snapshot_finish; ptr->itr.reference = cs_etm_reference; ptr->itr.free = cs_etm_recording_free; - ptr->itr.read_finish = cs_etm_read_finish; + ptr->itr.read_finish = auxtrace_record__read_finish; *err =0 ;return &ptr->itr;
tools/perf/arch/arm64/util/arm-spe.c +2 -18
@@ -158,23 +158,6 @@ static void arm_spe_recording_free(struct auxtrace_record *itr)free (sper); } -static int arm_spe_read_finish (struct auxtrace_record *itr,int idx) -{ -struct arm_spe_recording *sper = - container_of(itr, struct arm_spe_recording, itr); -struct evsel *evsel; - -evlist__for_each_entry (sper->evlist, evsel) { -if (evsel->core.attr.type == sper->arm_spe_pmu->type) { -if (evsel->disabled) -return 0 ; -return perf_evlist__enable_event_idx (sper->evlist, - evsel, idx); - } - } -return -EINVAL ; -} -struct auxtrace_record *arm_spe_recording_init (int *err,struct perf_pmu *arm_spe_pmu) {
@@ -192,12 +175,13 @@ struct auxtrace_record *arm_spe_recording_init(int *err, } sper->arm_spe_pmu = arm_spe_pmu; + sper->itr.pmu = arm_spe_pmu; sper->itr.recording_options = arm_spe_recording_options; sper->itr.info_priv_size = arm_spe_info_priv_size; sper->itr.info_fill = arm_spe_info_fill; sper->itr.free = arm_spe_recording_free; sper->itr.reference = arm_spe_reference; - sper->itr.read_finish = arm_spe_read_finish; + sper->itr.read_finish = auxtrace_record__read_finish; sper->itr.alignment =0 ; *err =0 ;
tools/perf/arch/x86/util/intel-bts.c +2 -18
@@ -413,23 +413,6 @@ static int intel_bts_find_snapshot(struct auxtrace_record *itr, int idx,return err; } -static int intel_bts_read_finish (struct auxtrace_record *itr,int idx) -{ -struct intel_bts_recording *btsr = - container_of(itr, struct intel_bts_recording, itr); -struct evsel *evsel; - -evlist__for_each_entry (btsr->evlist, evsel) { -if (evsel->core.attr.type == btsr->intel_bts_pmu->type) { -if (evsel->disabled) -return 0 ; -return perf_evlist__enable_event_idx (btsr->evlist, - evsel, idx); - } - } -return -EINVAL ; -} -struct auxtrace_record *intel_bts_recording_init (int *err) {struct perf_pmu *intel_bts_pmu =perf_pmu__find (INTEL_BTS_PMU_NAME );
@@ -450,6 +433,7 @@ struct auxtrace_record *intel_bts_recording_init(int *err) } btsr->intel_bts_pmu = intel_bts_pmu; + btsr->itr.pmu = intel_bts_pmu; btsr->itr.recording_options = intel_bts_recording_options; btsr->itr.info_priv_size = intel_bts_info_priv_size; btsr->itr.info_fill = intel_bts_info_fill;
@@ -459,7 +443,7 @@ struct auxtrace_record *intel_bts_recording_init(int *err) btsr->itr.find_snapshot = intel_bts_find_snapshot; btsr->itr.parse_snapshot_options = intel_bts_parse_snapshot_options; btsr->itr.reference = intel_bts_reference; - btsr->itr.read_finish = intel_bts_read_finish; + btsr->itr.read_finish = auxtrace_record__read_finish; btsr->itr.alignment =sizeof (struct branch );return &btsr->itr; }
tools/perf/arch/x86/util/intel-pt.c +2 -18
@@ -1170,23 +1170,6 @@ static u64 intel_pt_reference(struct auxtrace_record *itr __maybe_unused)return rdtsc (); } -static int intel_pt_read_finish (struct auxtrace_record *itr,int idx) -{ -struct intel_pt_recording *ptr = - container_of(itr, struct intel_pt_recording, itr); -struct evsel *evsel; - -evlist__for_each_entry (ptr->evlist, evsel) { -if (evsel->core.attr.type == ptr->intel_pt_pmu->type) { -if (evsel->disabled) -return 0 ; -return perf_evlist__enable_event_idx (ptr->evlist, evsel, - idx); - } - } -return -EINVAL ; -} -struct auxtrace_record *intel_pt_recording_init (int *err) {struct perf_pmu *intel_pt_pmu =perf_pmu__find (INTEL_PT_PMU_NAME );
@@ -1207,6 +1190,7 @@ struct auxtrace_record *intel_pt_recording_init(int *err) } ptr->intel_pt_pmu = intel_pt_pmu; + ptr->itr.pmu = intel_pt_pmu; ptr->itr.recording_options = intel_pt_recording_options; ptr->itr.info_priv_size = intel_pt_info_priv_size; ptr->itr.info_fill = intel_pt_info_fill;
@@ -1216,7 +1200,7 @@ struct auxtrace_record *intel_pt_recording_init(int *err) ptr->itr.find_snapshot = intel_pt_find_snapshot; ptr->itr.parse_snapshot_options = intel_pt_parse_snapshot_options; ptr->itr.reference = intel_pt_reference; - ptr->itr.read_finish = intel_pt_read_finish; + ptr->itr.read_finish = auxtrace_record__read_finish;/* * Decoding starts at a PSB packet. Minimum PSB period is 2K so 4K * should give at least 1 PSB per sample.
tools/perf/util/auxtrace.c +21 -1
@@ -629,8 +629,10 @@ int auxtrace_record__options(struct auxtrace_record *itr,struct evlist *evlist, struct record_opts *opts) { - if (itr) + if (itr) { + itr->evlist = evlist;return itr->recording_options (itr, evlist, opts); + }return 0 ; }
@@ -664,6 +666,24 @@ int auxtrace_parse_snapshot_options(struct auxtrace_record *itr,return -EINVAL ; } +int auxtrace_record__read_finish (struct auxtrace_record *itr,int idx) +{ +struct evsel *evsel; + +if (!itr->evlist || !itr->pmu) +return -EINVAL ; + +evlist__for_each_entry (itr->evlist, evsel) { +if (evsel->core.attr.type == itr->pmu->type) { +if (evsel->disabled) +return 0 ; +return perf_evlist__enable_event_idx (itr->evlist, evsel, + idx); + } + } +return -EINVAL ; +} +/* * Event record size is 16-bit which results in a maximum size of about 64KiB. * Allow about 4KiB for the rest of the sample record, to give a maximum
tools/perf/util/auxtrace.h +6 -0
@@ -29,6 +29,7 @@ struct record_opts;struct perf_record_auxtrace_error ;struct perf_record_auxtrace_info ;struct events_stats ; +struct perf_pmu ;enum auxtrace_error_type {PERF_AUXTRACE_ERROR_ITRACE =1 ,
@@ -322,6 +323,8 @@ struct auxtrace_mmap_params {* @read_finish: called after reading from an auxtrace mmap * @alignment: alignment (if any) for AUX area data * @default_aux_sample_size: default sample size for --aux sample option +* @pmu: associated pmu +* @evlist: selected events list */ struct auxtrace_record { int (*recording_options)(struct auxtrace_record *itr,
@@ -346,6 +349,8 @@ struct auxtrace_record {int (*read_finish)(struct auxtrace_record *itr,int idx);unsigned int alignment;unsigned int default_aux_sample_size; +struct perf_pmu *pmu; +struct evlist *evlist; };/**
@@ -537,6 +542,7 @@ int auxtrace_record__find_snapshot(struct auxtrace_record *itr, int idx,struct auxtrace_mmap *mm, unsigned char *data, u64 *head, u64 *old);u64 auxtrace_record__reference (struct auxtrace_record *itr); +int auxtrace_record__read_finish (struct auxtrace_record *itr,int idx);int auxtrace_index__auxtrace_event (struct list_head *head,union perf_event *event,off_t file_offset);
Signature · 1 line
2.17.1
Re: [PATCH V2 5/5] perf auxtrace: Add auxtrace_record__read_finish()
Em Mon, Feb 17, 2020 at 10:23:00AM +0200, Adrian Hunter escreveu:
Quoted 6 lines
All ->read_finish() implementations are doing the same thing. Add a helper function so that they can share the same implementation.
Signed-off-by Adrian Hunter <[email protected]>Reviewed-and-Tested-by Leo Yan <[email protected]>Reviewed-by Mathieu Poirier <[email protected]>
Quoted 6 lines
---
Changes in V2:
Change ptr->itr.cs_etm_pmu to ptr->itr.pmu
Series applied to perf/urgent, thanks,
- Arnaldo
Quoted 270 lines
tools/perf/arch/arm/util/cs-etm.c | 21 ++------------------- tools/perf/arch/arm64/util/arm-spe.c | 20 ++------------------ tools/perf/arch/x86/util/intel-bts.c | 20 ++------------------ tools/perf/arch/x86/util/intel-pt.c | 20 ++------------------ tools/perf/util/auxtrace.c | 22 +++++++++++++++++++++- tools/perf/util/auxtrace.h | 6 ++++++ 6 files changed, 35 insertions(+), 74 deletions(-)tools/perf/arch/arm/util/cs-etm.c +2
-19@@ -858,24 +858,6 @@ static void cs_etm_recording_free(struct auxtrace_record *itr)free (ptr); } -static int cs_etm_read_finish (struct auxtrace_record *itr,int idx) -{ -struct cs_etm_recording *ptr = - container_of(itr, struct cs_etm_recording, itr); -struct evsel *evsel; - -evlist__for_each_entry (ptr->evlist, evsel) { -if (evsel->core.attr.type == ptr->cs_etm_pmu->type) { -if (evsel->disabled) -return 0 ; -return perf_evlist__enable_event_idx (ptr->evlist, - evsel, idx); - } - } - -return -EINVAL ; -} -struct auxtrace_record *cs_etm_record_init (int *err) {struct perf_pmu *cs_etm_pmu;@@ -895,6 +877,7 @@ struct auxtrace_record *cs_etm_record_init(int *err) } ptr->cs_etm_pmu = cs_etm_pmu; + ptr->itr.pmu = cs_etm_pmu; ptr->itr.parse_snapshot_options = cs_etm_parse_snapshot_options; ptr->itr.recording_options = cs_etm_recording_options; ptr->itr.info_priv_size = cs_etm_info_priv_size;@@ -904,7 +887,7 @@ struct auxtrace_record *cs_etm_record_init(int *err) ptr->itr.snapshot_finish = cs_etm_snapshot_finish; ptr->itr.reference = cs_etm_reference; ptr->itr.free = cs_etm_recording_free; - ptr->itr.read_finish = cs_etm_read_finish; + ptr->itr.read_finish = auxtrace_record__read_finish; *err =0 ;return &ptr->itr;tools/perf/arch/arm64/util/arm-spe.c +2
-18@@ -158,23 +158,6 @@ static void arm_spe_recording_free(struct auxtrace_record *itr)free (sper); } -static int arm_spe_read_finish (struct auxtrace_record *itr,int idx) -{ -struct arm_spe_recording *sper = - container_of(itr, struct arm_spe_recording, itr); -struct evsel *evsel; - -evlist__for_each_entry (sper->evlist, evsel) { -if (evsel->core.attr.type == sper->arm_spe_pmu->type) { -if (evsel->disabled) -return 0 ; -return perf_evlist__enable_event_idx (sper->evlist, - evsel, idx); - } - } -return -EINVAL ; -} -struct auxtrace_record *arm_spe_recording_init (int *err,struct perf_pmu *arm_spe_pmu) {@@ -192,12 +175,13 @@ struct auxtrace_record *arm_spe_recording_init(int *err, } sper->arm_spe_pmu = arm_spe_pmu; + sper->itr.pmu = arm_spe_pmu; sper->itr.recording_options = arm_spe_recording_options; sper->itr.info_priv_size = arm_spe_info_priv_size; sper->itr.info_fill = arm_spe_info_fill; sper->itr.free = arm_spe_recording_free; sper->itr.reference = arm_spe_reference; - sper->itr.read_finish = arm_spe_read_finish; + sper->itr.read_finish = auxtrace_record__read_finish; sper->itr.alignment =0 ; *err =0 ;tools/perf/arch/x86/util/intel-bts.c +2
-18@@ -413,23 +413,6 @@ static int intel_bts_find_snapshot(struct auxtrace_record *itr, int idx,return err; } -static int intel_bts_read_finish (struct auxtrace_record *itr,int idx) -{ -struct intel_bts_recording *btsr = - container_of(itr, struct intel_bts_recording, itr); -struct evsel *evsel; - -evlist__for_each_entry (btsr->evlist, evsel) { -if (evsel->core.attr.type == btsr->intel_bts_pmu->type) { -if (evsel->disabled) -return 0 ; -return perf_evlist__enable_event_idx (btsr->evlist, - evsel, idx); - } - } -return -EINVAL ; -} -struct auxtrace_record *intel_bts_recording_init (int *err) {struct perf_pmu *intel_bts_pmu =perf_pmu__find (INTEL_BTS_PMU_NAME );@@ -450,6 +433,7 @@ struct auxtrace_record *intel_bts_recording_init(int *err) } btsr->intel_bts_pmu = intel_bts_pmu; + btsr->itr.pmu = intel_bts_pmu; btsr->itr.recording_options = intel_bts_recording_options; btsr->itr.info_priv_size = intel_bts_info_priv_size; btsr->itr.info_fill = intel_bts_info_fill;@@ -459,7 +443,7 @@ struct auxtrace_record *intel_bts_recording_init(int *err) btsr->itr.find_snapshot = intel_bts_find_snapshot; btsr->itr.parse_snapshot_options = intel_bts_parse_snapshot_options; btsr->itr.reference = intel_bts_reference; - btsr->itr.read_finish = intel_bts_read_finish; + btsr->itr.read_finish = auxtrace_record__read_finish; btsr->itr.alignment =sizeof (struct branch );return &btsr->itr; }tools/perf/arch/x86/util/intel-pt.c +2
-18@@ -1170,23 +1170,6 @@ static u64 intel_pt_reference(struct auxtrace_record *itr __maybe_unused)return rdtsc (); } -static int intel_pt_read_finish (struct auxtrace_record *itr,int idx) -{ -struct intel_pt_recording *ptr = - container_of(itr, struct intel_pt_recording, itr); -struct evsel *evsel; - -evlist__for_each_entry (ptr->evlist, evsel) { -if (evsel->core.attr.type == ptr->intel_pt_pmu->type) { -if (evsel->disabled) -return 0 ; -return perf_evlist__enable_event_idx (ptr->evlist, evsel, - idx); - } - } -return -EINVAL ; -} -struct auxtrace_record *intel_pt_recording_init (int *err) {struct perf_pmu *intel_pt_pmu =perf_pmu__find (INTEL_PT_PMU_NAME );@@ -1207,6 +1190,7 @@ struct auxtrace_record *intel_pt_recording_init(int *err) } ptr->intel_pt_pmu = intel_pt_pmu; + ptr->itr.pmu = intel_pt_pmu; ptr->itr.recording_options = intel_pt_recording_options; ptr->itr.info_priv_size = intel_pt_info_priv_size; ptr->itr.info_fill = intel_pt_info_fill;@@ -1216,7 +1200,7 @@ struct auxtrace_record *intel_pt_recording_init(int *err) ptr->itr.find_snapshot = intel_pt_find_snapshot; ptr->itr.parse_snapshot_options = intel_pt_parse_snapshot_options; ptr->itr.reference = intel_pt_reference; - ptr->itr.read_finish = intel_pt_read_finish; + ptr->itr.read_finish = auxtrace_record__read_finish;/* * Decoding starts at a PSB packet. Minimum PSB period is 2K so 4K * should give at least 1 PSB per sample. tools/perf/util/auxtrace.c +21
-1@@ -629,8 +629,10 @@ int auxtrace_record__options(struct auxtrace_record *itr,struct evlist *evlist, struct record_opts *opts) { - if (itr) + if (itr) { + itr->evlist = evlist;return itr->recording_options (itr, evlist, opts); + }return 0 ; }@@ -664,6 +666,24 @@ int auxtrace_parse_snapshot_options(struct auxtrace_record *itr,return -EINVAL ; } +int auxtrace_record__read_finish (struct auxtrace_record *itr,int idx) +{ +struct evsel *evsel; + +if (!itr->evlist || !itr->pmu) +return -EINVAL ; + +evlist__for_each_entry (itr->evlist, evsel) { +if (evsel->core.attr.type == itr->pmu->type) { +if (evsel->disabled) +return 0 ; +return perf_evlist__enable_event_idx (itr->evlist, evsel, + idx); + } + } +return -EINVAL ; +} +/* * Event record size is 16-bit which results in a maximum size of about 64KiB. * Allow about 4KiB for the rest of the sample record, to give a maximum tools/perf/util/auxtrace.h +6
-0@@ -29,6 +29,7 @@ struct record_opts;struct perf_record_auxtrace_error ;struct perf_record_auxtrace_info ;struct events_stats ; +struct perf_pmu ;enum auxtrace_error_type {PERF_AUXTRACE_ERROR_ITRACE =1 ,@@ -322,6 +323,8 @@ struct auxtrace_mmap_params {* @read_finish: called after reading from an auxtrace mmap * @alignment: alignment (if any) for AUX area data * @default_aux_sample_size: default sample size for --aux sample option +* @pmu: associated pmu +* @evlist: selected events list */ struct auxtrace_record { int (*recording_options)(struct auxtrace_record *itr,@@ -346,6 +349,8 @@ struct auxtrace_record {int (*read_finish)(struct auxtrace_record *itr,int idx);unsigned int alignment;unsigned int default_aux_sample_size; +struct perf_pmu *pmu; +struct evlist *evlist; };/** @@ -537,6 +542,7 @@ int auxtrace_record__find_snapshot(struct auxtrace_record *itr, int idx,struct auxtrace_mmap *mm, unsigned char *data, u64 *head, u64 *old);u64 auxtrace_record__reference (struct auxtrace_record *itr); +int auxtrace_record__read_finish (struct auxtrace_record *itr,int idx);int auxtrace_index__auxtrace_event (struct list_head *head,union perf_event *event,off_t file_offset);Signature · 1 line
2.17.1
Signature · 1 line
- Arnaldo
[tip: perf/urgent] perf auxtrace: Add auxtrace_record__read_finish()
In reply to Adrian HunterThe following commit has been merged into the perf/urgent branch of tip:
The following commit has been merged into the perf/urgent branch of tip:
Commit-ID: ad60ba0c2e6da6ff573c5ac57708fbc443bbb473 Gitweb: https://git.kernel.org/tip/ad60ba0c2e6da6ff573c5ac57708fbc443bbb473 Author: Adrian Hunter <[email protected]> AuthorDate: Mon, 17 Feb 2020 10:23:00 +02:00 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitterDate: Tue, 18 Feb 2020 10:13:29 -03:00
perf auxtrace: Add auxtrace_record__read_finish()
All ->read_finish() implementations are doing the same thing. Add a helper function so that they can share the same implementation.
--- tools/perf/arch/arm/util/cs-etm.c | 21 ++------------------- tools/perf/arch/arm64/util/arm-spe.c | 20 ++------------------ tools/perf/arch/x86/util/intel-bts.c | 20 ++------------------ tools/perf/arch/x86/util/intel-pt.c | 20 ++------------------ tools/perf/util/auxtrace.c | 22 +++++++++++++++++++++- tools/perf/util/auxtrace.h | 6 ++++++ 6 files changed, 35 insertions(+), 74 deletions(-)
tools/perf/arch/arm/util/cs-etm.c +2 -19
@@ -858,24 +858,6 @@ static void cs_etm_recording_free(struct auxtrace_record *itr)free (ptr); } -static int cs_etm_read_finish (struct auxtrace_record *itr,int idx) -{ -struct cs_etm_recording *ptr = - container_of(itr, struct cs_etm_recording, itr); -struct evsel *evsel; - -evlist__for_each_entry (ptr->evlist, evsel) { -if (evsel->core.attr.type == ptr->cs_etm_pmu->type) { -if (evsel->disabled) -return 0 ; -return perf_evlist__enable_event_idx (ptr->evlist, - evsel, idx); - } - } - -return -EINVAL ; -} -struct auxtrace_record *cs_etm_record_init (int *err) {struct perf_pmu *cs_etm_pmu;
@@ -895,6 +877,7 @@ struct auxtrace_record *cs_etm_record_init(int *err) } ptr->cs_etm_pmu = cs_etm_pmu; + ptr->itr.pmu = cs_etm_pmu; ptr->itr.parse_snapshot_options = cs_etm_parse_snapshot_options; ptr->itr.recording_options = cs_etm_recording_options; ptr->itr.info_priv_size = cs_etm_info_priv_size;
@@ -904,7 +887,7 @@ struct auxtrace_record *cs_etm_record_init(int *err) ptr->itr.snapshot_finish = cs_etm_snapshot_finish; ptr->itr.reference = cs_etm_reference; ptr->itr.free = cs_etm_recording_free; - ptr->itr.read_finish = cs_etm_read_finish; + ptr->itr.read_finish = auxtrace_record__read_finish; *err =0 ;return &ptr->itr;
tools/perf/arch/arm64/util/arm-spe.c +2 -18
@@ -158,23 +158,6 @@ static void arm_spe_recording_free(struct auxtrace_record *itr)free (sper); } -static int arm_spe_read_finish (struct auxtrace_record *itr,int idx) -{ -struct arm_spe_recording *sper = - container_of(itr, struct arm_spe_recording, itr); -struct evsel *evsel; - -evlist__for_each_entry (sper->evlist, evsel) { -if (evsel->core.attr.type == sper->arm_spe_pmu->type) { -if (evsel->disabled) -return 0 ; -return perf_evlist__enable_event_idx (sper->evlist, - evsel, idx); - } - } -return -EINVAL ; -} -struct auxtrace_record *arm_spe_recording_init (int *err,struct perf_pmu *arm_spe_pmu) {
@@ -192,12 +175,13 @@ struct auxtrace_record *arm_spe_recording_init(int *err, } sper->arm_spe_pmu = arm_spe_pmu; + sper->itr.pmu = arm_spe_pmu; sper->itr.recording_options = arm_spe_recording_options; sper->itr.info_priv_size = arm_spe_info_priv_size; sper->itr.info_fill = arm_spe_info_fill; sper->itr.free = arm_spe_recording_free; sper->itr.reference = arm_spe_reference; - sper->itr.read_finish = arm_spe_read_finish; + sper->itr.read_finish = auxtrace_record__read_finish; sper->itr.alignment =0 ; *err =0 ;
tools/perf/arch/x86/util/intel-bts.c +2 -18
@@ -413,23 +413,6 @@ out_err:return err; } -static int intel_bts_read_finish (struct auxtrace_record *itr,int idx) -{ -struct intel_bts_recording *btsr = - container_of(itr, struct intel_bts_recording, itr); -struct evsel *evsel; - -evlist__for_each_entry (btsr->evlist, evsel) { -if (evsel->core.attr.type == btsr->intel_bts_pmu->type) { -if (evsel->disabled) -return 0 ; -return perf_evlist__enable_event_idx (btsr->evlist, - evsel, idx); - } - } -return -EINVAL ; -} -struct auxtrace_record *intel_bts_recording_init (int *err) {struct perf_pmu *intel_bts_pmu =perf_pmu__find (INTEL_BTS_PMU_NAME );
@@ -450,6 +433,7 @@ struct auxtrace_record *intel_bts_recording_init(int *err) } btsr->intel_bts_pmu = intel_bts_pmu; + btsr->itr.pmu = intel_bts_pmu; btsr->itr.recording_options = intel_bts_recording_options; btsr->itr.info_priv_size = intel_bts_info_priv_size; btsr->itr.info_fill = intel_bts_info_fill;
@@ -459,7 +443,7 @@ struct auxtrace_record *intel_bts_recording_init(int *err) btsr->itr.find_snapshot = intel_bts_find_snapshot; btsr->itr.parse_snapshot_options = intel_bts_parse_snapshot_options; btsr->itr.reference = intel_bts_reference; - btsr->itr.read_finish = intel_bts_read_finish; + btsr->itr.read_finish = auxtrace_record__read_finish; btsr->itr.alignment =sizeof (struct branch );return &btsr->itr; }
tools/perf/arch/x86/util/intel-pt.c +2 -18
@@ -1166,23 +1166,6 @@ static u64 intel_pt_reference(struct auxtrace_record *itr __maybe_unused)return rdtsc (); } -static int intel_pt_read_finish (struct auxtrace_record *itr,int idx) -{ -struct intel_pt_recording *ptr = - container_of(itr, struct intel_pt_recording, itr); -struct evsel *evsel; - -evlist__for_each_entry (ptr->evlist, evsel) { -if (evsel->core.attr.type == ptr->intel_pt_pmu->type) { -if (evsel->disabled) -return 0 ; -return perf_evlist__enable_event_idx (ptr->evlist, evsel, - idx); - } - } -return -EINVAL ; -} -struct auxtrace_record *intel_pt_recording_init (int *err) {struct perf_pmu *intel_pt_pmu =perf_pmu__find (INTEL_PT_PMU_NAME );
@@ -1203,6 +1186,7 @@ struct auxtrace_record *intel_pt_recording_init(int *err) } ptr->intel_pt_pmu = intel_pt_pmu; + ptr->itr.pmu = intel_pt_pmu; ptr->itr.recording_options = intel_pt_recording_options; ptr->itr.info_priv_size = intel_pt_info_priv_size; ptr->itr.info_fill = intel_pt_info_fill;
@@ -1212,7 +1196,7 @@ struct auxtrace_record *intel_pt_recording_init(int *err) ptr->itr.find_snapshot = intel_pt_find_snapshot; ptr->itr.parse_snapshot_options = intel_pt_parse_snapshot_options; ptr->itr.reference = intel_pt_reference; - ptr->itr.read_finish = intel_pt_read_finish; + ptr->itr.read_finish = auxtrace_record__read_finish;/* * Decoding starts at a PSB packet. Minimum PSB period is 2K so 4K * should give at least 1 PSB per sample.
tools/perf/util/auxtrace.c +21 -1
@@ -629,8 +629,10 @@ int auxtrace_record__options(struct auxtrace_record *itr,struct evlist *evlist, struct record_opts *opts) { - if (itr) + if (itr) { + itr->evlist = evlist;return itr->recording_options (itr, evlist, opts); + }return 0 ; }
@@ -664,6 +666,24 @@ int auxtrace_parse_snapshot_options(struct auxtrace_record *itr,return -EINVAL ; } +int auxtrace_record__read_finish (struct auxtrace_record *itr,int idx) +{ +struct evsel *evsel; + +if (!itr->evlist || !itr->pmu) +return -EINVAL ; + +evlist__for_each_entry (itr->evlist, evsel) { +if (evsel->core.attr.type == itr->pmu->type) { +if (evsel->disabled) +return 0 ; +return perf_evlist__enable_event_idx (itr->evlist, evsel, + idx); + } + } +return -EINVAL ; +} +/* * Event record size is 16-bit which results in a maximum size of about 64KiB. * Allow about 4KiB for the rest of the sample record, to give a maximum
tools/perf/util/auxtrace.h +6 -0
@@ -29,6 +29,7 @@ struct record_opts;struct perf_record_auxtrace_error ;struct perf_record_auxtrace_info ;struct events_stats ; +struct perf_pmu ;enum auxtrace_error_type {PERF_AUXTRACE_ERROR_ITRACE =1 ,
@@ -322,6 +323,8 @@ struct auxtrace_mmap_params {* @read_finish: called after reading from an auxtrace mmap * @alignment: alignment (if any) for AUX area data * @default_aux_sample_size: default sample size for --aux sample option +* @pmu: associated pmu +* @evlist: selected events list */ struct auxtrace_record { int (*recording_options)(struct auxtrace_record *itr,
@@ -346,6 +349,8 @@ struct auxtrace_record {int (*read_finish)(struct auxtrace_record *itr,int idx);unsigned int alignment;unsigned int default_aux_sample_size; +struct perf_pmu *pmu; +struct evlist *evlist; };/**
@@ -537,6 +542,7 @@ int auxtrace_record__find_snapshot(struct auxtrace_record *itr, int idx,struct auxtrace_mmap *mm, unsigned char *data, u64 *head, u64 *old);u64 auxtrace_record__reference (struct auxtrace_record *itr); +int auxtrace_record__read_finish (struct auxtrace_record *itr,int idx);int auxtrace_index__auxtrace_event (struct list_head *head,union perf_event *event,off_t file_offset);
Re: [PATCH 5/5] perf auxtrace: Add auxtrace_record__read_finish()
In reply to Adrian HunterQuoted 43 lines · Adrian Hunter
All ->read_finish() implementations are doing the same thing. Add a helper function so that they can share the same implementation.
Signed-off-by Adrian Hunter <[email protected]>--- tools/perf/arch/arm/util/cs-etm.c | 21 ++------------------- tools/perf/arch/arm64/util/arm-spe.c | 20 ++------------------ tools/perf/arch/x86/util/intel-bts.c | 20 ++------------------ tools/perf/arch/x86/util/intel-pt.c | 20 ++------------------ tools/perf/util/auxtrace.c | 22 +++++++++++++++++++++- tools/perf/util/auxtrace.h | 6 ++++++ 6 files changed, 35 insertions(+), 74 deletions(-)tools/perf/arch/arm/util/cs-etm.c +0
-18@@ -858,24 +858,6 @@ static void cs_etm_recording_free(struct auxtrace_record *itr)free (ptr); } -static int cs_etm_read_finish (struct auxtrace_record *itr,int idx) -{ -struct cs_etm_recording *ptr = - container_of(itr, struct cs_etm_recording, itr); -struct evsel *evsel; - -evlist__for_each_entry (ptr->evlist, evsel) { -if (evsel->core.attr.type == ptr->cs_etm_pmu->type) { -if (evsel->disabled) -return 0 ; -return perf_evlist__enable_event_idx (ptr->evlist, - evsel, idx); - } - } - -return -EINVAL ; -} -struct auxtrace_record *cs_etm_record_init (int *err) {struct perf_pmu *cs_etm_pmu;
tools/perf/arch/arm/util/cs-etm.c struct auxtrace_record *cs_etm_record_init(int *err) · line 880
Quoted 4 lines
tools/perf/arch/arm/util/cs-etm.c +1
-0@@ -895,6 +877,7 @@ struct auxtrace_record *cs_etm_record_init(int *err) } ptr->cs_etm_pmu = cs_etm_pmu; + ptr->itr.cs_etm_pmu = cs_etm_pmu;
As Leo pointed out this won't compile. With this fixed and for cs-etm.c:
Quoted 227 lines
tools/perf/arch/arm/util/cs-etm.c +1
-1ptr->itr.parse_snapshot_options = cs_etm_parse_snapshot_options; ptr->itr.recording_options = cs_etm_recording_options; ptr->itr.info_priv_size = cs_etm_info_priv_size;@@ -904,7 +887,7 @@ struct auxtrace_record *cs_etm_record_init(int *err) ptr->itr.snapshot_finish = cs_etm_snapshot_finish; ptr->itr.reference = cs_etm_reference; ptr->itr.free = cs_etm_recording_free; - ptr->itr.read_finish = cs_etm_read_finish; + ptr->itr.read_finish = auxtrace_record__read_finish; *err =0 ;return &ptr->itr;tools/perf/arch/arm64/util/arm-spe.c +2
-18@@ -158,23 +158,6 @@ static void arm_spe_recording_free(struct auxtrace_record *itr)free (sper); } -static int arm_spe_read_finish (struct auxtrace_record *itr,int idx) -{ -struct arm_spe_recording *sper = - container_of(itr, struct arm_spe_recording, itr); -struct evsel *evsel; - -evlist__for_each_entry (sper->evlist, evsel) { -if (evsel->core.attr.type == sper->arm_spe_pmu->type) { -if (evsel->disabled) -return 0 ; -return perf_evlist__enable_event_idx (sper->evlist, - evsel, idx); - } - } -return -EINVAL ; -} -struct auxtrace_record *arm_spe_recording_init (int *err,struct perf_pmu *arm_spe_pmu) {@@ -192,12 +175,13 @@ struct auxtrace_record *arm_spe_recording_init(int *err, } sper->arm_spe_pmu = arm_spe_pmu; + sper->itr.pmu = arm_spe_pmu; sper->itr.recording_options = arm_spe_recording_options; sper->itr.info_priv_size = arm_spe_info_priv_size; sper->itr.info_fill = arm_spe_info_fill; sper->itr.free = arm_spe_recording_free; sper->itr.reference = arm_spe_reference; - sper->itr.read_finish = arm_spe_read_finish; + sper->itr.read_finish = auxtrace_record__read_finish; sper->itr.alignment =0 ; *err =0 ;tools/perf/arch/x86/util/intel-bts.c +2
-18@@ -413,23 +413,6 @@ static int intel_bts_find_snapshot(struct auxtrace_record *itr, int idx,return err; } -static int intel_bts_read_finish (struct auxtrace_record *itr,int idx) -{ -struct intel_bts_recording *btsr = - container_of(itr, struct intel_bts_recording, itr); -struct evsel *evsel; - -evlist__for_each_entry (btsr->evlist, evsel) { -if (evsel->core.attr.type == btsr->intel_bts_pmu->type) { -if (evsel->disabled) -return 0 ; -return perf_evlist__enable_event_idx (btsr->evlist, - evsel, idx); - } - } -return -EINVAL ; -} -struct auxtrace_record *intel_bts_recording_init (int *err) {struct perf_pmu *intel_bts_pmu =perf_pmu__find (INTEL_BTS_PMU_NAME );@@ -450,6 +433,7 @@ struct auxtrace_record *intel_bts_recording_init(int *err) } btsr->intel_bts_pmu = intel_bts_pmu; + btsr->itr.pmu = intel_bts_pmu; btsr->itr.recording_options = intel_bts_recording_options; btsr->itr.info_priv_size = intel_bts_info_priv_size; btsr->itr.info_fill = intel_bts_info_fill;@@ -459,7 +443,7 @@ struct auxtrace_record *intel_bts_recording_init(int *err) btsr->itr.find_snapshot = intel_bts_find_snapshot; btsr->itr.parse_snapshot_options = intel_bts_parse_snapshot_options; btsr->itr.reference = intel_bts_reference; - btsr->itr.read_finish = intel_bts_read_finish; + btsr->itr.read_finish = auxtrace_record__read_finish; btsr->itr.alignment =sizeof (struct branch );return &btsr->itr; }tools/perf/arch/x86/util/intel-pt.c +2
-18@@ -1170,23 +1170,6 @@ static u64 intel_pt_reference(struct auxtrace_record *itr __maybe_unused)return rdtsc (); } -static int intel_pt_read_finish (struct auxtrace_record *itr,int idx) -{ -struct intel_pt_recording *ptr = - container_of(itr, struct intel_pt_recording, itr); -struct evsel *evsel; - -evlist__for_each_entry (ptr->evlist, evsel) { -if (evsel->core.attr.type == ptr->intel_pt_pmu->type) { -if (evsel->disabled) -return 0 ; -return perf_evlist__enable_event_idx (ptr->evlist, evsel, - idx); - } - } -return -EINVAL ; -} -struct auxtrace_record *intel_pt_recording_init (int *err) {struct perf_pmu *intel_pt_pmu =perf_pmu__find (INTEL_PT_PMU_NAME );@@ -1207,6 +1190,7 @@ struct auxtrace_record *intel_pt_recording_init(int *err) } ptr->intel_pt_pmu = intel_pt_pmu; + ptr->itr.pmu = intel_pt_pmu; ptr->itr.recording_options = intel_pt_recording_options; ptr->itr.info_priv_size = intel_pt_info_priv_size; ptr->itr.info_fill = intel_pt_info_fill;@@ -1216,7 +1200,7 @@ struct auxtrace_record *intel_pt_recording_init(int *err) ptr->itr.find_snapshot = intel_pt_find_snapshot; ptr->itr.parse_snapshot_options = intel_pt_parse_snapshot_options; ptr->itr.reference = intel_pt_reference; - ptr->itr.read_finish = intel_pt_read_finish; + ptr->itr.read_finish = auxtrace_record__read_finish;/* * Decoding starts at a PSB packet. Minimum PSB period is 2K so 4K * should give at least 1 PSB per sample. tools/perf/util/auxtrace.c +21
-1@@ -629,8 +629,10 @@ int auxtrace_record__options(struct auxtrace_record *itr,struct evlist *evlist, struct record_opts *opts) { - if (itr) + if (itr) { + itr->evlist = evlist;return itr->recording_options (itr, evlist, opts); + }return 0 ; }@@ -664,6 +666,24 @@ int auxtrace_parse_snapshot_options(struct auxtrace_record *itr,return -EINVAL ; } +int auxtrace_record__read_finish (struct auxtrace_record *itr,int idx) +{ +struct evsel *evsel; + +if (!itr->evlist || !itr->pmu) +return -EINVAL ; + +evlist__for_each_entry (itr->evlist, evsel) { +if (evsel->core.attr.type == itr->pmu->type) { +if (evsel->disabled) +return 0 ; +return perf_evlist__enable_event_idx (itr->evlist, evsel, + idx); + } + } +return -EINVAL ; +} +/* * Event record size is 16-bit which results in a maximum size of about 64KiB. * Allow about 4KiB for the rest of the sample record, to give a maximum tools/perf/util/auxtrace.h +6
-0@@ -29,6 +29,7 @@ struct record_opts;struct perf_record_auxtrace_error ;struct perf_record_auxtrace_info ;struct events_stats ; +struct perf_pmu ;enum auxtrace_error_type {PERF_AUXTRACE_ERROR_ITRACE =1 ,@@ -322,6 +323,8 @@ struct auxtrace_mmap_params {* @read_finish: called after reading from an auxtrace mmap * @alignment: alignment (if any) for AUX area data * @default_aux_sample_size: default sample size for --aux sample option +* @pmu: associated pmu +* @evlist: selected events list */ struct auxtrace_record { int (*recording_options)(struct auxtrace_record *itr,@@ -346,6 +349,8 @@ struct auxtrace_record {int (*read_finish)(struct auxtrace_record *itr,int idx);unsigned int alignment;unsigned int default_aux_sample_size; +struct perf_pmu *pmu; +struct evlist *evlist; };/** @@ -537,6 +542,7 @@ int auxtrace_record__find_snapshot(struct auxtrace_record *itr, int idx,struct auxtrace_mmap *mm, unsigned char *data, u64 *head, u64 *old);u64 auxtrace_record__reference (struct auxtrace_record *itr); +int auxtrace_record__read_finish (struct auxtrace_record *itr,int idx);int auxtrace_index__auxtrace_event (struct list_head *head,union perf_event *event,off_t file_offset);Signature · 1 line
2.17.1
Adrian Hunter
reviewerPATCH v2 2/5 perf tools: intel-bts: fix endless record after being terminated
In reply to Adrian HunterFrom: Wei Li <[email protected]>
In __cmd_record(), when receiving SIGINT(ctrl + c), a done flag will be set and the event list will be disabled by evlist__disable() once.
While in auxtrace_record.read_finish(), the related events will be enabled again, if they are continuous, the recording seems to be endless.
If the intel_bts event is disabled, we don't enable it again here.
Note: This patch is NOT tested since i don't have such a machine with intel_bts feature, but the code seems buggy same as arm-spe and intel-pt.
--- tools/perf/arch/x86/util/intel-bts.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
tools/perf/arch/x86/util/intel-bts.c +4 -1
@@ -420,9 +420,12 @@ static int intel_bts_read_finish(struct auxtrace_record *itr, int idx)struct evsel *evsel;evlist__for_each_entry (btsr->evlist, evsel) { -if (evsel->core.attr.type == btsr->intel_bts_pmu->type) +if (evsel->core.attr.type == btsr->intel_bts_pmu->type) { +if (evsel->disabled) +return 0 ;return perf_evlist__enable_event_idx (btsr->evlist, evsel, idx); + } }return -EINVAL ; }
Signature · 1 line
2.17.1
[tip: perf/urgent] perf intel-bts: Fix endless record after being terminated
The following commit has been merged into the perf/urgent branch of tip:
The following commit has been merged into the perf/urgent branch of tip:
Commit-ID: 783fed2f35e2a6771c8dc6ee29b8c4b9930783ce Gitweb: https://git.kernel.org/tip/783fed2f35e2a6771c8dc6ee29b8c4b9930783ce Author: Wei Li <[email protected]> AuthorDate: Fri, 14 Feb 2020 15:26:51 +02:00 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitterDate: Tue, 18 Feb 2020 10:13:29 -03:00
perf intel-bts: Fix endless record after being terminated
In __cmd_record(), when receiving SIGINT(ctrl + c), a 'done' flag will be set and the event list will be disabled by evlist__disable() once.
While in auxtrace_record.read_finish(), the related events will be enabled again, if they are continuous, the recording seems to be endless.
If the intel_bts event is disabled, we don't enable it again here.
Note: This patch is NOT tested since i don't have such a machine with intel_bts feature, but the code seems buggy same as arm-spe and intel-pt.
--- tools/perf/arch/x86/util/intel-bts.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
tools/perf/arch/x86/util/intel-bts.c +4 -1
@@ -420,9 +420,12 @@ static int intel_bts_read_finish(struct auxtrace_record *itr, int idx)struct evsel *evsel;evlist__for_each_entry (btsr->evlist, evsel) { -if (evsel->core.attr.type == btsr->intel_bts_pmu->type) +if (evsel->core.attr.type == btsr->intel_bts_pmu->type) { +if (evsel->disabled) +return 0 ;return perf_evlist__enable_event_idx (btsr->evlist, evsel, idx); + } }return -EINVAL ; }
Adrian Hunter
reviewerPATCH v2 3/5 perf tools: cs-etm: fix endless record after being terminated
In reply to Adrian HunterFrom: Wei Li <[email protected]>
In __cmd_record(), when receiving SIGINT(ctrl + c), a done flag will be set and the event list will be disabled by evlist__disable() once.
While in auxtrace_record.read_finish(), the related events will be enabled again, if they are continuous, the recording seems to be endless.
If the cs_etm event is disabled, we don't enable it again here.
Note: This patch is NOT tested since i don't have such a machine with coresight feature, but the code seems buggy same as arm-spe and intel-pt.
--- tools/perf/arch/arm/util/cs-etm.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
tools/perf/arch/arm/util/cs-etm.c +4 -1
@@ -865,9 +865,12 @@ static int cs_etm_read_finish(struct auxtrace_record *itr, int idx)struct evsel *evsel;evlist__for_each_entry (ptr->evlist, evsel) { -if (evsel->core.attr.type == ptr->cs_etm_pmu->type) +if (evsel->core.attr.type == ptr->cs_etm_pmu->type) { +if (evsel->disabled) +return 0 ;return perf_evlist__enable_event_idx (ptr->evlist, evsel, idx); + } }return -EINVAL ;
Signature · 1 line
2.17.1
Adrian Hunter
reviewerRe: [PATCH V2 3/5] perf tools: cs-etm: fix endless record after being terminated
+ Leo Yan <[email protected]>
Quoted 40 lines · Adrian Hunter
From: Wei Li <[email protected]>
In
__cmd_record(), when receiving SIGINT(ctrl + c), a done flag will be set and the event list will be disabled byevlist__disable()once.While in
auxtrace_record.read_finish(), the related events will be enabled again, if they are continuous, the recording seems to be endless.If the
cs_etmevent is disabled, we don't enable it again here.Note: This patch is NOT tested since i don't have such a machine with coresight feature, but the code seems buggy same as arm-spe and intel-pt.
Signed-off-by Wei Li <[email protected]>[ahunter: removed redundant 'else' after 'return']Signed-off-by Adrian Hunter <[email protected]>Cc [email protected] # 5.4+--- tools/perf/arch/arm/util/cs-etm.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)tools/perf/arch/arm/util/cs-etm.c +4
-1@@ -865,9 +865,12 @@ static int cs_etm_read_finish(struct auxtrace_record *itr, int idx)struct evsel *evsel;evlist__for_each_entry (ptr->evlist, evsel) { -if (evsel->core.attr.type == ptr->cs_etm_pmu->type) +if (evsel->core.attr.type == ptr->cs_etm_pmu->type) { +if (evsel->disabled) +return 0 ;return perf_evlist__enable_event_idx (ptr->evlist, evsel, idx); + } }return -EINVAL ;
Re: [PATCH V2 3/5] perf tools: cs-etm: fix endless record after being terminated
In reply to Adrian HunterQuoted 10 lines · Adrian Hunter
From: Wei Li <[email protected]>
In
__cmd_record(), when receiving SIGINT(ctrl + c), a done flag will be set and the event list will be disabled byevlist__disable()once.While in
auxtrace_record.read_finish(), the related events will be enabled again, if they are continuous, the recording seems to be endless.If the
cs_etmevent is disabled, we don't enable it again here.
Quoted 7 lines
Note: This patch is NOT tested since i don't have such a machine with coresight feature, but the code seems buggy same as arm-spe and intel-pt.
Signed-off-by Wei Li <[email protected]>[ahunter: removed redundant 'else' after 'return']Signed-off-by Adrian Hunter <[email protected]>Cc [email protected] # 5.4+
Thanks for looping, Adrian. Applied this patch and tested with CoreSight on juno board, it works well:
Quoted 25 lines
--- tools/perf/arch/arm/util/cs-etm.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)tools/perf/arch/arm/util/cs-etm.c +4
-1@@ -865,9 +865,12 @@ static int cs_etm_read_finish(struct auxtrace_record *itr, int idx)struct evsel *evsel;evlist__for_each_entry (ptr->evlist, evsel) { -if (evsel->core.attr.type == ptr->cs_etm_pmu->type) +if (evsel->core.attr.type == ptr->cs_etm_pmu->type) { +if (evsel->disabled) +return 0 ;return perf_evlist__enable_event_idx (ptr->evlist, evsel, idx); + } }return -EINVAL ;Signature · 1 line
2.17.1
Re: [PATCH V2 3/5] perf tools: cs-etm: fix endless record after being terminated
In reply to Adrian HunterQuoted 26 lines · Adrian Hunter
From: Wei Li <[email protected]>
In
__cmd_record(), when receiving SIGINT(ctrl + c), a done flag will be set and the event list will be disabled byevlist__disable()once.While in
auxtrace_record.read_finish(), the related events will be enabled again, if they are continuous, the recording seems to be endless.If the
cs_etmevent is disabled, we don't enable it again here.Note: This patch is NOT tested since i don't have such a machine with coresight feature, but the code seems buggy same as arm-spe and intel-pt.
Signed-off-by Wei Li <[email protected]>[ahunter: removed redundant 'else' after 'return']Signed-off-by Adrian Hunter <[email protected]>Cc [email protected] # 5.4+--- tools/perf/arch/arm/util/cs-etm.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)tools/perf/arch/arm/util/cs-etm.c +0
-0
tools/perf/arch/arm/util/cs-etm.c static int cs_etm_read_finish(struct auxtrace_record *itr, int idx) · line 873
Quoted 10 lines
tools/perf/arch/arm/util/cs-etm.c +4
-1@@ -865,9 +865,12 @@ static int cs_etm_read_finish(struct auxtrace_record *itr, int idx)struct evsel *evsel;evlist__for_each_entry (ptr->evlist, evsel) { -if (evsel->core.attr.type == ptr->cs_etm_pmu->type) +if (evsel->core.attr.type == ptr->cs_etm_pmu->type) { +if (evsel->disabled) +return 0 ;return perf_evlist__enable_event_idx (ptr->evlist, evsel, idx); + }
Quoted 6 lines
tools/perf/arch/arm/util/cs-etm.c +0
-0}return -EINVAL ;Signature · 1 line
2.17.1
[tip: perf/urgent] perf cs-etm: Fix endless record after being terminated
In reply to Adrian HunterThe following commit has been merged into the perf/urgent branch of tip:
The following commit has been merged into the perf/urgent branch of tip:
Commit-ID: c9f2833cb472cf9e0a49b7bcdc210a96017a7bfd Gitweb: https://git.kernel.org/tip/c9f2833cb472cf9e0a49b7bcdc210a96017a7bfd Author: Wei Li <[email protected]> AuthorDate: Fri, 14 Feb 2020 15:26:52 +02:00 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitterDate: Tue, 18 Feb 2020 10:13:29 -03:00
perf cs-etm: Fix endless record after being terminated
In __cmd_record(), when receiving SIGINT(ctrl + c), a 'done' flag will be set and the event list will be disabled by evlist__disable() once.
While in auxtrace_record.read_finish(), the related events will be enabled again, if they are continuous, the recording seems to be endless.
If the cs_etm event is disabled, we don't enable it again here.
Note: This patch is NOT tested since i don't have such a machine with coresight feature, but the code seems buggy same as arm-spe and intel-pt.
Tester notes:
Thanks for looping, Adrian. Applied this patch and tested with CoreSight on juno board, it works well.
--- tools/perf/arch/arm/util/cs-etm.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
tools/perf/arch/arm/util/cs-etm.c +4 -1
@@ -865,9 +865,12 @@ static int cs_etm_read_finish(struct auxtrace_record *itr, int idx)struct evsel *evsel;evlist__for_each_entry (ptr->evlist, evsel) { -if (evsel->core.attr.type == ptr->cs_etm_pmu->type) +if (evsel->core.attr.type == ptr->cs_etm_pmu->type) { +if (evsel->disabled) +return 0 ;return perf_evlist__enable_event_idx (ptr->evlist, evsel, idx); + } }return -EINVAL ;