diff options
author | otto <> | 2018-01-18 20:06:16 +0000 |
---|---|---|
committer | otto <> | 2018-01-18 20:06:16 +0000 |
commit | 1d8e5453558fbe5e97fd1becfef826a261de138b (patch) | |
tree | 933a516d06567570ed43b303fa8dfdf5413926e6 | |
parent | 39f9d0d750f0517e592c2d361676578af5aeb0dd (diff) | |
download | openbsd-1d8e5453558fbe5e97fd1becfef826a261de138b.tar.gz openbsd-1d8e5453558fbe5e97fd1becfef826a261de138b.tar.bz2 openbsd-1d8e5453558fbe5e97fd1becfef826a261de138b.zip |
Zap the rotor, it was a wrong idea. Cluebat applied by kshe who
came also up with this diff. Simple, no bias and benchmarks show the extra
random calls disappear in te measurement noise.
-rw-r--r-- | src/lib/libc/stdlib/malloc.c | 9 |
1 files changed, 3 insertions, 6 deletions
diff --git a/src/lib/libc/stdlib/malloc.c b/src/lib/libc/stdlib/malloc.c index 40c602a1ae..97d77b0a63 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.240 2018/01/18 08:37:28 otto Exp $ */ | 1 | /* $OpenBSD: malloc.c,v 1.241 2018/01/18 20:06:16 otto Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2008, 2010, 2011, 2016 Otto Moerbeek <otto@drijf.net> | 3 | * Copyright (c) 2008, 2010, 2011, 2016 Otto Moerbeek <otto@drijf.net> |
4 | * Copyright (c) 2012 Matthew Dempsky <matthew@openbsd.org> | 4 | * Copyright (c) 2012 Matthew Dempsky <matthew@openbsd.org> |
@@ -172,7 +172,6 @@ struct chunk_info { | |||
172 | u_short free; /* how many free chunks */ | 172 | u_short free; /* how many free chunks */ |
173 | u_short total; /* how many chunks */ | 173 | u_short total; /* how many chunks */ |
174 | u_short offset; /* requested size table offset */ | 174 | u_short offset; /* requested size table offset */ |
175 | u_short rotor; /* randomization rotor */ | ||
176 | u_short bits[1]; /* which chunks are free */ | 175 | u_short bits[1]; /* which chunks are free */ |
177 | }; | 176 | }; |
178 | 177 | ||
@@ -941,7 +940,7 @@ malloc_bytes(struct dir_info *d, size_t size, void *f) | |||
941 | 940 | ||
942 | j = find_chunksize(size); | 941 | j = find_chunksize(size); |
943 | 942 | ||
944 | r = getrbyte(d); | 943 | r = ((u_int)getrbyte(d) << 8) | getrbyte(d); |
945 | listnum = r % MALLOC_CHUNK_LISTS; | 944 | listnum = r % MALLOC_CHUNK_LISTS; |
946 | /* If it's empty, make a page more of that size chunks */ | 945 | /* If it's empty, make a page more of that size chunks */ |
947 | if ((bp = LIST_FIRST(&d->chunk_dir[j][listnum])) == NULL) { | 946 | if ((bp = LIST_FIRST(&d->chunk_dir[j][listnum])) == NULL) { |
@@ -953,9 +952,7 @@ malloc_bytes(struct dir_info *d, size_t size, void *f) | |||
953 | if (bp->canary != (u_short)d->canary1) | 952 | if (bp->canary != (u_short)d->canary1) |
954 | wrterror(d, "chunk info corrupted"); | 953 | wrterror(d, "chunk info corrupted"); |
955 | 954 | ||
956 | if (bp->free > 1) | 955 | i = (r / MALLOC_CHUNK_LISTS) & (bp->total - 1); |
957 | bp->rotor += r; | ||
958 | i = bp->rotor++ & (bp->total - 1); | ||
959 | 956 | ||
960 | /* start somewhere in a short */ | 957 | /* start somewhere in a short */ |
961 | lp = &bp->bits[i / MALLOC_BITS]; | 958 | lp = &bp->bits[i / MALLOC_BITS]; |