mmap: Reinstate passing MADV_MERGEABLE on private anonymous maps
Reinstate mmap calling madvise(MADV_MERGEABLE) removed in
635df850e5037be5093f64a87ec2e0a23bf7a50b
Change-Id: I290bc5ac6bb32735a3f61dd21e2fce1dfb6dfd4b
Signed-off-by: Rom Lemarchand <romlem@google.com>
diff --git a/libc/bionic/mmap.c b/libc/bionic/mmap.c
index 40a6538..e097086 100644
--- a/libc/bionic/mmap.c
+++ b/libc/bionic/mmap.c
@@ -34,10 +34,17 @@
#define MMAP2_SHIFT 12
void* mmap(void *addr, size_t size, int prot, int flags, int fd, long offset)
{
+ void *ret;
+
if (offset & ((1UL << MMAP2_SHIFT)-1)) {
errno = EINVAL;
return MAP_FAILED;
}
- return __mmap2(addr, size, prot, flags, fd, (size_t)offset >> MMAP2_SHIFT);
+ ret = __mmap2(addr, size, prot, flags, fd, (size_t)offset >> MMAP2_SHIFT);
+
+ if (ret && (flags & (MAP_PRIVATE | MAP_ANONYMOUS)))
+ madvise(ret, size, MADV_MERGEABLE);
+
+ return ret;
}