From bd225324bc666212ec5cc89e6869fb5ffd61e0d9 Mon Sep 17 00:00:00 2001 From: tedu <> Date: Wed, 20 Jun 2012 13:13:15 +0000 Subject: [PATCH] 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 --- src/lib/libc/stdlib/malloc.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/lib/libc/stdlib/malloc.c b/src/lib/libc/stdlib/malloc.c index 6f646934..92efd7d6 100644 --- a/src/lib/libc/stdlib/malloc.c +++ b/src/lib/libc/stdlib/malloc.c @@ -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 * @@ -317,7 +317,7 @@ unmap(struct dir_info *d, void *p, size_t sz) rsz = mopts.malloc_cache - d->free_regions_size; if (psz > rsz) tounmap = psz - rsz; - offset = getrnibble(); + offset = getrnibble() + getrnibble() << 4; for (i = 0; tounmap > 0 && i < mopts.malloc_cache; i++) { r = &d->free_regions[(i + offset) & (mopts.malloc_cache - 1)]; if (r->p != NULL) { @@ -337,7 +337,7 @@ unmap(struct dir_info *d, void *p, size_t sz) if (tounmap > 0) wrterror("malloc cache underflow", NULL); 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 (mopts.malloc_hint) madvise(p, sz, MADV_FREE); @@ -398,7 +398,7 @@ map(struct dir_info *d, size_t sz, int zero_fill) /* zero fill not needed */ return p; } - offset = getrnibble(); + offset = getrnibble() + getrnibble() << 4; for (i = 0; i < mopts.malloc_cache; i++) { r = &d->free_regions[(i + offset) & (mopts.malloc_cache - 1)]; if (r->p != NULL) {