On Tue, Apr 22, 2014 at 09:49:42PM -0400, Ted Unangst wrote: > On Mon, Apr 14, 2014 at 12:12, Otto Moerbeek wrote: > > On Sun, Apr 13, 2014 at 06:34:17PM -0400, Ted Unangst wrote: > > > >> I took another look at the way junk works in malloc, and there's a few > >> improvements I'd like to make. > > >> I have't been able to build perl reliably with this diff, but haven't > >> ruled out the 5.18 update either. > > This was just update/make -j 2 wonkiness. All good now. > > > - always junk half a page? Maybe that's a tad over done, athough it > > might be relatively cheap since your writing the page anyway. > > > > - Chunks are now always completely junked on free, maybe a bit > > overdone for malloc_junk = 1 > > It doesn't seem any slower. I'd like to commit this, then see if > anybody complains loud enough for me to hear them. :) hard to get > consistent build times these days... > > > - if we are freeing a large region, it does not end up in the cache, > > so junking (part of) it is a waste of effort. (That already is the > > case for current, you are not introducing that). > > There's a few other things I'd like to change about the freelist. Next > diff. > > > - What about 'j'? Do we want it to cancel a J or always disable > > junking? > > I think disable entirely is the right answer. > > Here's the diff again. I was going to update it, but I don't see > anything I want to change. I think it's fine as is for the first round. > (The man page parts already snuck in.)
OK, but we should keep a close watch on performance issues. -Otto > > Index: malloc.c > =================================================================== > RCS file: /cvs/src/lib/libc/stdlib/malloc.c,v > retrieving revision 1.152 > diff -u -p -r1.152 malloc.c > --- malloc.c 3 Apr 2014 16:18:11 -0000 1.152 > +++ malloc.c 13 Apr 2014 21:05:11 -0000 > @@ -167,7 +167,6 @@ struct malloc_readonly { > int malloc_move; /* move allocations to end of page? */ > int malloc_realloc; /* always realloc? */ > int malloc_xmalloc; /* xmalloc behaviour? */ > - int malloc_zero; /* zero fill? */ > size_t malloc_guard; /* use guard pages after allocations? */ > u_int malloc_cache; /* free pages we cache */ > #ifdef MALLOC_STATS > @@ -412,7 +411,7 @@ map(struct dir_info *d, size_t sz, int z > d->free_regions_size -= psz; > if (zero_fill) > memset(p, 0, sz); > - else if (mopts.malloc_junk && > + else if (mopts.malloc_junk == 2 && > mopts.malloc_freeunmap) > memset(p, SOME_FREEJUNK, sz); > return p; > @@ -431,7 +430,7 @@ map(struct dir_info *d, size_t sz, int z > d->free_regions_size -= psz; > if (zero_fill) > memset(p, 0, sz); > - else if (mopts.malloc_junk && mopts.malloc_freeunmap) > + else if (mopts.malloc_junk == 2 && mopts.malloc_freeunmap) > memset(p, SOME_FREEJUNK, sz); > return p; > } > @@ -461,6 +460,7 @@ omalloc_init(struct dir_info **dp) > * Default options > */ > mopts.malloc_abort = 1; > + mopts.malloc_junk = 1; > mopts.malloc_move = 1; > mopts.malloc_cache = MALLOC_DEFAULT_CACHE; > > @@ -534,7 +534,7 @@ omalloc_init(struct dir_info **dp) > mopts.malloc_junk = 0; > break; > case 'J': > - mopts.malloc_junk = 1; > + mopts.malloc_junk = 2; > break; > case 'n': > case 'N': > @@ -557,7 +557,8 @@ omalloc_init(struct dir_info **dp) > mopts.malloc_cache = MALLOC_DEFAULT_CACHE; > break; > case 'S': > - mopts.malloc_freeunmap = mopts.malloc_junk = 1; > + mopts.malloc_freeunmap = 1; > + mopts.malloc_junk = 2; > mopts.malloc_guard = MALLOC_PAGESIZE; > mopts.malloc_cache = 0; > break; > @@ -573,12 +574,6 @@ omalloc_init(struct dir_info **dp) > case 'X': > mopts.malloc_xmalloc = 1; > break; > - case 'z': > - mopts.malloc_zero = 0; > - break; > - case 'Z': > - mopts.malloc_zero = 1; > - break; > default: { > static const char q[] = "malloc() warning: " > "unknown char in MALLOC_OPTIONS\n"; > @@ -589,13 +584,6 @@ omalloc_init(struct dir_info **dp) > } > } > > - /* > - * We want junk in the entire allocation, and zero only in the part > - * the user asked for. > - */ > - if (mopts.malloc_zero) > - mopts.malloc_junk = 1; > - > #ifdef MALLOC_STATS > if (mopts.malloc_stats && (atexit(malloc_exit) == -1)) { > static const char q[] = "malloc() warning: atexit(2) failed." > @@ -969,7 +957,7 @@ malloc_bytes(struct dir_info *d, size_t > k += (lp - bp->bits) * MALLOC_BITS; > k <<= bp->shift; > > - if (mopts.malloc_junk && bp->size > 0) > + if (mopts.malloc_junk == 2 && bp->size > 0) > memset((char *)bp->page + k, SOME_JUNK, bp->size); > return ((char *)bp->page + k); > } > @@ -1067,16 +1055,16 @@ omalloc(size_t sz, int zero_fill, void * > sz - mopts.malloc_guard < MALLOC_PAGESIZE - > MALLOC_LEEWAY) { > /* fill whole allocation */ > - if (mopts.malloc_junk) > + if (mopts.malloc_junk == 2) > memset(p, SOME_JUNK, psz - mopts.malloc_guard); > /* shift towards the end */ > p = ((char *)p) + ((MALLOC_PAGESIZE - MALLOC_LEEWAY - > (sz - mopts.malloc_guard)) & ~(MALLOC_MINSIZE-1)); > /* fill zeros if needed and overwritten above */ > - if (zero_fill && mopts.malloc_junk) > + if (zero_fill && mopts.malloc_junk == 2) > memset(p, 0, sz - mopts.malloc_guard); > } else { > - if (mopts.malloc_junk) { > + if (mopts.malloc_junk == 2) { > if (zero_fill) > memset((char *)p + sz - > mopts.malloc_guard, > SOME_JUNK, psz - sz); > @@ -1144,7 +1132,7 @@ malloc(size_t size) > malloc_recurse(); > return NULL; > } > - r = omalloc(size, mopts.malloc_zero, CALLER); > + r = omalloc(size, 0, CALLER); > malloc_active--; > _MALLOC_UNLOCK(); > if (r == NULL && mopts.malloc_xmalloc) { > @@ -1196,9 +1184,11 @@ ofree(void *p) > } > malloc_guarded -= mopts.malloc_guard; > } > - if (mopts.malloc_junk && !mopts.malloc_freeunmap) > - memset(p, SOME_FREEJUNK, > - PAGEROUND(sz) - mopts.malloc_guard); > + if (mopts.malloc_junk && !mopts.malloc_freeunmap) { > + size_t amt = mopts.malloc_junk == 1 ? MALLOC_MAXCHUNK : > + PAGEROUND(sz) - mopts.malloc_guard; > + memset(p, SOME_FREEJUNK, amt); > + } > unmap(g_pool, p, PAGEROUND(sz)); > delete(g_pool, r); > } else { > @@ -1302,7 +1292,7 @@ orealloc(void *p, size_t newsz, void *f) > q = MAP_FAILED; > if (q == hint) { > malloc_used += needed; > - if (mopts.malloc_junk) > + if (mopts.malloc_junk == 2) > memset(q, SOME_JUNK, needed); > r->size = newsz; > STATS_SETF(r, f); > @@ -1329,7 +1319,7 @@ orealloc(void *p, size_t newsz, void *f) > STATS_SETF(r, f); > return p; > } else { > - if (newsz > oldsz && mopts.malloc_junk) > + if (newsz > oldsz && mopts.malloc_junk == 2) > memset((char *)p + newsz, SOME_JUNK, > rnewsz - mopts.malloc_guard - newsz); > r->size = gnewsz; > @@ -1338,7 +1328,7 @@ orealloc(void *p, size_t newsz, void *f) > } > } > if (newsz <= oldsz && newsz > oldsz / 2 && !mopts.malloc_realloc) { > - if (mopts.malloc_junk && newsz > 0) > + if (mopts.malloc_junk == 2 && newsz > 0) > memset((char *)p + newsz, SOME_JUNK, oldsz - newsz); > STATS_SETF(r, f); > return p; > @@ -1509,7 +1499,7 @@ omemalign(size_t alignment, size_t sz, i > malloc_guarded += mopts.malloc_guard; > } > > - if (mopts.malloc_junk) { > + if (mopts.malloc_junk == 2) { > if (zero_fill) > memset((char *)p + sz - mopts.malloc_guard, > SOME_JUNK, psz - sz); > @@ -1540,7 +1530,7 @@ posix_memalign(void **memptr, size_t ali > malloc_recurse(); > goto err; > } > - r = omemalign(alignment, size, mopts.malloc_zero, CALLER); > + r = omemalign(alignment, size, 0, CALLER); > malloc_active--; > _MALLOC_UNLOCK(); > if (r == NULL) {