From 410d70a3ff8e9f83e5b25f445aff19be9b50d830 Mon Sep 17 00:00:00 2001 From: Simon Kagstrom Date: Wed, 24 Jun 2015 10:33:52 +0200 Subject: [PATCH] mem: warn once if pagemap is unreadable Newer kernels make this unreadable for security reasons for non-roots. Running the application will then fill the logs with rte_mem_virt2phy: cannot open /proc/self/pagemap messages. However, there are cases when DPDK is and should be run as non-root, without the need for virtual-to-physical address translations: a typical example is when working with PCAP input/output. This patch adds a start-time check for /proc/self/pagemap readability, and directly returns an error code from rte_mem_virt2phy(). This way, there is only a one-time warning at startup instead of constant warnings all the time. Signed-off-by: Simon Kagstrom Signed-off-by: Johan Faltstrom --- lib/librte_eal/linuxapp/eal/eal_memory.c | 26 ++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/lib/librte_eal/linuxapp/eal/eal_memory.c b/lib/librte_eal/linuxapp/eal/eal_memory.c index 341fefb17a..e501c49bd7 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(); @@ -1546,12 +1552,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(); -- 2.20.1