Re: [PATCH v11 08/24] perf record: Introduce data file at mmap buffer object

From: Jiri Olsa
Date: Sun Sep 12 2021 - 16:46:19 EST


On Tue, Aug 17, 2021 at 11:23:11AM +0300, Alexey Bayduraev wrote:
> Introduce data file and compressor objects into mmap object so
> they could be used to process and store data stream from the
> corresponding kernel data buffer. Make use of the introduced
> per mmap file and compressor when they are initialized and
> available.
>
> Acked-by: Andi Kleen <ak@xxxxxxxxxxxxxxx>
> Acked-by: Namhyung Kim <namhyung@xxxxxxxxx>
> Signed-off-by: Alexey Bayduraev <alexey.v.bayduraev@xxxxxxxxxxxxxxx>
> ---
> tools/perf/builtin-record.c | 3 +++
> tools/perf/util/mmap.c | 10 ++++++++++
> tools/perf/util/mmap.h | 3 +++
> 3 files changed, 16 insertions(+)
>
> diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
> index fb1c1b46dd04..eff6f8db60b2 100644
> --- a/tools/perf/builtin-record.c
> +++ b/tools/perf/builtin-record.c
> @@ -197,6 +197,9 @@ static int record__write(struct record *rec, struct mmap *map __maybe_unused,
> {
> struct perf_data_file *file = &rec->session->data->file;
>
> + if (map && map->file)
> + file = map->file;

I understand this change, but not sure how it's related to the changes
below, should this be separated? also should this change be part of the
patch where we actually set map->file?

jirka

> +
> if (perf_data_file__write(file, bf, size) < 0) {
> pr_err("failed to write perf data, error: %m\n");
> return -1;
> diff --git a/tools/perf/util/mmap.c b/tools/perf/util/mmap.c
> index ab7108d22428..b693b828a840 100644
> --- a/tools/perf/util/mmap.c
> +++ b/tools/perf/util/mmap.c
> @@ -230,6 +230,10 @@ void mmap__munmap(struct mmap *map)
> {
> bitmap_free(map->affinity_mask.bits);
>
> +#ifndef PYTHON_PERF
> + zstd_fini(&map->zstd_data);
> +#endif
> +
> perf_mmap__aio_munmap(map);
> if (map->data != NULL) {
> munmap(map->data, mmap__mmap_len(map));
> @@ -291,6 +295,12 @@ int mmap__mmap(struct mmap *map, struct mmap_params *mp, int fd, int cpu)
> map->core.flush = mp->flush;
>
> map->comp_level = mp->comp_level;
> +#ifndef PYTHON_PERF
> + if (zstd_init(&map->zstd_data, map->comp_level)) {
> + pr_debug2("failed to init mmap commpressor, error %d\n", errno);
> + return -1;
> + }
> +#endif
>
> if (map->comp_level && !perf_mmap__aio_enabled(map)) {
> map->data = mmap(NULL, mmap__mmap_len(map), PROT_READ|PROT_WRITE,
> diff --git a/tools/perf/util/mmap.h b/tools/perf/util/mmap.h
> index 9d5f589f02ae..c4aed6e89549 100644
> --- a/tools/perf/util/mmap.h
> +++ b/tools/perf/util/mmap.h
> @@ -13,6 +13,7 @@
> #endif
> #include "auxtrace.h"
> #include "event.h"
> +#include "util/compress.h"
>
> struct aiocb;
>
> @@ -43,6 +44,8 @@ struct mmap {
> struct mmap_cpu_mask affinity_mask;
> void *data;
> int comp_level;
> + struct perf_data_file *file;
> + struct zstd_data zstd_data;
> };
>
> struct mmap_params {
> --
> 2.19.0
>