[dpdk-dev] [PATCH 2/2] memalloc: keep in mind a failed MAP_FIXED mmap may still perform an unmap
Dariusz Stojaczyk
dariuszx.stojaczyk at intel.com
Fri Jun 1 14:51:09 CEST 2018
This isn't documented in the manuals, but a failed
mmap(..., MAP_FIXED) may still unmap overlapping
regions. In such case, we need to remap these regions
back into our address space to ensure mem contiguity.
We do it unconditionally now on mmap failure just to
be safe.
Verified on Linux 4.9.0-4-amd64. I was getting
ENOMEM when trying to map in hugetlbfs with no space
left, but the previous anonymous mapping was still
being removed.
Signed-off-by: Dariusz Stojaczyk <dariuszx.stojaczyk at intel.com>
---
lib/librte_eal/linuxapp/eal/eal_memalloc.c | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/lib/librte_eal/linuxapp/eal/eal_memalloc.c b/lib/librte_eal/linuxapp/eal/eal_memalloc.c
index b959ea5..e59ad6e 100644
--- a/lib/librte_eal/linuxapp/eal/eal_memalloc.c
+++ b/lib/librte_eal/linuxapp/eal/eal_memalloc.c
@@ -527,7 +527,13 @@ alloc_seg(struct rte_memseg *ms, void *addr, int socket_id,
if (va == MAP_FAILED) {
RTE_LOG(DEBUG, EAL, "%s(): mmap() failed: %s\n", __func__,
strerror(errno));
- goto resized;
+ if (errno == ENOMEM) {
+ /* mmap failed, but the previous region might have
+ * been unmapped anyway; try to remap it */
+ goto unmapped;
+ } else {
+ goto resized;
+ }
}
if (va != addr) {
RTE_LOG(DEBUG, EAL, "%s(): wrong mmap() address\n", __func__);
@@ -588,6 +594,7 @@ alloc_seg(struct rte_memseg *ms, void *addr, int socket_id,
mapped:
munmap(addr, alloc_sz);
+unmapped:
flags = MAP_FIXED;
#ifdef RTE_ARCH_PPC_64
flags |= MAP_HUGETLB;
--
2.7.4
More information about the dev
mailing list