From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from g4t3427.houston.hpe.com (g4t3427.houston.hpe.com [15.241.140.73]) by dpdk.org (Postfix) with ESMTP id 88D84A10 for ; Tue, 4 Oct 2016 19:17:07 +0200 (CEST) Received: from g9t2301.houston.hpecorp.net (g9t2301.houston.hpecorp.net [16.220.97.129]) by g4t3427.houston.hpe.com (Postfix) with ESMTP id A767564; Tue, 4 Oct 2016 17:17:06 +0000 (UTC) Received: from postal.labs.hpecorp.net (mailhub-pa.labs.hpe.com [16.111.35.25]) by g9t2301.houston.hpecorp.net (Postfix) with ESMTP id 530604A; Tue, 4 Oct 2016 17:17:06 +0000 (UTC) Received: from bougret.labs.hpecorp.net (bougret.labs.hpecorp.net [16.111.8.16]) by postal.labs.hpecorp.net (8.14.4/8.14.4/HPL-PA Hub) with ESMTP id u94HH4rm031329 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-GCM-SHA256 bits=128 verify=NOT); Tue, 4 Oct 2016 10:17:04 -0700 Received: from jt by bougret.labs.hpecorp.net with local (Exim 4.84_2) (envelope-from ) id 1brTKx-0000tB-TD; Tue, 04 Oct 2016 10:17:03 -0700 Date: Tue, 4 Oct 2016 10:17:03 -0700 From: Jean Tourrilhes To: Thomas Monjalon Cc: Sergio Gonzalez Monroy , dev@dpdk.org Message-ID: <20161004171703.GA3053@labs.hpe.com> References: <20160921211049.GA27472@labs.hpe.com> <6928094.Vgjcapsp68@xps13> <417ffa55-a8bf-a769-d751-b023d72993d8@intel.com> <2392264.CCbfKQ6uGK@xps13> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <2392264.CCbfKQ6uGK@xps13> Organisation: HP Labs Palo Alto Address: HP Labs, MS1184, 1501 Page Mill road, Palo Alto, CA 94304, USA. E-mail: jean.tourrilhes@hpe.com User-Agent: Mutt/1.5.23 (2014-03-12) Subject: [dpdk-dev] [PATCH v2 1/3] mem: fix hugepage mapping error messages X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list Reply-To: jean.tourrilhes@hpe.com List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 04 Oct 2016 17:17:08 -0000 Running secondary is tricky due to the need to map the memory region at the right place in VM, which is whatever primary has chosen. If the base address for primary happens to by already mapped in the secondary, we will hit precisely these error messages (depending if we fail on the config region or the hugepages). This is why there is already a comment about ASLR. The issue is that in most cases, remapping does not happen and "errno" is not changed and therefore stale. In our case, we got a "permission denied", which sent us down the wrong track. It's such a common error for secondary that I feel this error message should be unambiguous and helpful. The call to close was also moved because close() may override errno. Signed-off-by: Jean Tourrilhes --- lib/librte_eal/linuxapp/eal/eal.c | 14 +++++++++++--- lib/librte_eal/linuxapp/eal/eal_memory.c | 16 ++++++++++++---- 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/lib/librte_eal/linuxapp/eal/eal.c b/lib/librte_eal/linuxapp/eal/eal.c index 3fb2188..5df9f6a 100644 --- a/lib/librte_eal/linuxapp/eal/eal.c +++ b/lib/librte_eal/linuxapp/eal/eal.c @@ -238,7 +238,8 @@ rte_eal_config_attach(void) mem_config = (struct rte_mem_config *) mmap(NULL, sizeof(*mem_config), PROT_READ, MAP_SHARED, mem_cfg_fd, 0); if (mem_config == MAP_FAILED) - rte_panic("Cannot mmap memory for rte_config\n"); + rte_panic("Cannot mmap memory for rte_config! error %i (%s)\n", + errno, strerror(errno)); rte_config.mem_config = mem_config; } @@ -263,9 +264,16 @@ rte_eal_config_reattach(void) mem_config = (struct rte_mem_config *) mmap(rte_mem_cfg_addr, sizeof(*mem_config), PROT_READ | PROT_WRITE, MAP_SHARED, mem_cfg_fd, 0); + if (mem_config == MAP_FAILED || mem_config != rte_mem_cfg_addr) { + if (mem_config != MAP_FAILED) + /* errno is stale, don't use */ + rte_panic("Cannot mmap memory for rte_config at [%p], got [%p] - please use '--base-virtaddr' option\n", + rte_mem_cfg_addr, mem_config); + else + rte_panic("Cannot mmap memory for rte_config! error %i (%s)\n", + errno, strerror(errno)); + } close(mem_cfg_fd); - if (mem_config == MAP_FAILED || mem_config != rte_mem_cfg_addr) - rte_panic("Cannot mmap memory for rte_config\n"); rte_config.mem_config = mem_config; } diff --git a/lib/librte_eal/linuxapp/eal/eal_memory.c b/lib/librte_eal/linuxapp/eal/eal_memory.c index 41e0a92..b036ffc 100644 --- a/lib/librte_eal/linuxapp/eal/eal_memory.c +++ b/lib/librte_eal/linuxapp/eal/eal_memory.c @@ -1615,10 +1615,18 @@ rte_eal_hugepage_attach(void) PROT_READ, MAP_PRIVATE, fd_zero, 0); if (base_addr == MAP_FAILED || base_addr != mcfg->memseg[s].addr) { - RTE_LOG(ERR, EAL, "Could not mmap %llu bytes " - "in /dev/zero to requested address [%p]: '%s'\n", - (unsigned long long)mcfg->memseg[s].len, - mcfg->memseg[s].addr, strerror(errno)); + if (base_addr != MAP_FAILED) + /* errno is stale, don't use */ + RTE_LOG(ERR, EAL, "Could not mmap %llu bytes " + "in /dev/zero at [%p], got [%p] - " + "please use '--base-virtaddr' option\n", + (unsigned long long)mcfg->memseg[s].len, + mcfg->memseg[s].addr, base_addr); + else + RTE_LOG(ERR, EAL, "Could not mmap %llu bytes " + "in /dev/zero at [%p]: '%s'\n", + (unsigned long long)mcfg->memseg[s].len, + mcfg->memseg[s].addr, strerror(errno)); if (aslr_enabled() > 0) { RTE_LOG(ERR, EAL, "It is recommended to " "disable ASLR in the kernel "