lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <12d44d96-1fcd-1fdd-64ea-beef40a27d1d@arm.com>
Date:   Thu, 25 Nov 2021 10:21:48 +0000
From:   James Clark <james.clark@....com>
To:     Leo Yan <leo.yan@...aro.org>, German Gomez <german.gomez@....com>
Cc:     linux-kernel@...r.kernel.org, linux-perf-users@...r.kernel.org,
        acme@...nel.org, Mark Rutland <mark.rutland@....com>,
        Alexander Shishkin <alexander.shishkin@...ux.intel.com>,
        Jiri Olsa <jolsa@...hat.com>,
        Namhyung Kim <namhyung@...nel.org>,
        John Garry <john.garry@...wei.com>,
        Will Deacon <will@...nel.org>,
        Mathieu Poirier <mathieu.poirier@...aro.org>,
        linux-arm-kernel@...ts.infradead.org
Subject: Re: [RESEND PATCH 1/1] perf arm-spe: report all SPE records as "all"
 events



On 25/11/2021 07:53, Leo Yan wrote:
> On Wed, Nov 17, 2021 at 02:28:32PM +0000, German Gomez wrote:
>> From: James Clark <james.clark@....com>
>>
>> Currently perf-report and perf-inject are dropping a large number of SPE
>> records because they don't contain any of the existing events, but the
>> contextual information of the records is still useful to keep.
>>
>> The synthesized event "all" is generated for every SPE record that is
>> processed, regardless of whether the record contains interesting events
>> or not. The event can be filtered with the flag "--itrace=o".
>>
>> Signed-off-by: James Clark <james.clark@....com>
>> Signed-off-by: German Gomez <german.gomez@....com>
>> ---
>>  tools/perf/Documentation/itrace.txt |  2 +-
>>  tools/perf/util/arm-spe.c           | 36 +++++++++++++++++++++++++++++
>>  tools/perf/util/auxtrace.h          |  2 +-
>>  3 files changed, 38 insertions(+), 2 deletions(-)
>>
>> diff --git a/tools/perf/Documentation/itrace.txt b/tools/perf/Documentation/itrace.txt
>> index c52755481..57dc12b83 100644
>> --- a/tools/perf/Documentation/itrace.txt
>> +++ b/tools/perf/Documentation/itrace.txt
>> @@ -6,7 +6,7 @@
>>  		w	synthesize ptwrite events
>>  		p	synthesize power events (incl. PSB events for Intel PT)
>>  		o	synthesize other events recorded due to the use
>> -			of aux-output (refer to perf record)
>> +			of aux-output (refer to perf record) (all events for Arm SPE)
>>  		e	synthesize error events
>>  		d	create a debug log
>>  		f	synthesize first level cache events
>> diff --git a/tools/perf/util/arm-spe.c b/tools/perf/util/arm-spe.c
>> index ce77abf90..6428351db 100644
>> --- a/tools/perf/util/arm-spe.c
>> +++ b/tools/perf/util/arm-spe.c
>> @@ -58,6 +58,7 @@ struct arm_spe {
>>  	u8				sample_branch;
>>  	u8				sample_remote_access;
>>  	u8				sample_memory;
>> +	u8				sample_other;
>>  
>>  	u64				l1d_miss_id;
>>  	u64				l1d_access_id;
>> @@ -68,6 +69,7 @@ struct arm_spe {
>>  	u64				branch_miss_id;
>>  	u64				remote_access_id;
>>  	u64				memory_id;
>> +	u64				all_id;
>>  
>>  	u64				kernel_start;
>>  
>> @@ -351,6 +353,23 @@ static int arm_spe__synth_branch_sample(struct arm_spe_queue *speq,
>>  	return arm_spe_deliver_synth_event(spe, speq, event, &sample);
>>  }
>>  
>> +static int arm_spe__synth_other_sample(struct arm_spe_queue *speq,
>> +				       u64 spe_events_id)
>> +{
>> +	struct arm_spe *spe = speq->spe;
>> +	struct arm_spe_record *record = &speq->decoder->record;
>> +	union perf_event *event = speq->event_buf;
>> +	struct perf_sample sample = { .ip = 0, };
>> +
>> +	arm_spe_prep_sample(spe, speq, event, &sample);
>> +
>> +	sample.id = spe_events_id;
>> +	sample.stream_id = spe_events_id;
>> +	sample.addr = record->to_ip;
> 
> After checked the event types, I think "other" samples would include
> below raw event types:

Maybe we should rename some of the functions and variables if there is
confusion, but I think this new group is "all" rather than "other" because
it also includes all the events that would be put in other groups.

> 
>   EV_EXCEPTION_GEN
>   EV_RETIRED
>   EV_NOT_TAKEN
>   EV_ALIGNMENT
>   EV_PARTIAL_PREDICATE
>   EV_EMPTY_PREDICATE
> 
> I am just wander if we can use sample.transaction to store these event
> types, otherwise, we cannot distinguish the event type for the samples.

If we can use the transaction field to distinguish sample types, I'm
wondering why we need the separate groups at all. If this new group
includes all sample types, and they're all labelled, do we need to
continue with the other groups like "tlb-access" and "branch-miss"?

Or does the perf GUI not allow filtering by transaction type?

James

> 
> And it's good fill more sample fields for complete info, like:
> 
>   sample.addr = record->virt_addr;
>   sample.phys_addr = record->phys_addr;
>   sample.data_src = data_src;
> 
> Thanks,
> Leo
> 
>> +
>> +	return arm_spe_deliver_synth_event(spe, speq, event, &sample);
>> +}
>> +
>>  #define SPE_MEM_TYPE	(ARM_SPE_L1D_ACCESS | ARM_SPE_L1D_MISS | \
>>  			 ARM_SPE_LLC_ACCESS | ARM_SPE_LLC_MISS | \
>>  			 ARM_SPE_REMOTE_ACCESS)
>> @@ -480,6 +499,12 @@ static int arm_spe_sample(struct arm_spe_queue *speq)
>>  			return err;
>>  	}
>>  
>> +	if (spe->sample_other) {
>> +		err = arm_spe__synth_other_sample(speq, spe->all_id);
>> +		if (err)
>> +			return err;
>> +	}
>> +
>>  	return 0;
>>  }
>>  
>> @@ -1107,6 +1132,17 @@ arm_spe_synth_events(struct arm_spe *spe, struct perf_session *session)
>>  			return err;
>>  		spe->memory_id = id;
>>  		arm_spe_set_event_name(evlist, id, "memory");
>> +		id += 1;
>> +	}
>> +
>> +	if (spe->synth_opts.other_events) {
>> +		spe->sample_other = true;
>> +
>> +		err = arm_spe_synth_event(session, &attr, id);
>> +		if (err)
>> +			return err;
>> +		spe->all_id = id;
>> +		arm_spe_set_event_name(evlist, id, "all");
>>  	}
>>  
>>  	return 0;
>> diff --git a/tools/perf/util/auxtrace.h b/tools/perf/util/auxtrace.h
>> index bbf0d78c6..efe1bdc06 100644
>> --- a/tools/perf/util/auxtrace.h
>> +++ b/tools/perf/util/auxtrace.h
>> @@ -74,7 +74,7 @@ enum itrace_period_type {
>>   * @ptwrites: whether to synthesize events for ptwrites
>>   * @pwr_events: whether to synthesize power events
>>   * @other_events: whether to synthesize other events recorded due to the use of
>> - *                aux_output
>> + *                aux_output (all events for Arm SPE)
>>   * @errors: whether to synthesize decoder error events
>>   * @dont_decode: whether to skip decoding entirely
>>   * @log: write a decoding log
>> -- 
>> 2.25.1
>>

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ