mem: Warn once if /proc/self/pagemap is unreadable
PATCH v2 1/1 mem: Warn once if /proc/self/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.
---
ChangeLog:
v2: Fix use with huge pages.
lib/librte_eal/linuxapp/eal/eal_memory.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+)
lib/librte_eal/linuxapp/eal/eal_memory.c +25 -0
@@ -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,31 @@ 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 ();
Signature · 1 line
1.9.1
Thomas Monjalon
Applied2015-06-24 10:33, Simon Kagstrom:
Quoted 13 lines
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/pagemapmessages.
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/pagemapreadability, and directly returns an error code fromrte_mem_virt2phy().
Quoted 5 lines
This way, there is only a one-time warning at startup instead of constant warnings all the time.
Signed-off-by Simon Kagstrom <[email protected]>Signed-off-by Johan Faltstrom <[email protected]>
Applied, thanks