Cleanup of pg_numa.c
authorTomas Vondra <tomas.vondra@postgresql.org>
Wed, 9 Apr 2025 17:32:17 +0000 (19:32 +0200)
committerTomas Vondra <tomas.vondra@postgresql.org>
Wed, 9 Apr 2025 19:50:17 +0000 (21:50 +0200)
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 either leftovers or unnecessary thanks to the other changes
  in this commit.

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
src/backend/storage/ipc/shmem.c
src/include/port/pg_numa.h
src/include/storage/shmem.h
src/port/pg_numa.c

index c9ceba604b1b03e7024f5752e7513dae88ca7af9..e1701bd56ef845267fd1f960074130350330da2f 100644 (file)
@@ -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
index e10b380e5c7c04c5fcb51b1c5a76c1a4f51c3d20..c9ae3b45b76b11b9647348d5445511983b17526d 100644 (file)
@@ -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);
+}
index 7e990d9f776ec7e420c8561d641399fc8a31a178..40f1d324dcfe275a8d922cc554792e197805c7c9 100644 (file)
 #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
 
index 904a336b8515c22e8478781f7775669f4d75fd9d..c1f668ded95235580e748e05e76e2069b276ae23 100644 (file)
@@ -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);
 
index 5e2523cf798c9b354977b4d9aa0512fa9cfca1d0..4b487a2a4e814ca31f7d192f40a506ee05a87736 100644 (file)
  *-------------------------------------------------------------------------
  */
 
-#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 +29,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 +57,6 @@ pg_numa_get_max_node(void)
 
 #else
 
-Datum      pg_numa_available(PG_FUNCTION_ARGS);
-
 /* Empty wrappers */
 int
 pg_numa_init(void)
@@ -89,32 +78,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;
-}