summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJP Abgrall <jpa@google.com>2012-03-21 13:19:51 -0700
committerJP Abgrall <jpa@google.com>2012-03-21 13:21:33 -0700
commitb8e1e9685efc82d6ac112b9aa316e7f6bf5186ca (patch)
treeefcb0fbcfd1e3cb904b29d4fe438461c2de1bec8
parent2f33c5a8e489fe9ea3fdcc6c8e54cfbb0b7e35fe (diff)
downloadbionic-b8e1e9685efc82d6ac112b9aa316e7f6bf5186ca.zip
bionic-b8e1e9685efc82d6ac112b9aa316e7f6bf5186ca.tar.gz
bionic-b8e1e9685efc82d6ac112b9aa316e7f6bf5186ca.tar.bz2
bionic: pass MADV_MERGEABLE on private & anonymous mmaps
Change-Id: I8bc167bb33dec6417fe772172697ea6ff97da2f6 Signed-off-by: Iliyan Malchev <malchev@google.com>
-rw-r--r--libc/unistd/mmap.c19
1 files changed, 13 insertions, 6 deletions
diff --git a/libc/unistd/mmap.c b/libc/unistd/mmap.c
index 848abbb..e097086 100644
--- a/libc/unistd/mmap.c
+++ b/libc/unistd/mmap.c
@@ -32,12 +32,19 @@
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* mmap(void *addr, size_t size, int prot, int flags, int fd, long offset)
{
- if ( offset & ((1UL << MMAP2_SHIFT)-1) ) {
- errno = EINVAL;
- return MAP_FAILED;
- }
+ void *ret;
- return __mmap2(addr, size, prot, flags, fd, (size_t)offset >> MMAP2_SHIFT);
+ if (offset & ((1UL << MMAP2_SHIFT)-1)) {
+ errno = EINVAL;
+ return MAP_FAILED;
+ }
+
+ 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;
}