From 2cdf07aba971d1e21edc203e7d4073b6ce8e72b9 Mon Sep 17 00:00:00 2001 From: Jason Evans Date: Fri, 11 Nov 2016 21:14:29 -0800 Subject: Fix extent_quantize() to handle greater-than-huge-size extents. Allocation requests can't directly create extents that exceed HUGE_MAXCLASS, but extent merging can create them. This fixes a regression caused by 8a03cf039cd06f9fa6972711195055d865673966 (Implement cache index randomization for large allocations.) and first released in 4.0.0. This resolves #497. --- src/extent.c | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/src/extent.c b/src/extent.c index 9f5146e..828f627 100644 --- a/src/extent.c +++ b/src/extent.c @@ -3,15 +3,29 @@ /******************************************************************************/ +/* + * Round down to the nearest chunk size that can actually be requested during + * normal huge allocation. + */ JEMALLOC_INLINE_C size_t extent_quantize(size_t size) { + size_t ret; + szind_t ind; - /* - * Round down to the nearest chunk size that can actually be requested - * during normal huge allocation. - */ - return (index2size(size2index(size + 1) - 1)); + assert(size > 0); + + ind = size2index(size + 1); + if (ind == NSIZES) { + /* + * Allocation requests can't directly create extents that exceed + * HUGE_MAXCLASS, but extent merging can create them. + */ + return (HUGE_MAXCLASS); + } + ret = index2size(ind - 1); + assert(ret <= size); + return (ret); } JEMALLOC_INLINE_C int -- cgit v0.12