mwrap (Perl version) user+dev discussion/patches/pulls/bugs/help
 help / color / mirror / code / Atom feed
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) {

  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).