Re: [PATCH v2] perf evsel: Don't set sample_regs_intr/sample_regs_user for dummy event

From: Jin, Yao
Date: Wed Jul 29 2020 - 03:23:20 EST


Hi Adrian,

Could you help to check if following condition will break PT?

"(opts->sample_intr_regs && !evsel->no_aux_samples && !evsel__is_dummy_event(evsel))"

Thanks
Jin Yao

On 7/23/2020 9:01 AM, Jin, Yao wrote:
Hi Jiri, Adrian,

On 7/22/2020 7:08 PM, Jiri Olsa wrote:
On Wed, Jul 22, 2020 at 01:00:03PM +0800, Jin, Yao wrote:

SNIP


If we use -IXMM0, the attr>sample_regs_intr will be set with
PERF_REG_EXTENDED_MASK bit.

It doesn't make sense to set attr->sample_regs_intr for a
software dummy event.

This patch adds dummy event checking before setting
attr->sample_regs_intr and attr->sample_regs_user.

After:
ÂÂÂ # ./perf record -e cycles:p -IXMM0 -a -- sleep 1
ÂÂÂ [ perf record: Woken up 1 times to write data ]
ÂÂÂ [ perf record: Captured and wrote 0.413 MB perf.data (45 samples) ]

ÂÂ v2:
ÂÂ ---
ÂÂ Rebase to perf/core

Fixes: 0a892c1c9472 ("perf record: Add dummy event during system wide synthesis")
Signed-off-by: Jin Yao <yao.jin@xxxxxxxxxxxxxxx>
---
ÂÂ tools/perf/util/evsel.c | 6 ++++--
ÂÂ 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
index 9aa51a65593d..11794d3b7879 100644
--- a/tools/perf/util/evsel.c
+++ b/tools/perf/util/evsel.c
@@ -1014,12 +1014,14 @@ void evsel__config(struct evsel *evsel, struct record_opts *opts,
ÂÂÂÂÂÂ if (callchain && callchain->enabled && !evsel->no_aux_samples)
ÂÂÂÂÂÂÂÂÂÂ evsel__config_callchain(evsel, opts, callchain);
-ÂÂÂ if (opts->sample_intr_regs && !evsel->no_aux_samples) {
+ÂÂÂ if (opts->sample_intr_regs && !evsel->no_aux_samples &&
+ÂÂÂÂÂÂÂ !evsel__is_dummy_event(evsel)) {

hum, I thought it'd look something like this:

ÂÂÂ if (opts->sample_intr_regs && (!evsel->no_aux_samples || !evsel__is_dummy_event(evsel))

but I'm not sure how no_aux_samples flag works exactly.. so it might be
correct.. just making sure ;-)

cc-ing Adrian

jirka



no_aux_samples is set to false by default and it's only set to true by pt, right?

So most of the time, !evsel->no_aux_samples is always true.

if (opts->sample_intr_regs && (!evsel->no_aux_samples || !evsel__is_dummy_event(evsel)) {
ÂÂÂÂattr->sample_regs_intr = opts->sample_intr_regs;
ÂÂÂÂevsel__set_sample_bit(evsel, REGS_INTR);
}

So even if the evsel is dummy event, the condition check is true. :(

Or maybe I misunderstand anything?

I was just curious, because I did not follow the no_aux_samples
usage in detail.. so how about a case where:

ÂÂÂ evsel->no_aux_samples == true and evsel__is_dummy_event(evsel) = false

then the original condition will be false for non dummy event

ÂÂ (opts->sample_intr_regs && !evsel->no_aux_samples && !evsel__is_dummy_event(evsel))

is that ok?


I searched the perf source and found the no_aux_samples was only set to true in intel-pt.c. So I assume for the non-pt usage, the no_aux_samples is always false.

For non-pt usage,
(opts->sample_intr_regs && !evsel->no_aux_samples && !evsel__is_dummy_event(evsel)) is equal to
(opts->sample_intr_regs && !evsel__is_dummy_event(evsel))

For pt usage, we need to consider the case that evsel__is_dummy_event(evsel) is true or false.

If evsel__is_dummy_event(evsel) is true:
(opts->sample_intr_regs && !evsel->no_aux_samples && !evsel__is_dummy_event(evsel)) is false.
It's expected.

If evsel__is_dummy_event(evsel) is false:
(opts->sample_intr_regs && !evsel->no_aux_samples && !evsel__is_dummy_event(evsel)) is equal to
(opts->sample_intr_regs && !evsel->no_aux_samples)
That's the current code logic.

So I think the condition "(opts->sample_intr_regs && !evsel->no_aux_samples && !evsel__is_dummy_event(evsel))" looks reasonable.

Adrian, please correct me if I'm wrong here.

Thanks
Jin Yao

jirka