This is the mail archive of the libc-hacker@sources.redhat.com mailing list for the glibc project.

Note that libc-hacker is a closed list. You may look at the archives of this list, but subscription and posting are not open.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

[PATCH] Avoid munmap(x, 0) in malloc


Hi!

For second and following new_heap unless mmap is used in the mean time
mmap(, HEAP_MAX_SIZE << 1, ...) will be very likely aligned to
HEAP_MAX_SIZE, so I think it is worth avoiding an useless munmap(x, 0)
syscall at the cost of a conditional branch. Do you agree?
Below is how a typicall new_heap looks in strace.

2001-07-18  Jakub Jelinek  <jakub@redhat.com>

	* malloc/malloc (new_heap): Don't call munmap for zero length.

--- libc/malloc/malloc.c.jj	Sat May  5 15:47:23 2001
+++ libc/malloc/malloc.c	Wed Jul 18 22:18:15 2001
@@ -2031,7 +2031,8 @@ new_heap(size) size_t size;
   if(p1 != MAP_FAILED) {
     p2 = (char *)(((unsigned long)p1 + (HEAP_MAX_SIZE-1)) & ~(HEAP_MAX_SIZE-1));
     ul = p2 - p1;
-    munmap(p1, ul);
+    if (ul)
+      munmap(p1, ul);
     munmap(p2 + HEAP_MAX_SIZE, HEAP_MAX_SIZE - ul);
   } else {
     /* Try to take the chance that an allocation of only HEAP_MAX_SIZE

mprotect(0x402fd000, 4096, PROT_READ|PROT_WRITE) = 0
mprotect(0x402fe000, 4096, PROT_READ|PROT_WRITE) = 0
mprotect(0x402ff000, 4096, PROT_READ|PROT_WRITE) = 0
mmap2(NULL, 2097152, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_NORESERVE, -1, 0) = 0x40300000
munmap(0x40300000, 0)                   = -1 EINVAL (Invalid argument)
munmap(0x40400000, 1048576)             = 0
mprotect(0x40300000, 32768, PROT_READ|PROT_WRITE) = 0
mprotect(0x40308000, 4096, PROT_READ|PROT_WRITE) = 0
mprotect(0x40309000, 4096, PROT_READ|PROT_WRITE) = 0
...
mprotect(0x403fd000, 4096, PROT_READ|PROT_WRITE) = 0
mprotect(0x403fe000, 4096, PROT_READ|PROT_WRITE) = 0
mprotect(0x403ff000, 4096, PROT_READ|PROT_WRITE) = 0
mmap2(NULL, 2097152, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_NORESERVE, -1, 0) = 0x40400000
munmap(0x40400000, 0)                   = -1 EINVAL (Invalid argument)
munmap(0x40500000, 1048576)             = 0
mprotect(0x40400000, 32768, PROT_READ|PROT_WRITE) = 0
mprotect(0x40408000, 4096, PROT_READ|PROT_WRITE) = 0

	Jakub


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]