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 <fengli@smartx.com> Acked-by: Anatoly Burakov <anatoly.burakov@intel.com>
This commit is contained in:
parent
76e91e3f14
commit
d72e4042c5
@ -40,6 +40,14 @@
|
|||||||
static void *next_baseaddr;
|
static void *next_baseaddr;
|
||||||
static uint64_t system_page_sz;
|
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
|
#define MAX_MMAP_WITH_DEFINED_ADDR_TRIES 5
|
||||||
void *
|
void *
|
||||||
eal_get_virtual_area(void *requested_addr, size_t *size,
|
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);
|
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;
|
return aligned_addr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -687,6 +687,9 @@ free_seg(struct rte_memseg *ms, struct hugepage_info *hi,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (madvise(ms->addr, ms->len, MADV_DONTDUMP) != 0)
|
||||||
|
RTE_LOG(DEBUG, EAL, "madvise failed: %s\n", strerror(errno));
|
||||||
|
|
||||||
exit_early = false;
|
exit_early = false;
|
||||||
|
|
||||||
/* if we're using anonymous hugepages, nothing to be done */
|
/* if we're using anonymous hugepages, nothing to be done */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user