From patchwork Mon Jul 27 00:56:34 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Thomas Monjalon X-Patchwork-Id: 6601 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 3DBDBC506; Mon, 27 Jul 2015 02:58:03 +0200 (CEST) Received: from mail-wi0-f182.google.com (mail-wi0-f182.google.com [209.85.212.182]) by dpdk.org (Postfix) with ESMTP id 9B014C4FA for ; Mon, 27 Jul 2015 02:57:58 +0200 (CEST) Received: by wibud3 with SMTP id ud3so94790838wib.0 for ; Sun, 26 Jul 2015 17:57:58 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=ysf7pcNR0bt0fU4phrYjqxJSgxUMW03MrBMsJfFY2NU=; b=I9i7z14crIGlOOg2q+Sgul8CB0v63YTR8SxthAwQ+f0+ZyvhRhdmw890h0bPUzmxWc z/bFg3S+vXMcL7HPROpO/Z4W1vfnkysVSgF+TjAqSHcbSr9S7LcOSw70WYKzayc+REBP Vi1qOga84pcMDf9a8qF6XcpruRkgosYV47TTSzshn+hL0GkI/5rilgoQk8At7V6BqBpq OdzrYTllR7G2pOdeyfRikkfBk7LMrPIoessbMbtkYWNk6kFVKddT0cZXd3Q8+pmtEO2c zR1av0va/W4kR/q4AT6BC+XdGYmP1e0Kqqt5x8uYTrc+creAHLzmZTuu7tBzXyoNf/ps 0M8w== X-Gm-Message-State: ALoCoQmNmArS/z81saoagxlaVbthXJsUJWMoCHCVBiUoNbPN442s2gi6gzwMMWm5LdRcT5EkLS5Q X-Received: by 10.194.108.232 with SMTP id hn8mr25277072wjb.154.1437958678490; Sun, 26 Jul 2015 17:57:58 -0700 (PDT) Received: from localhost.localdomain (136-92-190-109.dsl.ovh.fr. [109.190.92.136]) by smtp.gmail.com with ESMTPSA id dz4sm10733801wib.17.2015.07.26.17.57.57 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Sun, 26 Jul 2015 17:57:57 -0700 (PDT) From: Thomas Monjalon To: david.marchand@6wind.com Date: Mon, 27 Jul 2015 02:56:34 +0200 Message-Id: <1437958594-29468-4-git-send-email-thomas.monjalon@6wind.com> X-Mailer: git-send-email 2.4.2 In-Reply-To: <1437958594-29468-1-git-send-email-thomas.monjalon@6wind.com> References: <1437852868-6031-1-git-send-email-rkerur@gmail.com> <1437958594-29468-1-git-send-email-thomas.monjalon@6wind.com> Cc: dev@dpdk.org Subject: [dpdk-dev] [PATCH v10 3/3] eal: deduplicate memory initialization X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Ravi Kerur Move common functions from BSD/Linux to eal_common_memory.c file. BSD uses contigmem kernel module and Linux uses /proc/self/pagemap file. Signed-off-by: Ravi Kerur Signed-off-by: Thomas Monjalon --- lib/librte_eal/bsdapp/eal/eal_memory.c | 39 ++------------- lib/librte_eal/common/eal_common_memory.c | 38 ++++++++++++++- lib/librte_eal/common/eal_private.h | 18 +++++++ lib/librte_eal/linuxapp/eal/eal_memory.c | 80 ++++++++++--------------------- 4 files changed, 81 insertions(+), 94 deletions(-) diff --git a/lib/librte_eal/bsdapp/eal/eal_memory.c b/lib/librte_eal/bsdapp/eal/eal_memory.c index a3242a5..937e8db 100644 --- a/lib/librte_eal/bsdapp/eal/eal_memory.c +++ b/lib/librte_eal/bsdapp/eal/eal_memory.c @@ -59,7 +59,7 @@ rte_mem_virt2phy(const void *virtaddr) return RTE_BAD_PHYS_ADDR; } -static int +int rte_eal_contigmem_init(void) { struct rte_mem_config *mcfg; @@ -132,8 +132,8 @@ rte_eal_contigmem_init(void) return 0; } -static int -rte_eal_contigmem_attach(void) +int +rte_eal_hugepage_attach(void) { const struct hugepage_info *hpi; int fd_hugepage_info, fd_hugepage = -1; @@ -192,36 +192,3 @@ error: close(fd_hugepage); return -1; } - - -static int -rte_eal_memdevice_init(void) -{ - struct rte_config *config; - - if (rte_eal_process_type() == RTE_PROC_SECONDARY) - return 0; - - config = rte_eal_get_configuration(); - config->mem_config->nchannel = internal_config.force_nchannel; - config->mem_config->nrank = internal_config.force_nrank; - - return 0; -} - -/* init memory subsystem */ -int -rte_eal_memory_init(void) -{ - RTE_LOG(INFO, EAL, "Setting up physically contiguous memory...\n"); - const int retval = rte_eal_process_type() == RTE_PROC_PRIMARY ? - rte_eal_contigmem_init() : - rte_eal_contigmem_attach(); - if (retval < 0) - return -1; - - if (internal_config.no_shconf == 0 && rte_eal_memdevice_init() < 0) - return -1; - - return 0; -} diff --git a/lib/librte_eal/common/eal_common_memory.c b/lib/librte_eal/common/eal_common_memory.c index 9a07b1e..b647573 100644 --- a/lib/librte_eal/common/eal_common_memory.c +++ b/lib/librte_eal/common/eal_common_memory.c @@ -45,6 +45,7 @@ #include #include "eal_private.h" +#include "eal_internal_cfg.h" /* * Return a pointer to a read-only table of struct rte_physmem_desc @@ -69,7 +70,7 @@ rte_eal_get_physmem_size(void) /* get pointer to global configuration */ mcfg = rte_eal_get_configuration()->mem_config; - for (i=0; imemseg[i].addr == NULL) break; @@ -89,7 +90,7 @@ rte_dump_physmem_layout(FILE *f) /* get pointer to global configuration */ mcfg = rte_eal_get_configuration()->mem_config; - for (i=0; imemseg[i].addr == NULL) break; @@ -118,3 +119,36 @@ unsigned rte_memory_get_nrank(void) { return rte_eal_get_configuration()->mem_config->nrank; } + +static int +rte_eal_memdevice_init(void) +{ + struct rte_config *config; + + if (rte_eal_process_type() == RTE_PROC_SECONDARY) + return 0; + + config = rte_eal_get_configuration(); + config->mem_config->nchannel = internal_config.force_nchannel; + config->mem_config->nrank = internal_config.force_nrank; + + return 0; +} + +/* init memory subsystem */ +int +rte_eal_memory_init(void) +{ + RTE_LOG(INFO, EAL, "Setting up physically contiguous memory...\n"); + + const int retval = rte_eal_process_type() == RTE_PROC_PRIMARY ? + rte_eal_hugepage_init() : + rte_eal_hugepage_attach(); + if (retval < 0) + return -1; + + if (internal_config.no_shconf == 0 && rte_eal_memdevice_init() < 0) + return -1; + + return 0; +} diff --git a/lib/librte_eal/common/eal_private.h b/lib/librte_eal/common/eal_private.h index f8e8869..072e672 100644 --- a/lib/librte_eal/common/eal_private.h +++ b/lib/librte_eal/common/eal_private.h @@ -328,4 +328,22 @@ void set_tsc_freq(void); */ uint64_t get_tsc_freq(void); +/** + * Prepare physical memory mapping + * i.e. hugepages on Linux and + * contigmem on BSD. + * + * This function is private to the EAL. + */ +int rte_eal_hugepage_init(void); + +/** + * Creates memory mapping in secondary process + * i.e. hugepages on Linux and + * contigmem on BSD. + * + * This function is private to the EAL. + */ +int rte_eal_hugepage_attach(void); + #endif /* _EAL_PRIVATE_H_ */ diff --git a/lib/librte_eal/linuxapp/eal/eal_memory.c b/lib/librte_eal/linuxapp/eal/eal_memory.c index d529016..ac2745e 100644 --- a/lib/librte_eal/linuxapp/eal/eal_memory.c +++ b/lib/librte_eal/linuxapp/eal/eal_memory.c @@ -115,6 +115,24 @@ static unsigned proc_pagemap_readable; #define RANDOMIZE_VA_SPACE_FILE "/proc/sys/kernel/randomize_va_space" +static void +test_proc_pagemap_readable(void) +{ + int fd = open("/proc/self/pagemap", O_RDONLY); + + if (fd < 0) { + RTE_LOG(ERR, EAL, + "Cannot open /proc/self/pagemap: %s. " + "virt2phys address translation will not work\n", + strerror(errno)); + return; + } + + /* Is readable */ + close(fd); + proc_pagemap_readable = 1; +} + /* Lock page in physical memory and prevent from swapping. */ int rte_mem_lock_page(const void *virt) @@ -1037,7 +1055,7 @@ calc_num_pages_per_socket(uint64_t * memory, * 6. unmap the first mapping * 7. fill memsegs in configuration with contiguous zones */ -static int +int rte_eal_hugepage_init(void) { struct rte_mem_config *mcfg; @@ -1054,6 +1072,8 @@ rte_eal_hugepage_init(void) int new_pages_count[MAX_HUGEPAGE_SIZES]; #endif + test_proc_pagemap_readable(); + memset(used_hp, 0, sizeof(used_hp)); /* get pointer to global configuration */ @@ -1087,7 +1107,6 @@ rte_eal_hugepage_init(void) #endif } - /* calculate total number of hugepages available. at this point we haven't * yet started sorting them so they all are on socket 0 */ for (i = 0; i < (int) internal_config.num_hugepage_sizes; i++) { @@ -1378,7 +1397,7 @@ getFileSize(int fd) * configuration and finds the hugepages which form that segment, mapping them * in order to form a contiguous block in the virtual memory space */ -static int +int rte_eal_hugepage_attach(void) { const struct rte_mem_config *mcfg = rte_eal_get_configuration()->mem_config; @@ -1395,6 +1414,8 @@ rte_eal_hugepage_attach(void) "into secondary processes\n"); } + test_proc_pagemap_readable(); + if (internal_config.xen_dom0_support) { #ifdef RTE_LIBRTE_XEN_DOM0 if (rte_xen_dom0_memory_attach() < 0) { @@ -1538,56 +1559,3 @@ error: close(fd_hugepage); return -1; } - -static int -rte_eal_memdevice_init(void) -{ - struct rte_config *config; - - if (rte_eal_process_type() == RTE_PROC_SECONDARY) - return 0; - - config = rte_eal_get_configuration(); - config->mem_config->nchannel = internal_config.force_nchannel; - config->mem_config->nrank = internal_config.force_nrank; - - return 0; -} - -static int -test_proc_pagemap_readable(void) -{ - int fd = open("/proc/self/pagemap", O_RDONLY); - - if (fd < 0) - return 0; - /* Is readable */ - close(fd); - - return 1; -} - -/* init memory subsystem */ -int -rte_eal_memory_init(void) -{ - RTE_LOG(INFO, EAL, "Setting up memory...\n"); - - proc_pagemap_readable = test_proc_pagemap_readable(); - if (!proc_pagemap_readable) - RTE_LOG(ERR, EAL, - "Cannot open /proc/self/pagemap: %s. " - "virt2phys address translation will not work\n", - strerror(errno)); - - const int retval = rte_eal_process_type() == RTE_PROC_PRIMARY ? - rte_eal_hugepage_init() : - rte_eal_hugepage_attach(); - if (retval < 0) - return -1; - - if (internal_config.no_shconf == 0 && rte_eal_memdevice_init() < 0) - return -1; - - return 0; -}