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 parameter to exclude the unmapped memory from being dumped. Signed-off-by: Li Feng <fen...@smartx.com> --- V2: - add support for freebsd. - when free_seg is called, mark the memory MADV_DONTDUMP. - when alloc_seg is called, mark the memory MADV_DODUMP. lib/librte_eal/common/eal_common_memory.c | 26 ++++++++++++++++++++++++++ lib/librte_eal/linux/eal_memalloc.c | 6 ++++++ 2 files changed, 32 insertions(+) diff --git a/lib/librte_eal/common/eal_common_memory.c b/lib/librte_eal/common/eal_common_memory.c index cc7d54e0c..83be94a20 100644 --- a/lib/librte_eal/common/eal_common_memory.c +++ b/lib/librte_eal/common/eal_common_memory.c @@ -177,6 +177,32 @@ eal_get_virtual_area(void *requested_addr, size_t *size, after_len = RTE_PTR_DIFF(map_end, aligned_end); if (after_len > 0) munmap(aligned_end, after_len); + + /* + * Exclude this pages from a core dump. + */ +#ifdef RTE_EXEC_ENV_LINUX + if (madvise(aligned_addr, *size, MADV_DONTDUMP) != 0) + RTE_LOG(DEBUG, EAL, "madvise failed: %s\n", + strerror(errno)); +#elif RTE_EXEC_ENV_FREEBSD + if (madvise(aligned_addr, *size, MADV_NOCORE) != 0) + RTE_LOG(DEBUG, EAL, "madvise failed: %s\n", + strerror(errno)); +#endif + } else { + /* + * Exclude this pages from a core dump. + */ +#ifdef RTE_EXEC_ENV_LINUX + if (madvise(mapped_addr, map_sz, MADV_DONTDUMP) != 0) + RTE_LOG(DEBUG, EAL, "madvise failed: %s\n", + strerror(errno)); +#elif RTE_EXEC_ENV_FREEBSD + if (madvise(mapped_addr, map_sz, MADV_NOCORE) != 0) + RTE_LOG(DEBUG, EAL, "madvise failed: %s\n", + strerror(errno)); +#endif } return aligned_addr; diff --git a/lib/librte_eal/linux/eal_memalloc.c b/lib/librte_eal/linux/eal_memalloc.c index af6d0d023..9d2a6fc6f 100644 --- a/lib/librte_eal/linux/eal_memalloc.c +++ b/lib/librte_eal/linux/eal_memalloc.c @@ -571,6 +571,9 @@ alloc_seg(struct rte_memseg *ms, void *addr, int socket_id, goto resized; } + if (madvise(addr, alloc_sz, MADV_DODUMP) != 0) + RTE_LOG(DEBUG, EAL, "madvise failed: %s\n", strerror(errno)); + /* In linux, hugetlb limitations, like cgroup, are * enforced at fault time instead of mmap(), even * with the option of MAP_POPULATE. Kernel will send @@ -687,6 +690,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.11.0 -- The SmartX email address is only for business purpose. Any sent message that is not related to the business is not authorized or permitted by SmartX. 本邮箱为北京志凌海纳科技有限公司(SmartX)工作邮箱. 如本邮箱发出的邮件与工作无关,该邮件未得到本公司任何的明示或默示的授权.