diff options
author | otto <> | 2008-10-03 18:42:45 +0000 |
---|---|---|
committer | otto <> | 2008-10-03 18:42:45 +0000 |
commit | e9d8e1f43896f8752171ff643f6493d7d037d8ea (patch) | |
tree | 0555645790b8f4d564b0d04263139debb9669413 /src/lib | |
parent | f66df9ff12877d936e2cd354c357ff72eea183d6 (diff) | |
download | openbsd-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.c | 27 |
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) |