From: Adrian Hunter <adrian.hunter@intel.com>
To: Ian Rogers <irogers@google.com>,
Peter Zijlstra <peterz@infradead.org>,
Ingo Molnar <mingo@redhat.com>,
Arnaldo Carvalho de Melo <acme@kernel.org>,
Namhyung Kim <namhyung@kernel.org>,
Mark Rutland <mark.rutland@arm.com>,
Alexander Shishkin <alexander.shishkin@linux.intel.com>,
Jiri Olsa <jolsa@kernel.org>,
Kan Liang <kan.liang@linux.intel.com>,
John Garry <john.g.garry@oracle.com>,
Will Deacon <will@kernel.org>, James Clark <james.clark@arm.com>,
Mike Leach <mike.leach@linaro.org>, Leo Yan <leo.yan@linux.dev>,
Suzuki K Poulose <suzuki.poulose@arm.com>,
Yicong Yang <yangyicong@hisilicon.com>,
Jonathan Cameron <jonathan.cameron@huawei.com>,
Nick Terrell <terrelln@fb.com>,
Nick Desaulniers <ndesaulniers@google.com>,
Oliver Upton <oliver.upton@linux.dev>,
Anshuman Khandual <anshuman.khandual@arm.com>,
Song Liu <song@kernel.org>,
Ilkka Koskinen <ilkka@os.amperecomputing.com>,
Athira Rajeev <atrajeev@linux.vnet.ibm.com>,
Huacai Chen <chenhuacai@kernel.org>,
Yanteng Si <siyanteng@loongson.cn>,
Sun Haiyong <sunhaiyong@loongson.cn>,
linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org,
linux-arm-kernel@lists.infradead.org
Subject: Re: [PATCH v3 01/28] perf auxtrace: Remove dummy tools
Date: Thu, 11 Jul 2024 09:43:10 +0300 [thread overview]
Message-ID: <d55916c7-a771-4fae-8bc8-595b7b1e9861@intel.com> (raw)
In-Reply-To: <20240629045350.285243-2-irogers@google.com>
On 29/06/24 07:53, 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@google.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 | 30 +++++++++++++++++++++++
> tools/perf/util/session.h | 3 +++
> 6 files changed, 47 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 32818bd7cd17..c53812f343e9 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 0ec92d47373c..44db5b49128f 100644
> --- a/tools/perf/util/session.c
> +++ b/tools/perf/util/session.c
> @@ -1764,6 +1764,36 @@ 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,
> + .size = PERF_ALIGN(sizeof(struct perf_event_attr),
> + sizeof(u64))
> + + sizeof(struct perf_event_header)
> + + sizeof(u64),
> + },
> + },
> + .ids = { id, }
> + },
Nested definitions are not needed. It can just be:
.attr_id.attr.header.type = PERF_RECORD_HEADER_ATTR,
.attr_id.attr.header.size = sizeof(ev.attr_id),
.attr_id.ids[0] = id,
> + };
> +
> + memcpy(&ev.attr_id.attr.attr, attr, min((u32)sizeof(struct perf_event_attr), attr->size));
It is not unreasonable to validate attr->size, but neither slicing
nor padding will work. Better to just return an error:
if (attr->size != sizeof(ev.attr_id.attr))
return -EINVAL;
Then:
ev.attr_id.attr.attr = *attr;
> + ev.attr_id.attr.attr.size = sizeof(struct perf_event_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);
>
next prev parent reply other threads:[~2024-07-11 6:43 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-06-29 4:53 [PATCH v3 00/28] Constify tool pointers Ian Rogers
2024-06-29 4:53 ` [PATCH v3 01/28] perf auxtrace: Remove dummy tools Ian Rogers
2024-07-11 6:43 ` Adrian Hunter [this message]
2024-07-11 6:46 ` Adrian Hunter
2024-07-11 16:08 ` Ian Rogers
2024-06-29 4:53 ` [PATCH v3 02/28] perf s390-cpumsf: Remove unused struct Ian Rogers
2024-06-29 4:53 ` [PATCH v3 03/28] perf cs-etm: Fix address sanitizer dso build failure Ian Rogers
2024-06-29 4:53 ` [PATCH v3 04/28] perf tool: Constify tool pointers Ian Rogers
2024-06-29 4:53 ` [PATCH v3 05/28] perf tool: Move fill defaults into tool.c Ian Rogers
2024-06-29 4:53 ` [PATCH v3 06/28] perf tool: Add perf_tool__init Ian Rogers
2024-06-29 4:53 ` [PATCH v3 07/28] perf kmem: Use perf_tool__init Ian Rogers
2024-06-29 4:53 ` [PATCH v3 08/28] perf buildid-list: " Ian Rogers
2024-06-29 4:53 ` [PATCH v3 09/28] perf kvm: " Ian Rogers
2024-06-29 4:53 ` [PATCH v3 10/28] perf lock: " Ian Rogers
2024-06-29 4:53 ` [PATCH v3 11/28] perf evlist: " Ian Rogers
2024-06-29 4:53 ` [PATCH v3 12/28] perf record: " Ian Rogers
2024-06-29 4:53 ` [PATCH v3 13/28] perf c2c: " Ian Rogers
2024-06-29 4:53 ` [PATCH v3 14/28] perf script: " Ian Rogers
2024-06-29 4:53 ` [PATCH v3 15/28] perf inject: " Ian Rogers
2024-06-29 4:53 ` [PATCH v3 16/28] perf report: " Ian Rogers
2024-06-29 4:53 ` [PATCH v3 17/28] perf stat: " Ian Rogers
2024-06-29 4:53 ` [PATCH v3 18/28] perf annotate: " Ian Rogers
2024-06-29 4:53 ` [PATCH v3 19/28] perf sched: " Ian Rogers
2024-06-29 4:53 ` [PATCH v3 20/28] perf mem: " Ian Rogers
2024-06-29 4:53 ` [PATCH v3 21/28] perf timechart: " Ian Rogers
2024-06-29 4:53 ` [PATCH v3 22/28] perf diff: " Ian Rogers
2024-06-29 4:53 ` [PATCH v3 23/28] perf data convert json: " Ian Rogers
2024-06-29 4:53 ` [PATCH v3 24/28] perf data convert ctf: " Ian Rogers
2024-06-29 4:53 ` [PATCH v3 25/28] perf test event_update: Ensure tools is initialized Ian Rogers
2024-06-29 4:53 ` [PATCH v3 26/28] perf kwork: Use perf_tool__init Ian Rogers
2024-06-29 4:53 ` [PATCH v3 27/28] perf tool: Remove perf_tool__fill_defaults Ian Rogers
2024-06-29 4:53 ` [PATCH v3 28/28] perf session: Constify tool Ian Rogers
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=d55916c7-a771-4fae-8bc8-595b7b1e9861@intel.com \
--to=adrian.hunter@intel.com \
--cc=acme@kernel.org \
--cc=alexander.shishkin@linux.intel.com \
--cc=anshuman.khandual@arm.com \
--cc=atrajeev@linux.vnet.ibm.com \
--cc=chenhuacai@kernel.org \
--cc=ilkka@os.amperecomputing.com \
--cc=irogers@google.com \
--cc=james.clark@arm.com \
--cc=john.g.garry@oracle.com \
--cc=jolsa@kernel.org \
--cc=jonathan.cameron@huawei.com \
--cc=kan.liang@linux.intel.com \
--cc=leo.yan@linux.dev \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-perf-users@vger.kernel.org \
--cc=mark.rutland@arm.com \
--cc=mike.leach@linaro.org \
--cc=mingo@redhat.com \
--cc=namhyung@kernel.org \
--cc=ndesaulniers@google.com \
--cc=oliver.upton@linux.dev \
--cc=peterz@infradead.org \
--cc=siyanteng@loongson.cn \
--cc=song@kernel.org \
--cc=sunhaiyong@loongson.cn \
--cc=suzuki.poulose@arm.com \
--cc=terrelln@fb.com \
--cc=will@kernel.org \
--cc=yangyicong@hisilicon.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).