Index | Thread | Search

From:
David Gwynne <david@gwynne.id.au>
Subject:
increase the 9k mbuf clusters to 9k + 128 bytes
To:
tech@openbsd.org
Date:
Wed, 22 Apr 2026 14:46:49 +1000

Download raw body.

Thread
tl;dr: we can make the 9k clusters a bit bigger for free, which
will give me some wiggle room in places that like to work in kilobyte
chunks but don't make allowances for payload alignment. iykyk.

long version:

pools try to amortise the cost of items against the underlying
kernel memory allocator by rounding the "page" size up to fit at
least 8 items, and then rounding that up to the next power of 2.
the 9k clusters are 9 * 1024 bytes, which is 72k after being
multiplied by 8, which becomes 128k cos it's the next power of 2.
if you divide 128k by 9k, you get 14 and some change. there's enough
change that we can raise the cluster size by 128 bytes without
affecting the page size or the number of items on the page. ie,
it's still going to use 128k "pages" and fit 14 clusters.

i can take advantage of this in some drivers for stupid hardware,
so given the above it seems like a plan without any drawbacks apart
from the pool name getting a bit bigger.

im going to commit this in the next day or so unless anyone can
find a good reason for me not to.

Index: sys/kern/uipc_mbuf.c
===================================================================
RCS file: /cvs/src/sys/kern/uipc_mbuf.c,v
diff -u -p -r1.304 uipc_mbuf.c
--- sys/kern/uipc_mbuf.c	5 Feb 2026 03:26:00 -0000	1.304
+++ sys/kern/uipc_mbuf.c	22 Apr 2026 04:19:35 -0000
@@ -109,12 +109,12 @@ u_int	mclsizes[MCLPOOLS] = {
 	MCLBYTES + 2,	/* ETHER_ALIGNED 2k mbufs */
 	4 * 1024,
 	8 * 1024,
-	9 * 1024,
+	(9 * 1024) + 128, /* use more of the pool page for ETHER_ALIGNED etc */
 	12 * 1024,
 	16 * 1024,
 	64 * 1024
 };
-static	char mclnames[MCLPOOLS][8];
+static	char mclnames[MCLPOOLS][16];
 struct	pool mclpools[MCLPOOLS];
 
 struct pool *m_clpool(u_int);
Index: usr.bin/netstat/mbuf.c
===================================================================
RCS file: /cvs/src/usr.bin/netstat/mbuf.c,v
diff -u -p -r1.47 mbuf.c
--- usr.bin/netstat/mbuf.c	22 Jun 2025 11:34:40 -0000	1.47
+++ usr.bin/netstat/mbuf.c	22 Apr 2026 04:19:35 -0000
@@ -57,7 +57,7 @@ char	*mclnames[] = {
 	"mcl2k2",
 	"mcl4k",
 	"mcl8k",
-	"mcl9k",
+	"mcl9k128",
 	"mcl12k",
 	"mcl16k",
 	"mcl64k"