X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=lib%2Flibrte_eal%2Flinuxapp%2Feal%2Feal_memory.c;h=d52901601a28fc7c7ed0bc16ff4df4bcbb331f29;hb=a20d5f06e2e19d3622620d838006ea4eaaa594fb;hp=9b8d94673070700ff764c6517a43921d11c3664a;hpb=0ff9695e37f4d458ef308a6ad598a0fe4444d722;p=dpdk.git diff --git a/lib/librte_eal/linuxapp/eal/eal_memory.c b/lib/librte_eal/linuxapp/eal/eal_memory.c index 9b8d946730..d52901601a 100644 --- a/lib/librte_eal/linuxapp/eal/eal_memory.c +++ b/lib/librte_eal/linuxapp/eal/eal_memory.c @@ -111,6 +111,8 @@ static uint64_t baseaddr_offset; +static unsigned proc_pagemap_readable; + #define RANDOMIZE_VA_SPACE_FILE "/proc/sys/kernel/randomize_va_space" /* Lock page in physical memory and prevent from swapping. */ @@ -135,6 +137,10 @@ rte_mem_virt2phy(const void *virtaddr) int page_size; off_t offset; + /* Cannot parse /proc/self/pagemap, no need to log errors everywhere */ + if (!proc_pagemap_readable) + return RTE_BAD_PHYS_ADDR; + /* standard page size */ page_size = getpagesize(); @@ -239,7 +245,7 @@ get_virtual_area(size_t *size, size_t hugepage_sz) } else addr = NULL; - RTE_LOG(INFO, EAL, "Ask a virtual area of 0x%zx bytes\n", *size); + RTE_LOG(DEBUG, EAL, "Ask a virtual area of 0x%zx bytes\n", *size); fd = open("/dev/zero", O_RDONLY); if (fd < 0){ @@ -255,7 +261,8 @@ get_virtual_area(size_t *size, size_t hugepage_sz) if (addr == MAP_FAILED) { close(fd); - RTE_LOG(INFO, EAL, "Cannot get a virtual area\n"); + RTE_LOG(ERR, EAL, "Cannot get a virtual area: %s\n", + strerror(errno)); return NULL; } @@ -268,7 +275,7 @@ get_virtual_area(size_t *size, size_t hugepage_sz) aligned_addr &= (~(hugepage_sz - 1)); addr = (void *)(aligned_addr); - RTE_LOG(INFO, EAL, "Virtual area found at %p (size = 0x%zx)\n", + RTE_LOG(DEBUG, EAL, "Virtual area found at %p (size = 0x%zx)\n", addr, *size); /* increment offset */ @@ -604,7 +611,7 @@ find_numasocket(struct hugepage_file *hugepg_tbl, struct hugepage_info *hpi) f = fopen("/proc/self/numa_maps", "r"); if (f == NULL) { - RTE_LOG(INFO, EAL, "cannot open /proc/self/numa_maps," + RTE_LOG(NOTICE, EAL, "cannot open /proc/self/numa_maps," " consider that all memory is in socket_id 0\n"); return 0; } @@ -880,7 +887,7 @@ get_socket_mem_size(int socket) size += hpi->hugepage_sz * hpi->num_pages[socket]; } - return (size); + return size; } /* @@ -1001,7 +1008,7 @@ calc_num_pages_per_socket(uint64_t * memory, 0x100000); available = requested - ((unsigned) (memory[socket] / 0x100000)); - RTE_LOG(INFO, EAL, "Not enough memory available on socket %u! " + RTE_LOG(ERR, EAL, "Not enough memory available on socket %u! " "Requested: %uMB, available: %uMB\n", socket, requested, available); return -1; @@ -1012,7 +1019,7 @@ calc_num_pages_per_socket(uint64_t * memory, if (total_mem > 0) { requested = (unsigned) (internal_config.memory / 0x100000); available = requested - (unsigned) (total_mem / 0x100000); - RTE_LOG(INFO, EAL, "Not enough memory available! Requested: %uMB," + RTE_LOG(ERR, EAL, "Not enough memory available! Requested: %uMB," " available: %uMB\n", requested, available); return -1; } @@ -1063,8 +1070,9 @@ rte_eal_hugepage_init(void) } mcfg->memseg[0].phys_addr = (phys_addr_t)(uintptr_t)addr; mcfg->memseg[0].addr = addr; + mcfg->memseg[0].hugepage_sz = RTE_PGSIZE_4K; mcfg->memseg[0].len = internal_config.memory; - mcfg->memseg[0].socket_id = SOCKET_ID_ANY; + mcfg->memseg[0].socket_id = 0; return 0; } @@ -1220,13 +1228,13 @@ rte_eal_hugepage_init(void) for (i = 0; i < (int) internal_config.num_hugepage_sizes; i++) { for (j = 0; j < RTE_MAX_NUMA_NODES; j++) { if (used_hp[i].num_pages[j] > 0) { - RTE_LOG(INFO, EAL, - "Requesting %u pages of size %uMB" - " from socket %i\n", - used_hp[i].num_pages[j], - (unsigned) - (used_hp[i].hugepage_sz / 0x100000), - j); + RTE_LOG(DEBUG, EAL, + "Requesting %u pages of size %uMB" + " from socket %i\n", + used_hp[i].num_pages[j], + (unsigned) + (used_hp[i].hugepage_sz / 0x100000), + j); } } } @@ -1341,7 +1349,7 @@ rte_eal_hugepage_init(void) "of memory.\n", i, nr_hugefiles, RTE_STR(CONFIG_RTE_MAX_MEMSEG), RTE_MAX_MEMSEG); - return (-ENOMEM); + return -ENOMEM; } return 0; @@ -1546,12 +1554,32 @@ rte_eal_memdevice_init(void) 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();