From patchwork Wed Oct 23 10:31:54 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Li Han X-Patchwork-Id: 61744 Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id C7CA01C07C; Wed, 23 Oct 2019 13:22:41 +0200 (CEST) Received: from mxct.zte.com.cn (mx7.zte.com.cn [202.103.147.169]) by dpdk.org (Postfix) with ESMTP id 76CE41C043 for ; Wed, 23 Oct 2019 13:22:40 +0200 (CEST) Received: from mse-fl1.zte.com.cn (unknown [10.30.14.238]) by Forcepoint Email with ESMTPS id 8E6AFF6FCD8A3348E782; Wed, 23 Oct 2019 19:22:38 +0800 (CST) Received: from notes_smtp.zte.com.cn (notessmtp.zte.com.cn [10.30.1.239]) by mse-fl1.zte.com.cn with ESMTP id x9NBLsaL085073; Wed, 23 Oct 2019 19:21:54 +0800 (GMT-8) (envelope-from han.li1@zte.com.cn) Received: from 99-99-1-125.lightspeed.wepbfl.sbcglobal.net ([10.43.166.165]) by szsmtp06.zte.com.cn (Lotus Domino Release 8.5.3FP6) with ESMTP id 2019102319221553-94387 ; Wed, 23 Oct 2019 19:22:15 +0800 From: Li Han To: thomas@monjalon.net Cc: dev@dpdk.org, Li Han Date: Wed, 23 Oct 2019 18:31:54 +0800 Message-Id: <1571826714-28661-1-git-send-email-han.li1@zte.com.cn> X-Mailer: git-send-email 1.8.3.1 X-MIMETrack: Itemize by SMTP Server on SZSMTP06/server/zte_ltd(Release 8.5.3FP6|November 21, 2013) at 2019-10-23 19:22:15, Serialize by Router on notes_smtp/zte_ltd(Release 9.0.1FP7|August 17, 2016) at 2019-10-23 19:21:58, Serialize complete at 2019-10-23 19:21:58 X-MAIL: mse-fl1.zte.com.cn x9NBLsaL085073 Subject: [dpdk-dev] [PATCH v2] lib/librte_eal/linuxapp: fix runtime config mmap issue 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" In rte_eal_config_reattach(),the secondary mmap may fail due to the rte_mem_cfg_addr already be used by others.do the change just as the rte_fbarray_init() do.if no base_virtaddr,use the default 0x100000000. v2: -fix code style issues Signed-off-by: Li Han --- lib/librte_eal/linux/eal/eal.c | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/lib/librte_eal/linux/eal/eal.c b/lib/librte_eal/linux/eal/eal.c index f397206..d4cd5bb 100644 --- a/lib/librte_eal/linux/eal/eal.c +++ b/lib/librte_eal/linux/eal/eal.c @@ -308,20 +308,32 @@ enum rte_iova_mode { void *rte_mem_cfg_addr; int retval; + size_t page_sz, mmap_len; const char *pathname = eal_runtime_config_path(); if (internal_config.no_shconf) return 0; - + mmap_len = sizeof(*rte_config.mem_config); /* map the config before hugepage address so that we don't waste a page */ if (internal_config.base_virtaddr != 0) rte_mem_cfg_addr = (void *) RTE_ALIGN_FLOOR(internal_config.base_virtaddr - sizeof(struct rte_mem_config), sysconf(_SC_PAGE_SIZE)); - else - rte_mem_cfg_addr = NULL; - + else{ + page_sz = sysconf(_SC_PAGESIZE); + if (page_sz == (size_t)-1) { + RTE_LOG(ERR, EAL, + "Cannot get SC_PAGESIZE for rte_mem_config\n"); + return -1; + } + rte_mem_cfg_addr = eal_get_virtual_area(NULL, &mmap_len, page_sz, 0, 0); + if (rte_mem_cfg_addr == NULL) { + RTE_LOG(ERR, EAL, + "Cannot get virtual addr for rte_mem_config\n"); + return -1; + } + } if (mem_cfg_fd < 0){ mem_cfg_fd = open(pathname, O_RDWR | O_CREAT, 0600); if (mem_cfg_fd < 0) { @@ -349,8 +361,10 @@ enum rte_iova_mode return -1; } - rte_mem_cfg_addr = mmap(rte_mem_cfg_addr, sizeof(*rte_config.mem_config), - PROT_READ | PROT_WRITE, MAP_SHARED, mem_cfg_fd, 0); + rte_mem_cfg_addr = mmap(rte_mem_cfg_addr, mmap_len, + PROT_READ | PROT_WRITE, + MAP_FIXED | MAP_SHARED, + mem_cfg_fd, 0); if (rte_mem_cfg_addr == MAP_FAILED){ close(mem_cfg_fd);