Thanks, Feng Li
Burakov, Anatoly <anatoly.bura...@intel.com> 于2020年4月24日周五 下午7:23写道: > > On 24-Apr-20 11:50 AM, Li Feng wrote: > > 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. > > Isn't this v3 now? My mistake. I will using v4 for next version. > > > > > 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 > > } > > DRY (Don't Repeat Yourself) :) Probably easier to do "if (!unmap) ..." > than putting this into two places. OK. I put this into two places, because the size is more accurate in this place. > > > > > 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)); > > + > > See discussion for v2, i believe this is unnecessary. > > > /* 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 */ > > > > > -- > Thanks, > Anatoly -- 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)工作邮箱. 如本邮箱发出的邮件与工作无关,该邮件未得到本公司任何的明示或默示的授权.