From: Jiri Olsa <olsajiri@gmail.com>
To: Namhyung Kim <namhyung@kernel.org>
Cc: Arnaldo Carvalho de Melo <acme@kernel.org>,
LKML <linux-kernel@vger.kernel.org>,
Ian Rogers <irogers@google.com>,
linux-perf-users@vger.kernel.org
Subject: Re: [PATCH 2/4] tools lib perf: Handle read format in perf_evsel__read()
Date: Tue, 16 Aug 2022 15:19:20 +0200 [thread overview]
Message-ID: <YvuZWAzsBVo/l9sf@krava> (raw)
In-Reply-To: <20220815190106.1293082-3-namhyung@kernel.org>
On Mon, Aug 15, 2022 at 12:01:04PM -0700, Namhyung Kim wrote:
> The perf_counts_values should be increased to read the new lost data.
> Also adjust values after read according the read format.
>
> This supports PERF_FORMAT_GROUP which has a different data format but
> it's only available for leader events. Currently it doesn't have an API
> to read sibling (member) events in the group. But users may read the
> sibling event directly.
>
> Also reading from mmap would be disabled when the read format has ID or
> LOST bit as it's not exposed via mmap.
>
> Signed-off-by: Namhyung Kim <namhyung@kernel.org>
> ---
> tools/lib/perf/evsel.c | 72 +++++++++++++++++++++++++++++
> tools/lib/perf/include/perf/event.h | 3 +-
> tools/lib/perf/include/perf/evsel.h | 4 +-
> 3 files changed, 77 insertions(+), 2 deletions(-)
>
> diff --git a/tools/lib/perf/evsel.c b/tools/lib/perf/evsel.c
> index 952f3520d5c2..fc23670231cb 100644
> --- a/tools/lib/perf/evsel.c
> +++ b/tools/lib/perf/evsel.c
> @@ -305,6 +305,9 @@ int perf_evsel__read_size(struct perf_evsel *evsel)
> if (read_format & PERF_FORMAT_ID)
> entry += sizeof(u64);
>
> + if (read_format & PERF_FORMAT_LOST)
> + entry += sizeof(u64);
> +
> if (read_format & PERF_FORMAT_GROUP) {
> nr = evsel->nr_members;
> size += sizeof(u64);
> @@ -314,24 +317,93 @@ int perf_evsel__read_size(struct perf_evsel *evsel)
> return size;
> }
>
> +/* This only reads values for the leader */
> +static int perf_evsel__read_group(struct perf_evsel *evsel, int cpu_map_idx,
> + int thread, struct perf_counts_values *count)
> +{
> + size_t size = perf_evsel__read_size(evsel);
> + int *fd = FD(evsel, cpu_map_idx, thread);
> + u64 read_format = evsel->attr.read_format;
> + u64 *data;
> + int idx = 1;
> +
> + if (fd == NULL || *fd < 0)
> + return -EINVAL;
> +
> + data = calloc(1, size);
> + if (data == NULL)
> + return -ENOMEM;
> +
> + if (readn(*fd, data, size) <= 0) {
> + free(data);
> + return -errno;
> + }
could you please put in here some comment that this is intentionaly
reading only the leader or better yet rename the function? I was lost
before I got to read the changelog ;-)
> +
> + if (read_format & PERF_FORMAT_TOTAL_TIME_ENABLED)
> + count->ena = data[idx++];
> + if (read_format & PERF_FORMAT_TOTAL_TIME_RUNNING)
> + count->run = data[idx++];
> +
> + /* value is always available */
> + count->val = data[idx++];
> + if (read_format & PERF_FORMAT_ID)
> + count->id = data[idx++];
> + if (read_format & PERF_FORMAT_LOST)
> + count->lost = data[idx++];
> +
> + free(data);
> + return 0;
> +}
> +
> +/*
> + * The perf read format is very flexible. It needs to set the proper
> + * values according to the read format.
> + */
> +static void perf_evsel__adjust_values(struct perf_evsel *evsel,
> + struct perf_counts_values *count)
> +{
> + u64 read_format = evsel->attr.read_format;
> +
> + if (!(read_format & PERF_FORMAT_TOTAL_TIME_ENABLED)) {
> + memmove(&count->values[2], &count->values[1], 24);
> + count->ena = 0;
> + }
> +
> + if (!(read_format & PERF_FORMAT_TOTAL_TIME_RUNNING)) {
> + memmove(&count->values[3], &count->values[2], 16);
> + count->run = 0;
> + }
> +
> + if (!(read_format & PERF_FORMAT_ID)) {
> + memmove(&count->values[4], &count->values[3], 8);
> + count->id = 0;
> + }
> +}
could we do this the same way we read group counters.. like make read
into local buffer and initialize perf_counts_values values based on
format, something like:
readn(fd, data ...
if (read_format & PERF_FORMAT_TOTAL_TIME_ENABLED)
count->ena = data[idx++];
if (read_format & PERF_FORMAT_TOTAL_TIME_RUNNING)
count->run = data[idx++];
/* value is always available */
count->val = data[idx++];
if (read_format & PERF_FORMAT_ID)
count->id = data[idx++];
if (read_format & PERF_FORMAT_LOST)
count->lost = data[idx++];
and perhaps we should cancel that perf_counts_values's union and keep
only 'val/ena/run...' fields?
jirka
next prev parent reply other threads:[~2022-08-16 13:20 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-08-15 19:01 [PATCH 0/4] perf tools: Support reading PERF_FORMAT_LOST Namhyung Kim
2022-08-15 19:01 ` [PATCH 1/4] tools headers UAPI: Sync linux/perf_event.h with the kernel sources Namhyung Kim
2022-08-15 19:01 ` [PATCH 2/4] tools lib perf: Handle read format in perf_evsel__read() Namhyung Kim
2022-08-16 13:19 ` Jiri Olsa [this message]
2022-08-16 20:03 ` Arnaldo Carvalho de Melo
2022-08-16 21:54 ` Namhyung Kim
2022-08-15 19:01 ` [PATCH 3/4] tools lib perf: Add a test case for read formats Namhyung Kim
2022-08-15 19:01 ` [PATCH 4/4] perf tools: Support reading PERF_FORMAT_LOST Namhyung Kim
2022-08-16 20:01 ` [PATCH 0/4] " Arnaldo Carvalho de Melo
-- strict thread matches above, loose matches on Subject: below --
2022-08-16 22:17 [PATCH 0/4] perf tools: Support reading PERF_FORMAT_LOST (v2) Namhyung Kim
2022-08-16 22:17 ` [PATCH 2/4] tools lib perf: Handle read format in perf_evsel__read() Namhyung Kim
2022-08-19 0:36 [PATCH 0/4] perf tools: Support reading PERF_FORMAT_LOST (v3) Namhyung Kim
2022-08-19 0:36 ` [PATCH 2/4] tools lib perf: Handle read format in perf_evsel__read() Namhyung Kim
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=YvuZWAzsBVo/l9sf@krava \
--to=olsajiri@gmail.com \
--cc=acme@kernel.org \
--cc=irogers@google.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-perf-users@vger.kernel.org \
--cc=namhyung@kernel.org \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.