0001-Cleanup-of-pg_numa.c.patch
text/x-patch
Filename: 0001-Cleanup-of-pg_numa.c.patch
Type: text/x-patch
Part: 0
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 0001
Subject: Cleanup of pg_numa.c
| File | + | − |
|---|---|---|
| contrib/pg_buffercache/pg_buffercache_pages.c | 1 | 1 |
| src/backend/storage/ipc/shmem.c | 39 | 1 |
| src/include/port/pg_numa.h | 0 | 3 |
| src/include/storage/shmem.h | 2 | 0 |
| src/port/pg_numa.c | 1 | 37 |
From e1f093d091610d70fba72b2848f25ff44899ea8e Mon Sep 17 00:00:00 2001
From: Tomas Vondra <tomas@vondra.me>
Date: Tue, 8 Apr 2025 23:31:29 +0200
Subject: [PATCH 1/2] Cleanup of pg_numa.c
This moves/renames some of the functions defined in pg_numa.c:
* pg_numa_get_pagesize() is renamed to pg_get_shmem_pagesize(), and
moved to src/backend/storage/ipc/shmem.c. The new name better reflects
that the page size is not related to NUMA, and it's specifically about
the page size used for the main shared memory segment.
* move pg_numa_available() to src/backend/storage/ipc/shmem.c, i.e. into
the backend (which more appropriate for functions callable from SQL).
While at it, improve the comment to explain what page size it returns.
* remove unnecessary includes from src/port/pg_numa.c, adding
unnecessary dependencies (src/port should be suitable for frontent).
These were leftovers from earlier patch versions.
This eliminates unnecessary dependencies on backend symbols, which we
don't want in src/port.
Reported-by: Kirill Reshke <reshkekirill@gmail.com>
Reviewed-by: Andres Freund <andres@anarazel.de>
https://postgr.es/m/CALdSSPi5fj0a7UG7Fmw2cUD1uWuckU_e8dJ+6x-bJEokcSXzqA@mail.gmail.com
---
contrib/pg_buffercache/pg_buffercache_pages.c | 2 +-
src/backend/storage/ipc/shmem.c | 40 ++++++++++++++++++-
src/include/port/pg_numa.h | 3 --
src/include/storage/shmem.h | 2 +
src/port/pg_numa.c | 38 +-----------------
5 files changed, 43 insertions(+), 42 deletions(-)
diff --git a/contrib/pg_buffercache/pg_buffercache_pages.c b/contrib/pg_buffercache/pg_buffercache_pages.c
index c9ceba604b1..e1701bd56ef 100644
--- a/contrib/pg_buffercache/pg_buffercache_pages.c
+++ b/contrib/pg_buffercache/pg_buffercache_pages.c
@@ -343,7 +343,7 @@ pg_buffercache_numa_pages(PG_FUNCTION_ARGS)
* This information is needed before calling move_pages() for NUMA
* node id inquiry.
*/
- os_page_size = pg_numa_get_pagesize();
+ os_page_size = pg_get_shmem_pagesize();
/*
* The pages and block size is expected to be 2^k, so one divides the
diff --git a/src/backend/storage/ipc/shmem.c b/src/backend/storage/ipc/shmem.c
index e10b380e5c7..c9ae3b45b76 100644
--- a/src/backend/storage/ipc/shmem.c
+++ b/src/backend/storage/ipc/shmem.c
@@ -93,6 +93,8 @@ static HTAB *ShmemIndex = NULL; /* primary index hashtable for shmem */
/* To get reliable results for NUMA inquiry we need to "touch pages" once */
static bool firstNumaTouch = true;
+Datum pg_numa_available(PG_FUNCTION_ARGS);
+
/*
* InitShmemAccess() --- set up basic pointers to shared memory.
*/
@@ -615,7 +617,7 @@ pg_get_shmem_allocations_numa(PG_FUNCTION_ARGS)
* This information is needed before calling move_pages() for NUMA memory
* node inquiry.
*/
- os_page_size = pg_numa_get_pagesize();
+ os_page_size = pg_get_shmem_pagesize();
/*
* Allocate memory for page pointers and status based on total shared
@@ -727,3 +729,39 @@ pg_get_shmem_allocations_numa(PG_FUNCTION_ARGS)
return (Datum) 0;
}
+
+/*
+ * Determine the memory page size used for the shared memory segment.
+ *
+ * If the shared segment was allocated using huge pages, returns the size of
+ * a huge page. Otherwise returns the size of regular memory page.
+ *
+ * This should be used only after the server is started.
+ */
+Size
+pg_get_shmem_pagesize(void)
+{
+ Size os_page_size;
+#ifdef WIN32
+ SYSTEM_INFO sysinfo;
+
+ GetSystemInfo(&sysinfo);
+ os_page_size = sysinfo.dwPageSize;
+#else
+ os_page_size = sysconf(_SC_PAGESIZE);
+#endif
+
+ Assert(IsUnderPostmaster);
+ Assert(huge_pages_status != HUGE_PAGES_UNKNOWN);
+
+ if (huge_pages_status == HUGE_PAGES_ON)
+ GetHugePageSize(&os_page_size, NULL);
+
+ return os_page_size;
+}
+
+Datum
+pg_numa_available(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_BOOL(pg_numa_init() != -1);
+}
diff --git a/src/include/port/pg_numa.h b/src/include/port/pg_numa.h
index 7e990d9f776..40f1d324dcf 100644
--- a/src/include/port/pg_numa.h
+++ b/src/include/port/pg_numa.h
@@ -14,12 +14,9 @@
#ifndef PG_NUMA_H
#define PG_NUMA_H
-#include "fmgr.h"
-
extern PGDLLIMPORT int pg_numa_init(void);
extern PGDLLIMPORT int pg_numa_query_pages(int pid, unsigned long count, void **pages, int *status);
extern PGDLLIMPORT int pg_numa_get_max_node(void);
-extern PGDLLIMPORT Size pg_numa_get_pagesize(void);
#ifdef USE_LIBNUMA
diff --git a/src/include/storage/shmem.h b/src/include/storage/shmem.h
index 904a336b851..c1f668ded95 100644
--- a/src/include/storage/shmem.h
+++ b/src/include/storage/shmem.h
@@ -41,6 +41,8 @@ extern void *ShmemInitStruct(const char *name, Size size, bool *foundPtr);
extern Size add_size(Size s1, Size s2);
extern Size mul_size(Size s1, Size s2);
+extern PGDLLIMPORT Size pg_get_shmem_pagesize(void);
+
/* ipci.c */
extern void RequestAddinShmemSpace(Size size);
diff --git a/src/port/pg_numa.c b/src/port/pg_numa.c
index 5e2523cf798..63dff799436 100644
--- a/src/port/pg_numa.c
+++ b/src/port/pg_numa.c
@@ -13,17 +13,14 @@
*-------------------------------------------------------------------------
*/
-#include "postgres.h"
+#include "c.h"
#include <unistd.h>
#ifdef WIN32
#include <windows.h>
#endif
-#include "fmgr.h"
-#include "miscadmin.h"
#include "port/pg_numa.h"
-#include "storage/pg_shmem.h"
/*
* At this point we provide support only for Linux thanks to libnuma, but in
@@ -36,8 +33,6 @@
#include <numa.h>
#include <numaif.h>
-Datum pg_numa_available(PG_FUNCTION_ARGS);
-
/* libnuma requires initialization as per numa(3) on Linux */
int
pg_numa_init(void)
@@ -66,8 +61,6 @@ pg_numa_get_max_node(void)
#else
-Datum pg_numa_available(PG_FUNCTION_ARGS);
-
/* Empty wrappers */
int
pg_numa_init(void)
@@ -89,32 +82,3 @@ pg_numa_get_max_node(void)
}
#endif
-
-Datum
-pg_numa_available(PG_FUNCTION_ARGS)
-{
- PG_RETURN_BOOL(pg_numa_init() != -1);
-}
-
-/* This should be used only after the server is started */
-Size
-pg_numa_get_pagesize(void)
-{
- Size os_page_size;
-#ifdef WIN32
- SYSTEM_INFO sysinfo;
-
- GetSystemInfo(&sysinfo);
- os_page_size = sysinfo.dwPageSize;
-#else
- os_page_size = sysconf(_SC_PAGESIZE);
-#endif
-
- Assert(IsUnderPostmaster);
- Assert(huge_pages_status != HUGE_PAGES_UNKNOWN);
-
- if (huge_pages_status == HUGE_PAGES_ON)
- GetHugePageSize(&os_page_size, NULL);
-
- return os_page_size;
-}
--
2.49.0