From d72e4042c5ebda7af81448b387af8218136402d0 Mon Sep 17 00:00:00 2001 From: Li Feng Date: Fri, 24 Apr 2020 21:19:05 +0800 Subject: [PATCH] mem: exclude unused memory from core dump Currently, even though memory is mapped with PROT_NONE, this does not cause it to be excluded from core dumps. This is counter-productive, because in a lot of cases, this memory will go unused (e.g. when the memory subsystem preallocates VA space but hasn't yet mapped physical pages into it). Use `madvise()` call with MADV_DONTDUMP/MADV_NOCORE to exclude the unused memory from being dumped. Signed-off-by: Li Feng Acked-by: Anatoly Burakov --- lib/librte_eal/common/eal_common_memory.c | 15 +++++++++++++++ lib/librte_eal/linux/eal_memalloc.c | 3 +++ 2 files changed, 18 insertions(+) diff --git a/lib/librte_eal/common/eal_common_memory.c b/lib/librte_eal/common/eal_common_memory.c index cc7d54e0c7..9a797a4fa3 100644 --- a/lib/librte_eal/common/eal_common_memory.c +++ b/lib/librte_eal/common/eal_common_memory.c @@ -40,6 +40,14 @@ static void *next_baseaddr; static uint64_t system_page_sz; +#ifdef RTE_EXEC_ENV_LINUX +#define RTE_DONTDUMP MADV_DONTDUMP +#elif RTE_EXEC_ENV_FREEBSD +#define RTE_DONTDUMP MADV_NOCORE +#else +#error "madvise doesn't support this OS" +#endif + #define MAX_MMAP_WITH_DEFINED_ADDR_TRIES 5 void * eal_get_virtual_area(void *requested_addr, size_t *size, @@ -179,6 +187,13 @@ eal_get_virtual_area(void *requested_addr, size_t *size, munmap(aligned_end, after_len); } + if (!unmap) { + /* Exclude these pages from a core dump. */ + if (madvise(aligned_addr, *size, RTE_DONTDUMP) != 0) + RTE_LOG(DEBUG, EAL, "madvise failed: %s\n", + strerror(errno)); + } + return aligned_addr; } diff --git a/lib/librte_eal/linux/eal_memalloc.c b/lib/librte_eal/linux/eal_memalloc.c index 678094acf9..2c717f8bdd 100644 --- a/lib/librte_eal/linux/eal_memalloc.c +++ b/lib/librte_eal/linux/eal_memalloc.c @@ -687,6 +687,9 @@ free_seg(struct rte_memseg *ms, struct hugepage_info *hi, return -1; } + if (madvise(ms->addr, ms->len, MADV_DONTDUMP) != 0) + RTE_LOG(DEBUG, EAL, "madvise failed: %s\n", strerror(errno)); + exit_early = false; /* if we're using anonymous hugepages, nothing to be done */ -- 2.20.1