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: <bf43b04b-badd-44dc-97de-3e6f11cded4f@intel.com>
Date: Tue, 16 Jul 2024 11:43:01 +0300
From: Adrian Hunter <adrian.hunter@...el.com>
To: Ian Rogers <irogers@...gle.com>, Peter Zijlstra <peterz@...radead.org>,
 Ingo Molnar <mingo@...hat.com>, Arnaldo Carvalho de Melo <acme@...nel.org>,
 Namhyung Kim <namhyung@...nel.org>, Mark Rutland <mark.rutland@....com>,
 Alexander Shishkin <alexander.shishkin@...ux.intel.com>,
 Jiri Olsa <jolsa@...nel.org>, Kan Liang <kan.liang@...ux.intel.com>,
 John Garry <john.g.garry@...cle.com>, Will Deacon <will@...nel.org>,
 James Clark <james.clark@....com>, Mike Leach <mike.leach@...aro.org>,
 Leo Yan <leo.yan@...ux.dev>, Suzuki K Poulose <suzuki.poulose@....com>,
 Yicong Yang <yangyicong@...ilicon.com>,
 Jonathan Cameron <jonathan.cameron@...wei.com>,
 Nick Terrell <terrelln@...com>, Nick Desaulniers <ndesaulniers@...gle.com>,
 Oliver Upton <oliver.upton@...ux.dev>,
 Anshuman Khandual <anshuman.khandual@....com>, Song Liu <song@...nel.org>,
 Ilkka Koskinen <ilkka@...amperecomputing.com>,
 Athira Rajeev <atrajeev@...ux.vnet.ibm.com>,
 Huacai Chen <chenhuacai@...nel.org>, Yanteng Si <siyanteng@...ngson.cn>,
 Sun Haiyong <sunhaiyong@...ngson.cn>, linux-kernel@...r.kernel.org,
 linux-perf-users@...r.kernel.org, linux-arm-kernel@...ts.infradead.org
Subject: Re: [PATCH v5 01/27] perf auxtrace: Remove dummy tools

On 12/07/24 21:10, Ian Rogers wrote:
> Add perf_session__deliver_synth_attr_event that synthesizes a
> perf_record_header_attr event with one id. Remove use of
> perf_event__synthesize_attr that necessitates the use of the dummy
> tool in order to pass the session.
> 
> Signed-off-by: Ian Rogers <irogers@...gle.com>

Reviewed-by: Adrian Hunter <adrian.hunter@...el.com>

For pt/bts:

Tested-by: Adrian Hunter <adrian.hunter@...el.com>

> ---
>  tools/perf/util/arm-spe.c   | 49 ++++++++-----------------------------
>  tools/perf/util/cs-etm.c    | 33 ++-----------------------
>  tools/perf/util/intel-bts.c | 31 +----------------------
>  tools/perf/util/intel-pt.c  | 24 +-----------------
>  tools/perf/util/session.c   | 24 ++++++++++++++++++
>  tools/perf/util/session.h   |  3 +++
>  6 files changed, 41 insertions(+), 123 deletions(-)
> 
> diff --git a/tools/perf/util/arm-spe.c b/tools/perf/util/arm-spe.c
> index afbd5869f6bf..fa40f3cb6266 100644
> --- a/tools/perf/util/arm-spe.c
> +++ b/tools/perf/util/arm-spe.c
> @@ -1073,35 +1073,6 @@ static void arm_spe_print_info(__u64 *arr)
>  	fprintf(stdout, arm_spe_info_fmts[ARM_SPE_PMU_TYPE], arr[ARM_SPE_PMU_TYPE]);
>  }
>  
> -struct arm_spe_synth {
> -	struct perf_tool dummy_tool;
> -	struct perf_session *session;
> -};
> -
> -static int arm_spe_event_synth(struct perf_tool *tool,
> -			       union perf_event *event,
> -			       struct perf_sample *sample __maybe_unused,
> -			       struct machine *machine __maybe_unused)
> -{
> -	struct arm_spe_synth *arm_spe_synth =
> -		      container_of(tool, struct arm_spe_synth, dummy_tool);
> -
> -	return perf_session__deliver_synth_event(arm_spe_synth->session,
> -						 event, NULL);
> -}
> -
> -static int arm_spe_synth_event(struct perf_session *session,
> -			       struct perf_event_attr *attr, u64 id)
> -{
> -	struct arm_spe_synth arm_spe_synth;
> -
> -	memset(&arm_spe_synth, 0, sizeof(struct arm_spe_synth));
> -	arm_spe_synth.session = session;
> -
> -	return perf_event__synthesize_attr(&arm_spe_synth.dummy_tool, attr, 1,
> -					   &id, arm_spe_event_synth);
> -}
> -
>  static void arm_spe_set_event_name(struct evlist *evlist, u64 id,
>  				    const char *name)
>  {
> @@ -1172,7 +1143,7 @@ arm_spe_synth_events(struct arm_spe *spe, struct perf_session *session)
>  		spe->sample_flc = true;
>  
>  		/* Level 1 data cache miss */
> -		err = arm_spe_synth_event(session, &attr, id);
> +		err = perf_session__deliver_synth_attr_event(session, &attr, id);
>  		if (err)
>  			return err;
>  		spe->l1d_miss_id = id;
> @@ -1180,7 +1151,7 @@ arm_spe_synth_events(struct arm_spe *spe, struct perf_session *session)
>  		id += 1;
>  
>  		/* Level 1 data cache access */
> -		err = arm_spe_synth_event(session, &attr, id);
> +		err = perf_session__deliver_synth_attr_event(session, &attr, id);
>  		if (err)
>  			return err;
>  		spe->l1d_access_id = id;
> @@ -1192,7 +1163,7 @@ arm_spe_synth_events(struct arm_spe *spe, struct perf_session *session)
>  		spe->sample_llc = true;
>  
>  		/* Last level cache miss */
> -		err = arm_spe_synth_event(session, &attr, id);
> +		err = perf_session__deliver_synth_attr_event(session, &attr, id);
>  		if (err)
>  			return err;
>  		spe->llc_miss_id = id;
> @@ -1200,7 +1171,7 @@ arm_spe_synth_events(struct arm_spe *spe, struct perf_session *session)
>  		id += 1;
>  
>  		/* Last level cache access */
> -		err = arm_spe_synth_event(session, &attr, id);
> +		err = perf_session__deliver_synth_attr_event(session, &attr, id);
>  		if (err)
>  			return err;
>  		spe->llc_access_id = id;
> @@ -1212,7 +1183,7 @@ arm_spe_synth_events(struct arm_spe *spe, struct perf_session *session)
>  		spe->sample_tlb = true;
>  
>  		/* TLB miss */
> -		err = arm_spe_synth_event(session, &attr, id);
> +		err = perf_session__deliver_synth_attr_event(session, &attr, id);
>  		if (err)
>  			return err;
>  		spe->tlb_miss_id = id;
> @@ -1220,7 +1191,7 @@ arm_spe_synth_events(struct arm_spe *spe, struct perf_session *session)
>  		id += 1;
>  
>  		/* TLB access */
> -		err = arm_spe_synth_event(session, &attr, id);
> +		err = perf_session__deliver_synth_attr_event(session, &attr, id);
>  		if (err)
>  			return err;
>  		spe->tlb_access_id = id;
> @@ -1232,7 +1203,7 @@ arm_spe_synth_events(struct arm_spe *spe, struct perf_session *session)
>  		spe->sample_branch = true;
>  
>  		/* Branch miss */
> -		err = arm_spe_synth_event(session, &attr, id);
> +		err = perf_session__deliver_synth_attr_event(session, &attr, id);
>  		if (err)
>  			return err;
>  		spe->branch_miss_id = id;
> @@ -1244,7 +1215,7 @@ arm_spe_synth_events(struct arm_spe *spe, struct perf_session *session)
>  		spe->sample_remote_access = true;
>  
>  		/* Remote access */
> -		err = arm_spe_synth_event(session, &attr, id);
> +		err = perf_session__deliver_synth_attr_event(session, &attr, id);
>  		if (err)
>  			return err;
>  		spe->remote_access_id = id;
> @@ -1255,7 +1226,7 @@ arm_spe_synth_events(struct arm_spe *spe, struct perf_session *session)
>  	if (spe->synth_opts.mem) {
>  		spe->sample_memory = true;
>  
> -		err = arm_spe_synth_event(session, &attr, id);
> +		err = perf_session__deliver_synth_attr_event(session, &attr, id);
>  		if (err)
>  			return err;
>  		spe->memory_id = id;
> @@ -1276,7 +1247,7 @@ arm_spe_synth_events(struct arm_spe *spe, struct perf_session *session)
>  		attr.config = PERF_COUNT_HW_INSTRUCTIONS;
>  		attr.sample_period = spe->synth_opts.period;
>  		spe->instructions_sample_period = attr.sample_period;
> -		err = arm_spe_synth_event(session, &attr, id);
> +		err = perf_session__deliver_synth_attr_event(session, &attr, id);
>  		if (err)
>  			return err;
>  		spe->instructions_id = id;
> diff --git a/tools/perf/util/cs-etm.c b/tools/perf/util/cs-etm.c
> index 5e9fbcfad7d4..7fd976ea954b 100644
> --- a/tools/perf/util/cs-etm.c
> +++ b/tools/perf/util/cs-etm.c
> @@ -1595,35 +1595,6 @@ static int cs_etm__synth_branch_sample(struct cs_etm_queue *etmq,
>  	return ret;
>  }
>  
> -struct cs_etm_synth {
> -	struct perf_tool dummy_tool;
> -	struct perf_session *session;
> -};
> -
> -static int cs_etm__event_synth(struct perf_tool *tool,
> -			       union perf_event *event,
> -			       struct perf_sample *sample __maybe_unused,
> -			       struct machine *machine __maybe_unused)
> -{
> -	struct cs_etm_synth *cs_etm_synth =
> -		      container_of(tool, struct cs_etm_synth, dummy_tool);
> -
> -	return perf_session__deliver_synth_event(cs_etm_synth->session,
> -						 event, NULL);
> -}
> -
> -static int cs_etm__synth_event(struct perf_session *session,
> -			       struct perf_event_attr *attr, u64 id)
> -{
> -	struct cs_etm_synth cs_etm_synth;
> -
> -	memset(&cs_etm_synth, 0, sizeof(struct cs_etm_synth));
> -	cs_etm_synth.session = session;
> -
> -	return perf_event__synthesize_attr(&cs_etm_synth.dummy_tool, attr, 1,
> -					   &id, cs_etm__event_synth);
> -}
> -
>  static int cs_etm__synth_events(struct cs_etm_auxtrace *etm,
>  				struct perf_session *session)
>  {
> @@ -1675,7 +1646,7 @@ static int cs_etm__synth_events(struct cs_etm_auxtrace *etm,
>  		attr.config = PERF_COUNT_HW_BRANCH_INSTRUCTIONS;
>  		attr.sample_period = 1;
>  		attr.sample_type |= PERF_SAMPLE_ADDR;
> -		err = cs_etm__synth_event(session, &attr, id);
> +		err = perf_session__deliver_synth_attr_event(session, &attr, id);
>  		if (err)
>  			return err;
>  		etm->branches_sample_type = attr.sample_type;
> @@ -1698,7 +1669,7 @@ static int cs_etm__synth_events(struct cs_etm_auxtrace *etm,
>  		attr.config = PERF_COUNT_HW_INSTRUCTIONS;
>  		attr.sample_period = etm->synth_opts.period;
>  		etm->instructions_sample_period = attr.sample_period;
> -		err = cs_etm__synth_event(session, &attr, id);
> +		err = perf_session__deliver_synth_attr_event(session, &attr, id);
>  		if (err)
>  			return err;
>  		etm->instructions_sample_type = attr.sample_type;
> diff --git a/tools/perf/util/intel-bts.c b/tools/perf/util/intel-bts.c
> index ec1b3bd9f530..160d346cb450 100644
> --- a/tools/perf/util/intel-bts.c
> +++ b/tools/perf/util/intel-bts.c
> @@ -737,35 +737,6 @@ static bool intel_bts_evsel_is_auxtrace(struct perf_session *session,
>  	return evsel->core.attr.type == bts->pmu_type;
>  }
>  
> -struct intel_bts_synth {
> -	struct perf_tool dummy_tool;
> -	struct perf_session *session;
> -};
> -
> -static int intel_bts_event_synth(struct perf_tool *tool,
> -				 union perf_event *event,
> -				 struct perf_sample *sample __maybe_unused,
> -				 struct machine *machine __maybe_unused)
> -{
> -	struct intel_bts_synth *intel_bts_synth =
> -			container_of(tool, struct intel_bts_synth, dummy_tool);
> -
> -	return perf_session__deliver_synth_event(intel_bts_synth->session,
> -						 event, NULL);
> -}
> -
> -static int intel_bts_synth_event(struct perf_session *session,
> -				 struct perf_event_attr *attr, u64 id)
> -{
> -	struct intel_bts_synth intel_bts_synth;
> -
> -	memset(&intel_bts_synth, 0, sizeof(struct intel_bts_synth));
> -	intel_bts_synth.session = session;
> -
> -	return perf_event__synthesize_attr(&intel_bts_synth.dummy_tool, attr, 1,
> -					   &id, intel_bts_event_synth);
> -}
> -
>  static int intel_bts_synth_events(struct intel_bts *bts,
>  				  struct perf_session *session)
>  {
> @@ -814,7 +785,7 @@ static int intel_bts_synth_events(struct intel_bts *bts,
>  		attr.sample_type |= PERF_SAMPLE_ADDR;
>  		pr_debug("Synthesizing 'branches' event with id %" PRIu64 " sample type %#" PRIx64 "\n",
>  			 id, (u64)attr.sample_type);
> -		err = intel_bts_synth_event(session, &attr, id);
> +		err = perf_session__deliver_synth_attr_event(session, &attr, id);
>  		if (err) {
>  			pr_err("%s: failed to synthesize 'branches' event type\n",
>  			       __func__);
> diff --git a/tools/perf/util/intel-pt.c b/tools/perf/util/intel-pt.c
> index d6d7b7512505..1fc03bfd14c3 100644
> --- a/tools/perf/util/intel-pt.c
> +++ b/tools/perf/util/intel-pt.c
> @@ -3659,37 +3659,15 @@ static int intel_pt_queue_data(struct perf_session *session,
>  					   data_offset, timestamp);
>  }
>  
> -struct intel_pt_synth {
> -	struct perf_tool dummy_tool;
> -	struct perf_session *session;
> -};
> -
> -static int intel_pt_event_synth(struct perf_tool *tool,
> -				union perf_event *event,
> -				struct perf_sample *sample __maybe_unused,
> -				struct machine *machine __maybe_unused)
> -{
> -	struct intel_pt_synth *intel_pt_synth =
> -			container_of(tool, struct intel_pt_synth, dummy_tool);
> -
> -	return perf_session__deliver_synth_event(intel_pt_synth->session, event,
> -						 NULL);
> -}
> -
>  static int intel_pt_synth_event(struct perf_session *session, const char *name,
>  				struct perf_event_attr *attr, u64 id)
>  {
> -	struct intel_pt_synth intel_pt_synth;
>  	int err;
>  
>  	pr_debug("Synthesizing '%s' event with id %" PRIu64 " sample type %#" PRIx64 "\n",
>  		 name, id, (u64)attr->sample_type);
>  
> -	memset(&intel_pt_synth, 0, sizeof(struct intel_pt_synth));
> -	intel_pt_synth.session = session;
> -
> -	err = perf_event__synthesize_attr(&intel_pt_synth.dummy_tool, attr, 1,
> -					  &id, intel_pt_event_synth);
> +	err = perf_session__deliver_synth_attr_event(session, attr, id);
>  	if (err)
>  		pr_err("%s: failed to synthesize '%s' event type\n",
>  		       __func__, name);
> diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c
> index 5596bed1b8c8..18a8f4a84045 100644
> --- a/tools/perf/util/session.c
> +++ b/tools/perf/util/session.c
> @@ -1764,6 +1764,30 @@ int perf_session__deliver_synth_event(struct perf_session *session,
>  	return machines__deliver_event(&session->machines, evlist, event, sample, tool, 0, NULL);
>  }
>  
> +int perf_session__deliver_synth_attr_event(struct perf_session *session,
> +					   const struct perf_event_attr *attr,
> +					   u64 id)
> +{
> +	union {
> +		struct {
> +			struct perf_record_header_attr attr;
> +			u64 ids[1];
> +		} attr_id;
> +		union perf_event ev;
> +	} ev = {
> +		.attr_id.attr.header.type = PERF_RECORD_HEADER_ATTR,
> +		.attr_id.attr.header.size = sizeof(ev.attr_id),
> +		.attr_id.ids[0] = id,
> +	};
> +
> +	if (attr->size != sizeof(ev.attr_id.attr.attr)) {
> +		pr_debug("Unexpected perf_event_attr size\n");
> +		return -EINVAL;
> +	}
> +	ev.attr_id.attr.attr = *attr;
> +	return perf_session__deliver_synth_event(session, &ev.ev, NULL);
> +}
> +
>  static void event_swap(union perf_event *event, bool sample_id_all)
>  {
>  	perf_event__swap_op swap;
> diff --git a/tools/perf/util/session.h b/tools/perf/util/session.h
> index 4c29dc86956f..cc28976bb00e 100644
> --- a/tools/perf/util/session.h
> +++ b/tools/perf/util/session.h
> @@ -154,6 +154,9 @@ extern volatile int session_done;
>  int perf_session__deliver_synth_event(struct perf_session *session,
>  				      union perf_event *event,
>  				      struct perf_sample *sample);
> +int perf_session__deliver_synth_attr_event(struct perf_session *session,
> +					   const struct perf_event_attr *attr,
> +					   u64 id);
>  
>  int perf_session__dsos_hit_all(struct perf_session *session);
>  


Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ