* 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).