Browse Source

two small fixes to free page cache. first, we need two nibbles of random

in order to span the the entire cache.  second, on free use the same offset
to put things in the cache instead of always starting at zero.
ok otto
OPENBSD_5_2
tedu 12 years ago
parent
commit
bd225324bc
1 changed files with 4 additions and 4 deletions
  1. +4
    -4
      src/lib/libc/stdlib/malloc.c

+ 4
- 4
src/lib/libc/stdlib/malloc.c View File

@ -1,4 +1,4 @@
/* $OpenBSD: malloc.c,v 1.142 2012/06/18 17:03:51 matthew Exp $ */
/* $OpenBSD: malloc.c,v 1.143 2012/06/20 13:13:15 tedu Exp $ */
/* /*
* Copyright (c) 2008 Otto Moerbeek <otto@drijf.net> * Copyright (c) 2008 Otto Moerbeek <otto@drijf.net>
* *
@ -317,7 +317,7 @@ unmap(struct dir_info *d, void *p, size_t sz)
rsz = mopts.malloc_cache - d->free_regions_size; rsz = mopts.malloc_cache - d->free_regions_size;
if (psz > rsz) if (psz > rsz)
tounmap = psz - rsz; tounmap = psz - rsz;
offset = getrnibble();
offset = getrnibble() + getrnibble() << 4;
for (i = 0; tounmap > 0 && i < mopts.malloc_cache; i++) { for (i = 0; tounmap > 0 && i < mopts.malloc_cache; i++) {
r = &d->free_regions[(i + offset) & (mopts.malloc_cache - 1)]; r = &d->free_regions[(i + offset) & (mopts.malloc_cache - 1)];
if (r->p != NULL) { if (r->p != NULL) {
@ -337,7 +337,7 @@ unmap(struct dir_info *d, void *p, size_t sz)
if (tounmap > 0) if (tounmap > 0)
wrterror("malloc cache underflow", NULL); wrterror("malloc cache underflow", NULL);
for (i = 0; i < mopts.malloc_cache; i++) { for (i = 0; i < mopts.malloc_cache; i++) {
r = &d->free_regions[i];
r = &d->free_regions[(i + offset) & (mopts.malloc_cache - 1)];
if (r->p == NULL) { if (r->p == NULL) {
if (mopts.malloc_hint) if (mopts.malloc_hint)
madvise(p, sz, MADV_FREE); madvise(p, sz, MADV_FREE);
@ -398,7 +398,7 @@ map(struct dir_info *d, size_t sz, int zero_fill)
/* zero fill not needed */ /* zero fill not needed */
return p; return p;
} }
offset = getrnibble();
offset = getrnibble() + getrnibble() << 4;
for (i = 0; i < mopts.malloc_cache; i++) { for (i = 0; i < mopts.malloc_cache; i++) {
r = &d->free_regions[(i + offset) & (mopts.malloc_cache - 1)]; r = &d->free_regions[(i + offset) & (mopts.malloc_cache - 1)];
if (r->p != NULL) { if (r->p != NULL) {


Loading…
Cancel
Save