From d12b6da14bfa910fbd5b9b51961eb26466302d24 Mon Sep 17 00:00:00 2001 From: Ravi Kerur Date: Sat, 25 Jul 2015 12:36:29 -0700 Subject: [PATCH] eal: deduplicate memory initialization 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 a3242a518b..937e8db574 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 9a07b1e12f..b6475737dd 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 f8e88692db..072e672b46 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 d52901601a..ac2745ec6b 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; -} -- 2.20.1