[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20200312143152.GA28601@kernel.org>
Date: Thu, 12 Mar 2020 11:31:52 -0300
From: Arnaldo Carvalho de Melo <arnaldo.melo@...il.com>
To: Alexey Budankov <alexey.budankov@...ux.intel.com>
Cc: Jiri Olsa <jolsa@...hat.com>, Namhyung Kim <namhyung@...nel.org>,
Alexander Shishkin <alexander.shishkin@...ux.intel.com>,
Peter Zijlstra <peterz@...radead.org>,
Ingo Molnar <mingo@...hat.com>,
Andi Kleen <ak@...ux.intel.com>,
linux-kernel <linux-kernel@...r.kernel.org>
Subject: Re: [PATCH v1] perf record: fix binding of AIO user space buffers to
nodes
Em Thu, Mar 12, 2020 at 03:21:45PM +0300, Alexey Budankov escreveu:
>
> Correct maxnode parameter value passed to mbind() syscall to be
> the amount of node mask bits to analyze plus 1. Dynamically allocate
> node mask memory depending on the index of node of cpu being profiled.
> Fixes: c44a8b44ca9f ("perf record: Bind the AIO user space buffers to nodes")
> Signed-off-by: Alexey Budankov <alexey.budankov@...ux.intel.com>
> ---
> tools/perf/util/mmap.c | 21 +++++++++++++++------
> 1 file changed, 15 insertions(+), 6 deletions(-)
>
> diff --git a/tools/perf/util/mmap.c b/tools/perf/util/mmap.c
> index 3b664fa673a6..6d604cd67a95 100644
> --- a/tools/perf/util/mmap.c
> +++ b/tools/perf/util/mmap.c
> @@ -98,20 +98,29 @@ static int perf_mmap__aio_bind(struct mmap *map, int idx, int cpu, int affinity)
> {
> void *data;
> size_t mmap_len;
> - unsigned long node_mask;
> + unsigned long *node_mask;
> + unsigned long node_index;
> + int err = 0;
>
> if (affinity != PERF_AFFINITY_SYS && cpu__max_node() > 1) {
> data = map->aio.data[idx];
> mmap_len = mmap__mmap_len(map);
> - node_mask = 1UL << cpu__get_node(cpu);
> - if (mbind(data, mmap_len, MPOL_BIND, &node_mask, 1, 0)) {
> - pr_err("Failed to bind [%p-%p] AIO buffer to node %d: error %m\n",
> - data, data + mmap_len, cpu__get_node(cpu));
> + node_index = cpu__get_node(cpu);
> + node_mask = bitmap_alloc(node_index + 1);
> + if (!node_mask) {
> + pr_err("Failed to allocate node mask for mbind: error %m\n");
> return -1;
> }
> + set_bit(node_index, node_mask);
> + if (mbind(data, mmap_len, MPOL_BIND, node_mask, node_index + 1 + 1/*nr_bits + 1*/, 0)) {
^^^^^^^^^^^^^^
Leftover?
> + pr_err("Failed to bind [%p-%p] AIO buffer to node %lu: error %m\n",
> + data, data + mmap_len, node_index);
> + err = -1;
> + }
> + bitmap_free(node_mask);
> }
>
> - return 0;
> + return err;
> }
> #else /* !HAVE_LIBNUMA_SUPPORT */
> static int perf_mmap__aio_alloc(struct mmap *map, int idx)
> --
> 2.24.1
>
--
- Arnaldo
Powered by blists - more mailing lists