summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorotto <>2008-10-03 18:42:45 +0000
committerotto <>2008-10-03 18:42:45 +0000
commite9d8e1f43896f8752171ff643f6493d7d037d8ea (patch)
tree0555645790b8f4d564b0d04263139debb9669413 /src/lib
parentf66df9ff12877d936e2cd354c357ff72eea183d6 (diff)
downloadopenbsd-e9d8e1f43896f8752171ff643f6493d7d037d8ea.tar.gz
openbsd-e9d8e1f43896f8752171ff643f6493d7d037d8ea.tar.bz2
openbsd-e9d8e1f43896f8752171ff643f6493d7d037d8ea.zip
avoid spitting up regions when purging stuff from the cache, it puts
too much pressure on the amaps. ok tedu@ deraadt@
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/libc/stdlib/malloc.c27
1 files changed, 10 insertions, 17 deletions
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 @@
1/* $OpenBSD: malloc.c,v 1.98 2008/08/25 17:56:17 otto Exp $ */ 1/* $OpenBSD: malloc.c,v 1.99 2008/10/03 18:42:45 otto Exp $ */
2/* 2/*
3 * Copyright (c) 2008 Otto Moerbeek <otto@drijf.net> 3 * Copyright (c) 2008 Otto Moerbeek <otto@drijf.net>
4 * 4 *
@@ -402,28 +402,21 @@ unmap(struct dir_info *d, void *p, size_t sz)
402 rsz = malloc_cache - d->free_regions_size; 402 rsz = malloc_cache - d->free_regions_size;
403 if (psz > rsz) 403 if (psz > rsz)
404 tounmap = psz - rsz; 404 tounmap = psz - rsz;
405 d->free_regions_size -= tounmap;
406 offset = getrbyte(); 405 offset = getrbyte();
407 for (i = 0; tounmap > 0 && i < malloc_cache; i++) { 406 for (i = 0; tounmap > 0 && i < malloc_cache; i++) {
408 r = &d->free_regions[(i + offset) & (malloc_cache - 1)]; 407 r = &d->free_regions[(i + offset) & (malloc_cache - 1)];
409 if (r->p != NULL) { 408 if (r->p != NULL) {
410 if (r->size <= tounmap) { 409 rsz = r->size << MALLOC_PAGESHIFT;
411 rsz = r->size << MALLOC_PAGESHIFT; 410 if (munmap(r->p, rsz))
412 if (munmap(r->p, rsz)) 411 wrterror("munmap");
413 wrterror("munmap"); 412 r->p = NULL;
413 if (tounmap > r->size)
414 tounmap -= r->size; 414 tounmap -= r->size;
415 r->p = NULL; 415 else
416 r->size = 0;
417 malloc_used -= rsz;
418 } else {
419 rsz = tounmap << MALLOC_PAGESHIFT;
420 if (munmap((char *)r->p + ((r->size - tounmap)
421 << MALLOC_PAGESHIFT), rsz))
422 wrterror("munmap");
423 r->size -= tounmap ;
424 tounmap = 0; 416 tounmap = 0;
425 malloc_used -= rsz; 417 d->free_regions_size -= r->size;
426 } 418 r->size = 0;
419 malloc_used -= rsz;
427 } 420 }
428 } 421 }
429 if (tounmap > 0) 422 if (tounmap > 0)