Fix large size class category handling in folly::goodMallocSize()
authorTomislav Novak <tnovak@fb.com>
Fri, 24 Oct 2014 18:46:51 +0000 (11:46 -0700)
committerPavlo Kushnir <pavlo@fb.com>
Sat, 8 Nov 2014 02:20:04 +0000 (18:20 -0800)
Summary:
jemalloc seems to now use `4064 * 1024` as `arena_maxclass`. Therefore,
allocations that fall in the range `(4064*1024, 4072*1024]` will trigger an
assert in `folly::goodMallocSize()` (`nallocx()` will round up sizes within
that range up to the next multiple of 4 MB (chunk size)).

Test Plan: Call to `folly::goodMallocSize(4161568)` no longer triggeres an assert.

Reviewed By: je@fb.com

Subscribers: aalexandre, trunkagent, njormrod, folly-diffs@

FB internal diff: D1638370

Signature: t1:1638370:1414703429:f3ed2cc8dcb183ff4e8367e2c1f884e122605cba

folly/Malloc.h

index fb81eb7f109d156554284da0a082fa9dfa75cfbe..1b9c74d233a1077d3f6891992c48c48f37561af6 100644 (file)
@@ -140,18 +140,11 @@ inline size_t goodMallocSize(size_t minSize) noexcept {
     // Round up to the next multiple of 64; we don't want to trip over
     // cache line boundaries.
     goodSize = (minSize + 63) & ~size_t(63);
-  } else if (minSize <= 3584) {
-    // Round up to the next multiple of 256.  For some size classes jemalloc
-    // will additionally round up to the nearest multiple of 512, hence the
-    // nallocx() call.
-    goodSize = nallocx((minSize + 255) & ~size_t(255), 0);
-  } else if (minSize <= 4072 * 1024) {
-    // Round up to the next multiple of 4KB
-    goodSize = (minSize + 4095) & ~size_t(4095);
   } else {
-    // Holy Moly
-    // Round up to the next multiple of 4MB
-    goodSize = (minSize + 4194303) & ~size_t(4194303);
+    // Boundaries between size classes depend on numerious factors, some of
+    // which can even be modified at run-time. Determine the good allocation
+    // size by calling nallocx() directly.
+    goodSize = nallocx(minSize, 0);
   }
   assert(nallocx(goodSize, 0) == goodSize);
   return goodSize;