OSDN Git Service

mmap: Reinstate passing MADV_MERGEABLE on private anonymous maps
authorRom Lemarchand <romlem@google.com>
Sat, 18 May 2013 00:08:41 +0000 (17:08 -0700)
committerElliott Hughes <enh@google.com>
Wed, 17 Jul 2013 20:00:45 +0000 (13:00 -0700)
Reinstate mmap calling madvise(MADV_MERGEABLE) removed in
635df850e5037be5093f64a87ec2e0a23bf7a50b

(cherry-pick of c702a904679a36511bead29c51eeac15d81f4fd2.)

Change-Id: I18803fb54701b2b3d8186dff5c678211ee3efa1f

libc/bionic/mmap.c

index 40a6538..e097086 100644 (file)
@@ -34,10 +34,17 @@ extern void*  __mmap2(void*, size_t, int, int, int, size_t);
 #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;
 }