From: Eric Wong <e@80x24.org>
To: mwrap-perl@80x24.org
Subject: [PATCH 1/3] dlmalloc: use jemalloc-inspired size classes
Date: Wed, 3 Apr 2024 21:42:20 +0000 [thread overview]
Message-ID: <20240403214222.3258695-2-e@80x24.org> (raw)
In-Reply-To: <20240403214222.3258695-1-e@80x24.org>
For allocations too small for direct mmap and too large for
fastbins, use jemalloc-inspired size classes to reduce
fragmentation. This means mid-sized allocations pay a 0-20%
overhead to improve the likelyhood of having a good fit
(and not "best fit") over repeated allocations and frees.
---
mwrap_core.h | 39 +++++++++++++++++++++++++++++++++++----
1 file changed, 35 insertions(+), 4 deletions(-)
diff --git a/mwrap_core.h b/mwrap_core.h
index 7ccf6ad..78c14e3 100644
--- a/mwrap_core.h
+++ b/mwrap_core.h
@@ -661,11 +661,39 @@ void *pvalloc(size_t size)
return memalign_result(err, p);
}
+static inline size_t size_class_pad(size_t bytes)
+{
+ if (bytes <= MAX_SMALL_REQUEST)
+ return bytes;
+
+ size_t mm_thresh = mparams.mmap_threshold;
+
+ if (bytes >= mm_thresh)
+ return bytes;
+
+ /*
+ * Use jemalloc-inspired size classes for mid-size allocations to
+ * minimize fragmentation. This means we pay a 0-20% overhead on
+ * the initial allocations to improve the likelyhood of reuse.
+ */
+ size_t max = sizeof(void *) << 5;
+ size_t nxt;
+ do {
+ if (bytes <= max) {
+ size_t sc_bytes = size_align(bytes, max >> 3);
+ return sc_bytes <= mm_thresh ? sc_bytes : bytes;
+ }
+ nxt = max << 1;
+ } while (nxt > max && nxt < mm_thresh && (max = nxt));
+
+ return bytes;
+}
+
void *malloc(size_t size)
{
- size_t asize;
+ size_t asize = size_class_pad(size);
- if (__builtin_add_overflow(size, sizeof(struct alloc_hdr), &asize))
+ if (__builtin_add_overflow(asize, sizeof(struct alloc_hdr), &asize))
goto enomem;
void *p = real_malloc(asize);
@@ -686,7 +714,9 @@ void *calloc(size_t nmemb, size_t size)
if (__builtin_mul_overflow(size, nmemb, &size))
goto enomem;
- if (__builtin_add_overflow(size, sizeof(struct alloc_hdr), &asize))
+
+ asize = size_class_pad(size);
+ if (__builtin_add_overflow(asize, sizeof(struct alloc_hdr), &asize))
goto enomem;
void *p = real_malloc(asize);
if (p) {
@@ -708,7 +738,8 @@ void *realloc(void *ptr, size_t size)
free(ptr);
return 0;
}
- if (__builtin_add_overflow(size, sizeof(struct alloc_hdr), &asize))
+ asize = size_class_pad(size);
+ if (__builtin_add_overflow(asize, sizeof(struct alloc_hdr), &asize))
goto enomem;
void *p = real_malloc(asize);
if (p) {
next prev parent reply other threads:[~2024-04-03 21:42 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-04-03 21:42 [PATCH 0/3] introduce size classes to reduce fragmentation Eric Wong
2024-04-03 21:42 ` Eric Wong [this message]
2024-04-03 21:42 ` [PATCH 2/3] implement dynamic mmap threshold Eric Wong
2024-04-03 21:42 ` [PATCH 3/3] malloc: revert file-backed mmap, sbrk for main arena Eric Wong
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240403214222.3258695-2-e@80x24.org \
--to=e@80x24.org \
--cc=mwrap-perl@80x24.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://80x24.org/mwrap-perl.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).