From patchwork Mon Jul 3 10:04:07 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Olivier Matz X-Patchwork-Id: 26234 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [IPv6:::1]) by dpdk.org (Postfix) with ESMTP id BD2BC2BF2; Mon, 3 Jul 2017 12:04:21 +0200 (CEST) Received: from proxy.6wind.com (host.76.145.23.62.rev.coltfrance.com [62.23.145.76]) by dpdk.org (Postfix) with ESMTP id F1CCB2C8; Mon, 3 Jul 2017 12:04:19 +0200 (CEST) Received: from glumotte.dev.6wind.com (unknown [10.16.0.195]) by proxy.6wind.com (Postfix) with ESMTP id 44A029C098; Mon, 3 Jul 2017 12:03:49 +0200 (CEST) From: Olivier Matz To: dev@dpdk.org Cc: matvejchikov@gmail.com, adrien.mazarguil@6wind.com, jblunck@infradead.org, sergio.gonzalez.monroy@intel.com, santosh.shukla@caviumnetworks.com, stable@dpdk.org Date: Mon, 3 Jul 2017 12:04:07 +0200 Message-Id: <20170703100407.21790-1-olivier.matz@6wind.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20170609082937.21294-1-olivier.matz@6wind.com> References: <20170609082937.21294-1-olivier.matz@6wind.com> Subject: [dpdk-dev] [PATCH v2] eal: don't advertise a physical address when no hugepages X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" When populating a mempool with a virtual memory area, the mempool library expects to be able to get the physical address of each page. When started with --no-huge, the physical addresses may not be available because the pages are not locked in memory. It sometimes returns RTE_BAD_PHYS_ADDR, which makes the mempool_populate() function to fail. This was working before the commit cdc242f260e7 ("eal/linux: support running as unprivileged user"), because rte_mem_virt2phy() was returning 0 instead of RTE_BAD_PHYS_ADDR, which was seen as a valid physical address. Since --no-huge is a debug function that breaks the support of physical drivers, always set physical addresses to RTE_BAD_PHYS_ADDR in memzones or in rte_mem_virt2phy(), and ensure that mempool won't complain in that case. Fixes: cdc242f260e7 ("eal/linux: support running as unprivileged user") CC: stable@dpdk.org Signed-off-by: Olivier Matz Reviewed-by: Jan Blunck --- v1 -> v2: - initialize memory segments (rte_memseg) with RTE_BAD_PHYS_ADDR if started with --no-huge - return RTE_BAD_PHYS_ADDR when rte_malloc_virt2phy() if the memory segment has no physical address - drop change in eal_common_memzone.c: the physical address is now set to RTE_BAD_PHYS_ADDR as per return value of rte_malloc_virt2phy() lib/librte_eal/common/include/rte_malloc.h | 2 +- lib/librte_eal/common/rte_malloc.c | 4 +++- lib/librte_eal/linuxapp/eal/eal_memory.c | 9 ++++++++- lib/librte_mempool/rte_mempool.c | 2 +- 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/lib/librte_eal/common/include/rte_malloc.h b/lib/librte_eal/common/include/rte_malloc.h index 61aac322b..3d37f79b8 100644 --- a/lib/librte_eal/common/include/rte_malloc.h +++ b/lib/librte_eal/common/include/rte_malloc.h @@ -329,7 +329,7 @@ rte_malloc_set_limit(const char *type, size_t max); * @param addr * Address obtained from a previous rte_malloc call * @return - * NULL on error + * RTE_BAD_PHYS_ADDR on error * otherwise return physical address of the buffer */ phys_addr_t diff --git a/lib/librte_eal/common/rte_malloc.c b/lib/librte_eal/common/rte_malloc.c index f4a883529..5c0627bf4 100644 --- a/lib/librte_eal/common/rte_malloc.c +++ b/lib/librte_eal/common/rte_malloc.c @@ -253,6 +253,8 @@ rte_malloc_virt2phy(const void *addr) { const struct malloc_elem *elem = malloc_elem_from_data(addr); if (elem == NULL) - return 0; + return RTE_BAD_PHYS_ADDR; + if (elem->ms->phys_addr == RTE_BAD_PHYS_ADDR) + return RTE_BAD_PHYS_ADDR; return elem->ms->phys_addr + ((uintptr_t)addr - (uintptr_t)elem->ms->addr); } diff --git a/lib/librte_eal/linuxapp/eal/eal_memory.c b/lib/librte_eal/linuxapp/eal/eal_memory.c index 647d89c58..040f24a43 100644 --- a/lib/librte_eal/linuxapp/eal/eal_memory.c +++ b/lib/librte_eal/linuxapp/eal/eal_memory.c @@ -112,6 +112,13 @@ test_phys_addrs_available(void) if (rte_xen_dom0_supported()) return; + if (!rte_eal_has_hugepages()) { + RTE_LOG(ERR, EAL, + "Started without hugepages support, physical addresses not available\n"); + phys_addrs_available = false; + return; + } + physaddr = rte_mem_virt2phy(&tmp); if (physaddr == RTE_BAD_PHYS_ADDR) { RTE_LOG(ERR, EAL, @@ -1054,7 +1061,7 @@ rte_eal_hugepage_init(void) strerror(errno)); return -1; } - mcfg->memseg[0].phys_addr = (phys_addr_t)(uintptr_t)addr; + mcfg->memseg[0].phys_addr = RTE_BAD_PHYS_ADDR; mcfg->memseg[0].addr = addr; mcfg->memseg[0].hugepage_sz = RTE_PGSIZE_4K; mcfg->memseg[0].len = internal_config.memory; diff --git a/lib/librte_mempool/rte_mempool.c b/lib/librte_mempool/rte_mempool.c index f65310f60..6fc3c9c7c 100644 --- a/lib/librte_mempool/rte_mempool.c +++ b/lib/librte_mempool/rte_mempool.c @@ -476,7 +476,7 @@ rte_mempool_populate_virt(struct rte_mempool *mp, char *addr, /* required for xen_dom0 to get the machine address */ paddr = rte_mem_phy2mch(-1, paddr); - if (paddr == RTE_BAD_PHYS_ADDR) { + if (paddr == RTE_BAD_PHYS_ADDR && rte_eal_has_hugepages()) { ret = -EINVAL; goto fail; }