mailing list of musl libc
 help / color / mirror / code / Atom feed
* unneeded mremap calls in realloc
@ 2011-11-16  0:45 Szabolcs Nagy
  2011-11-17  2:50 ` Rich Felker
  2011-11-17  5:02 ` Rich Felker
  0 siblings, 2 replies; 4+ messages in thread
From: Szabolcs Nagy @ 2011-11-16  0:45 UTC (permalink / raw)
  To: musl


as discussed on irc, in realloc there is a mremap
where newlen is pagesize adjusted but oldlen is not
so oldlen==newlen almost always fails

run this simple test case with strace to see the issue:

#include <stdlib.h>
int main(){
	char *p = 0;
	int n;

	for (n = 0; n < 500000; n++)
		p = realloc(p, n);
	free(p);
	return 0;
}

the fix that significantly speeds up the above code:
(there might be better fix, eg why oldlen is not a
multiple of pagesize in the first place?)

diff --git a/src/malloc/malloc.c b/src/malloc/malloc.c
index abf3e8f..8e9b022 100644
--- a/src/malloc/malloc.c
+++ b/src/malloc/malloc.c
@@ -401,7 +401,7 @@ void *realloc(void *p, size_t n)
                        return new;
                }
                newlen = (newlen + PAGE_SIZE-1) & -PAGE_SIZE;
-               if (oldlen == newlen) return p;
+               if (((oldlen + PAGE_SIZE-1) & -PAGE_SIZE) == newlen) return p;
                base = __mremap(base, oldlen, newlen, MREMAP_MAYMOVE);
                if (base == (void *)-1)
                        return newlen < oldlen ? p : 0;


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: unneeded mremap calls in realloc
  2011-11-16  0:45 unneeded mremap calls in realloc Szabolcs Nagy
@ 2011-11-17  2:50 ` Rich Felker
  2011-11-17  5:02 ` Rich Felker
  1 sibling, 0 replies; 4+ messages in thread
From: Rich Felker @ 2011-11-17  2:50 UTC (permalink / raw)
  To: musl

On Wed, Nov 16, 2011 at 01:45:37AM +0100, Szabolcs Nagy wrote:
> 
> as discussed on irc, in realloc there is a mremap
> where newlen is pagesize adjusted but oldlen is not
> so oldlen==newlen almost always fails
> 
> run this simple test case with strace to see the issue:
> 
> #include <stdlib.h>
> int main(){
> 	char *p = 0;
> 	int n;
> 
> 	for (n = 0; n < 500000; n++)
> 		p = realloc(p, n);
> 	free(p);
> 	return 0;
> }
> 
> the fix that significantly speeds up the above code:
> (there might be better fix, eg why oldlen is not a
> multiple of pagesize in the first place?)

oldlen should always be a multiple of page size.. Need to check out
why it's not...

Rich


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: unneeded mremap calls in realloc
  2011-11-16  0:45 unneeded mremap calls in realloc Szabolcs Nagy
  2011-11-17  2:50 ` Rich Felker
@ 2011-11-17  5:02 ` Rich Felker
  2011-11-17 12:31   ` Szabolcs Nagy
  1 sibling, 1 reply; 4+ messages in thread
From: Rich Felker @ 2011-11-17  5:02 UTC (permalink / raw)
  To: musl

On Wed, Nov 16, 2011 at 01:45:37AM +0100, Szabolcs Nagy wrote:
> (there might be better fix, eg why oldlen is not a
> multiple of pagesize in the first place?)

oldlen was computed in terms of CHUNK_SIZE macro, which was incorrect
for mmapped chunks (masking off too many bits). should be fixed now.

Rich


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: unneeded mremap calls in realloc
  2011-11-17  5:02 ` Rich Felker
@ 2011-11-17 12:31   ` Szabolcs Nagy
  0 siblings, 0 replies; 4+ messages in thread
From: Szabolcs Nagy @ 2011-11-17 12:31 UTC (permalink / raw)
  To: musl

* Rich Felker <dalias@aerifal.cx> [2011-11-17 00:02:53 -0500]:

> On Wed, Nov 16, 2011 at 01:45:37AM +0100, Szabolcs Nagy wrote:
> > (there might be better fix, eg why oldlen is not a
> > multiple of pagesize in the first place?)
> 
> oldlen was computed in terms of CHUNK_SIZE macro, which was incorrect
> for mmapped chunks (masking off too many bits). should be fixed now.
> 
> Rich

btw in realloc there is this comment:

        /* FIXME: find what's wrong here and reenable it..? */
        if (0 && n > n1 && alloc_rev(self)) {
                self = PREV_CHUNK(self);
                n1 += CHUNK_SIZE(self);
        }

can it be that the CHUNK_SIZE fix solves this as well?


^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2011-11-17 12:31 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-11-16  0:45 unneeded mremap calls in realloc Szabolcs Nagy
2011-11-17  2:50 ` Rich Felker
2011-11-17  5:02 ` Rich Felker
2011-11-17 12:31   ` Szabolcs Nagy

Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/musl/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).