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..4b487a2a4e8 100644 --- a/src/port/pg_numa.c +++ b/src/port/pg_numa.c @@ -13,17 +13,10 @@ *------------------------------------------------------------------------- */ -#include "postgres.h" +#include "c.h" #include -#ifdef WIN32 -#include -#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 #include -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; -}