From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.0 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_PASS,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 3344BC282C4 for ; Mon, 4 Feb 2019 19:47:13 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 0867F2175B for ; Mon, 4 Feb 2019 19:47:12 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726813AbfBDTrL (ORCPT ); Mon, 4 Feb 2019 14:47:11 -0500 Received: from mga07.intel.com ([134.134.136.100]:27787 "EHLO mga07.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725854AbfBDTrL (ORCPT ); Mon, 4 Feb 2019 14:47:11 -0500 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by orsmga105.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 04 Feb 2019 11:47:10 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.56,560,1539673200"; d="scan'208";a="144131900" Received: from linux.intel.com ([10.54.29.200]) by fmsmga001.fm.intel.com with ESMTP; 04 Feb 2019 11:47:09 -0800 Received: from [10.252.27.94] (abudanko-mobl.ccr.corp.intel.com [10.252.27.94]) by linux.intel.com (Postfix) with ESMTP id 4A87D5800E0; Mon, 4 Feb 2019 11:47:07 -0800 (PST) Subject: Re: [PATCH v5 2/4] perf record: bind the AIO user space buffers to nodes To: Arnaldo Carvalho de Melo Cc: Ingo Molnar , Peter Zijlstra , Jiri Olsa , Namhyung Kim , Alexander Shishkin , Andi Kleen , linux-kernel References: <5a5adebc-afe0-4806-81cd-180d49ec043f@linux.intel.com> <20190204192910.GK5593@kernel.org> From: Alexey Budankov Organization: Intel Corp. Message-ID: <62d94ac3-45ac-c4e4-0f9e-1084c4a25b83@linux.intel.com> Date: Mon, 4 Feb 2019 22:47:03 +0300 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:60.0) Gecko/20100101 Thunderbird/60.5.0 MIME-Version: 1.0 In-Reply-To: <20190204192910.GK5593@kernel.org> Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 04.02.2019 22:29, Arnaldo Carvalho de Melo wrote: > Em Tue, Jan 22, 2019 at 08:48:54PM +0300, Alexey Budankov escreveu: >> >> Allocate and bind AIO user space buffers to the memory nodes >> that mmap kernel buffers are bound to. > > [root@quaco amazonlinux]# perf test -v python > 18: 'import perf' in python : > --- start --- > test child forked, pid 526 > Traceback (most recent call last): > File "", line 1, in > ImportError: /tmp/build/perf/python/perf.so: undefined symbol: mbind Argh. Missed that. > test child finished with -1 > ---- end ---- > 'import perf' in python: FAILED! > [root@quaco amazonlinux]# > > > Please always use 'perf test' before pushing upstream, I'll try to fix > this one, either by linking libnuma into the python binding or by moving > the routines using it to a separate file. Will do. Thanks for followup. - Alexey > > Thanks, > > - Arnaldo > >> Signed-off-by: Alexey Budankov >> --- >> Changes in v4: >> - fixed compilation issue converting pr_warn() to pr_warning() >> - implemented stop if mbind() fails >> >> Changes in v3: >> - corrected code style issues >> - adjusted __aio_alloc,__aio_bind,__aio_free() implementation >> >> Changes in v2: >> - implemented perf_mmap__aio_alloc, perf_mmap__aio_free, perf_mmap__aio_bind >> and put HAVE_LIBNUMA_SUPPORT #ifdefs in there >> --- >> tools/perf/util/mmap.c | 77 +++++++++++++++++++++++++++++++++++++++--- >> 1 file changed, 73 insertions(+), 4 deletions(-) >> >> diff --git a/tools/perf/util/mmap.c b/tools/perf/util/mmap.c >> index e68ba754a8e2..34be9f900575 100644 >> --- a/tools/perf/util/mmap.c >> +++ b/tools/perf/util/mmap.c >> @@ -10,6 +10,9 @@ >> #include >> #include >> #include >> +#ifdef HAVE_LIBNUMA_SUPPORT >> +#include >> +#endif >> #include "debug.h" >> #include "event.h" >> #include "mmap.h" >> @@ -154,9 +157,72 @@ void __weak auxtrace_mmap_params__set_idx(struct auxtrace_mmap_params *mp __mayb >> } >> >> #ifdef HAVE_AIO_SUPPORT >> + >> +#ifdef HAVE_LIBNUMA_SUPPORT >> +static int perf_mmap__aio_alloc(struct perf_mmap *map, int index) >> +{ >> + map->aio.data[index] = mmap(NULL, perf_mmap__mmap_len(map), PROT_READ|PROT_WRITE, >> + MAP_PRIVATE|MAP_ANONYMOUS, 0, 0); >> + if (map->aio.data[index] == MAP_FAILED) { >> + map->aio.data[index] = NULL; >> + return -1; >> + } >> + >> + return 0; >> +} >> + >> +static void perf_mmap__aio_free(struct perf_mmap *map, int index) >> +{ >> + if (map->aio.data[index]) { >> + munmap(map->aio.data[index], perf_mmap__mmap_len(map)); >> + map->aio.data[index] = NULL; >> + } >> +} >> + >> +static int perf_mmap__aio_bind(struct perf_mmap *map, int index, int cpu, int affinity) >> +{ >> + void *data; >> + size_t mmap_len; >> + unsigned long node_mask; >> + >> + if (affinity != PERF_AFFINITY_SYS && cpu__max_node() > 1) { >> + data = map->aio.data[index]; >> + mmap_len = perf_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)); >> + return -1; >> + } >> + } >> + >> + return 0; >> +} >> +#else >> +static int perf_mmap__aio_alloc(struct perf_mmap *map, int index) >> +{ >> + map->aio.data[index] = malloc(perf_mmap__mmap_len(map)); >> + if (map->aio.data[index] == NULL) >> + return -1; >> + >> + return 0; >> +} >> + >> +static void perf_mmap__aio_free(struct perf_mmap *map, int index) >> +{ >> + zfree(&(map->aio.data[index])); >> +} >> + >> +static int perf_mmap__aio_bind(struct perf_mmap *map __maybe_unused, int index __maybe_unused, >> + int cpu __maybe_unused, int affinity __maybe_unused) >> +{ >> + return 0; >> +} >> +#endif >> + >> static int perf_mmap__aio_mmap(struct perf_mmap *map, struct mmap_params *mp) >> { >> - int delta_max, i, prio; >> + int delta_max, i, prio, ret; >> >> map->aio.nr_cblocks = mp->nr_cblocks; >> if (map->aio.nr_cblocks) { >> @@ -177,11 +243,14 @@ static int perf_mmap__aio_mmap(struct perf_mmap *map, struct mmap_params *mp) >> } >> delta_max = sysconf(_SC_AIO_PRIO_DELTA_MAX); >> for (i = 0; i < map->aio.nr_cblocks; ++i) { >> - map->aio.data[i] = malloc(perf_mmap__mmap_len(map)); >> - if (!map->aio.data[i]) { >> + ret = perf_mmap__aio_alloc(map, i); >> + if (ret == -1) { >> pr_debug2("failed to allocate data buffer area, error %m"); >> return -1; >> } >> + ret = perf_mmap__aio_bind(map, i, map->cpu, mp->affinity); >> + if (ret == -1) >> + return -1; >> /* >> * Use cblock.aio_fildes value different from -1 >> * to denote started aio write operation on the >> @@ -210,7 +279,7 @@ static void perf_mmap__aio_munmap(struct perf_mmap *map) >> int i; >> >> for (i = 0; i < map->aio.nr_cblocks; ++i) >> - zfree(&map->aio.data[i]); >> + perf_mmap__aio_free(map, i); >> if (map->aio.data) >> zfree(&map->aio.data); >> zfree(&map->aio.cblocks); >