From e9d8e1f43896f8752171ff643f6493d7d037d8ea Mon Sep 17 00:00:00 2001 From: otto <> Date: Fri, 3 Oct 2008 18:42:45 +0000 Subject: avoid spitting up regions when purging stuff from the cache, it puts too much pressure on the amaps. ok tedu@ deraadt@ --- src/lib/libc/stdlib/malloc.c | 27 ++++++++++----------------- 1 file changed, 10 insertions(+), 17 deletions(-) (limited to 'src/lib/libc/stdlib') diff --git a/src/lib/libc/stdlib/malloc.c b/src/lib/libc/stdlib/malloc.c index be80640e81..1bd5c9f89c 100644 --- a/src/lib/libc/stdlib/malloc.c +++ b/src/lib/libc/stdlib/malloc.c @@ -1,4 +1,4 @@ -/* $OpenBSD: malloc.c,v 1.98 2008/08/25 17:56:17 otto Exp $ */ +/* $OpenBSD: malloc.c,v 1.99 2008/10/03 18:42:45 otto Exp $ */ /* * Copyright (c) 2008 Otto Moerbeek * @@ -402,28 +402,21 @@ unmap(struct dir_info *d, void *p, size_t sz) rsz = malloc_cache - d->free_regions_size; if (psz > rsz) tounmap = psz - rsz; - d->free_regions_size -= tounmap; offset = getrbyte(); for (i = 0; tounmap > 0 && i < malloc_cache; i++) { r = &d->free_regions[(i + offset) & (malloc_cache - 1)]; if (r->p != NULL) { - if (r->size <= tounmap) { - rsz = r->size << MALLOC_PAGESHIFT; - if (munmap(r->p, rsz)) - wrterror("munmap"); + rsz = r->size << MALLOC_PAGESHIFT; + if (munmap(r->p, rsz)) + wrterror("munmap"); + r->p = NULL; + if (tounmap > r->size) tounmap -= r->size; - r->p = NULL; - r->size = 0; - malloc_used -= rsz; - } else { - rsz = tounmap << MALLOC_PAGESHIFT; - if (munmap((char *)r->p + ((r->size - tounmap) - << MALLOC_PAGESHIFT), rsz)) - wrterror("munmap"); - r->size -= tounmap ; + else tounmap = 0; - malloc_used -= rsz; - } + d->free_regions_size -= r->size; + r->size = 0; + malloc_used -= rsz; } } if (tounmap > 0) -- cgit v1.2.3-55-g6feb