From: Li Feng <fengli@smartx.com> [ backported from upstream commit d72e4042c5ebda7af81448b387af8218136402d0 ] 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 <fengli@smartx.com> Acked-by: Anatoly Burakov <anatoly.burakov@intel.com> --- As requested by Stephen. This stops coredumps from DPDK applications from massively inflating in size with unused memory chunks. lib/librte_eal/common/eal_common_memory.c | 15 +++++++++++++++ lib/librte_eal/linux/eal/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/eal_memalloc.c b/lib/librte_eal/linux/eal/eal_memalloc.c index 51d239de37..22f1ff68eb 100644 --- a/lib/librte_eal/linux/eal/eal_memalloc.c +++ b/lib/librte_eal/linux/eal/eal_memalloc.c @@ -710,6 +710,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.29.2
From: Thomas Monjalon <thomas@monjalon.net> [ backported from upstream commit 27efcf2003113fc9a236d8cf5b6c5e01b28b59ca ] Some compilers (on RHEL7 and CentOS7) were getting this error: error: "RTE_EXEC_ENV_FREEBSD" is not defined [-Werror=undef] Existence of a macro must be checked with "#ifdef" or "#if defined". Fixes: d72e4042c5eb ("mem: exclude unused memory from core dump") Signed-off-by: Thomas Monjalon <thomas@monjalon.net> Tested-by: Raslan Darawsheh <rasland@mellanox.com> --- lib/librte_eal/common/eal_common_memory.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/librte_eal/common/eal_common_memory.c b/lib/librte_eal/common/eal_common_memory.c index 9a797a4fa3..4c897a13f1 100644 --- a/lib/librte_eal/common/eal_common_memory.c +++ b/lib/librte_eal/common/eal_common_memory.c @@ -42,7 +42,7 @@ static uint64_t system_page_sz; #ifdef RTE_EXEC_ENV_LINUX #define RTE_DONTDUMP MADV_DONTDUMP -#elif RTE_EXEC_ENV_FREEBSD +#elif defined RTE_EXEC_ENV_FREEBSD #define RTE_DONTDUMP MADV_NOCORE #else #error "madvise doesn't support this OS" -- 2.29.2
On Mon, Feb 22, 2021 at 12:58 PM <luca.boccassi@gmail.com> wrote: > > From: Thomas Monjalon <thomas@monjalon.net> > > [ backported from upstream commit 27efcf2003113fc9a236d8cf5b6c5e01b28b59ca ] > > Some compilers (on RHEL7 and CentOS7) were getting this error: > error: "RTE_EXEC_ENV_FREEBSD" is not defined [-Werror=undef] > > Existence of a macro must be checked with "#ifdef" or "#if defined". > > Fixes: d72e4042c5eb ("mem: exclude unused memory from core dump") applied both of this series > Signed-off-by: Thomas Monjalon <thomas@monjalon.net> > Tested-by: Raslan Darawsheh <rasland@mellanox.com> > --- > lib/librte_eal/common/eal_common_memory.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/lib/librte_eal/common/eal_common_memory.c b/lib/librte_eal/common/eal_common_memory.c > index 9a797a4fa3..4c897a13f1 100644 > --- a/lib/librte_eal/common/eal_common_memory.c > +++ b/lib/librte_eal/common/eal_common_memory.c > @@ -42,7 +42,7 @@ static uint64_t system_page_sz; > > #ifdef RTE_EXEC_ENV_LINUX > #define RTE_DONTDUMP MADV_DONTDUMP > -#elif RTE_EXEC_ENV_FREEBSD > +#elif defined RTE_EXEC_ENV_FREEBSD > #define RTE_DONTDUMP MADV_NOCORE > #else > #error "madvise doesn't support this OS" > -- > 2.29.2 > -- Christian Ehrhardt Staff Engineer, Ubuntu Server Canonical Ltd