v20251126-0009-mbind-procs.patch
text/x-patch
Filename: v20251126-0009-mbind-procs.patch
Type: text/x-patch
Part: 0
Message:
Re: Adding basic NUMA awareness
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: format-patch
Series: patch v20251126-0009
Subject: mbind: procs
| File | + | − |
|---|---|---|
| src/backend/storage/lmgr/proc.c | 14 | 3 |
From 6a7b5f0c48b861a78baafad699802752edfce669 Mon Sep 17 00:00:00 2001
From: Tomas Vondra <tomas@vondra.me>
Date: Wed, 26 Nov 2025 17:13:09 +0100
Subject: [PATCH v20251126 9/9] mbind: procs
---
src/backend/storage/lmgr/proc.c | 17 ++++++++++++++---
1 file changed, 14 insertions(+), 3 deletions(-)
diff --git a/src/backend/storage/lmgr/proc.c b/src/backend/storage/lmgr/proc.c
index 0a0ce98b725..3d76a3a6429 100644
--- a/src/backend/storage/lmgr/proc.c
+++ b/src/backend/storage/lmgr/proc.c
@@ -206,11 +206,14 @@ FastPathLockShmemSize(void)
* when not strictly needed (if it's already aligned). And we always
* assume we'll add a whole page, even if the alignment needs only less
* memory.
+ *
+ * XXX We need two extra pages. One for the non-NUMA part (aux processes),
+ * and one to keep the size of the last chunk aligned too.
*/
if (((numa_flags & NUMA_PROCS) != 0) && numa_can_partition)
{
Assert(numa_nodes > 0);
- size = add_size(size, mul_size((numa_nodes + 1), numa_page_size));
+ size = add_size(size, mul_size((numa_nodes + 2), numa_page_size));
}
return size;
@@ -324,6 +327,7 @@ InitProcGlobal(void)
/* Used for setup of per-backend fast-path slots. */
char *fpPtr,
+ *fpPtrOrig,
*fpEndPtr PG_USED_FOR_ASSERTS_ONLY;
Size fpLockBitsSize,
fpRelIdSize;
@@ -507,7 +511,7 @@ InitProcGlobal(void)
requestSize,
&found);
- MemSet(fpPtr, 0, requestSize);
+ fpPtrOrig = fpPtr;
/* For asserts checking we did not overflow. */
fpEndPtr = fpPtr + requestSize;
@@ -595,6 +599,9 @@ InitProcGlobal(void)
Assert(fpPtr <= fpEndPtr);
}
+ /* zero the memory only after locating the memory to NUMA nodes */
+ MemSet(fpPtrOrig, 0, requestSize);
+
for (i = 0; i < TotalProcs; i++)
{
PGPROC *proc = procs[i];
@@ -2521,7 +2528,10 @@ fastpath_partition_init(char *ptr, int num_procs, int allprocs_index, int node,
* memory, to make sure it's not mapped to any node yet
*/
if (node != -1)
+ {
+ endptr = (char *) TYPEALIGN(numa_page_size, endptr);
pg_numa_move_to_node(ptr, endptr, node);
+ }
/*
* Now point the PGPROC entries to the fast-path arrays, and also advance
@@ -2550,7 +2560,8 @@ fastpath_partition_init(char *ptr, int num_procs, int allprocs_index, int node,
allprocs_index++;
}
- Assert(ptr == endptr);
+ Assert(ptr <= endptr);
+ Assert((node == -1) || (char *) TYPEALIGN(numa_page_size, ptr) == endptr);
return endptr;
}
--
2.51.1