diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/port/sysv_shmem.c | 14 | ||||
-rw-r--r-- | src/backend/port/win32_shmem.c | 5 | ||||
-rw-r--r-- | src/backend/storage/ipc/ipci.c | 7 | ||||
-rw-r--r-- | src/backend/utils/misc/guc_tables.c | 19 | ||||
-rw-r--r-- | src/include/storage/pg_shmem.h | 5 | ||||
-rw-r--r-- | src/test/authentication/t/003_peer.pl | 6 | ||||
-rw-r--r-- | src/test/authentication/t/005_sspi.pl | 4 |
7 files changed, 58 insertions, 2 deletions
diff --git a/src/backend/port/sysv_shmem.c b/src/backend/port/sysv_shmem.c index eaba244bc9c..f1eb5a1e208 100644 --- a/src/backend/port/sysv_shmem.c +++ b/src/backend/port/sysv_shmem.c @@ -627,6 +627,14 @@ CreateAnonymousSegment(Size *size) } #endif + /* + * Report whether huge pages are in use. This needs to be tracked before + * the second mmap() call if attempting to use huge pages failed + * previously. + */ + SetConfigOption("huge_pages_status", (ptr == MAP_FAILED) ? "off" : "on", + PGC_INTERNAL, PGC_S_DYNAMIC_DEFAULT); + if (ptr == MAP_FAILED && huge_pages != HUGE_PAGES_ON) { /* @@ -737,8 +745,14 @@ PGSharedMemoryCreate(Size size, sysvsize = sizeof(PGShmemHeader); } else + { sysvsize = size; + /* huge pages are only available with mmap */ + SetConfigOption("huge_pages_status", "off", + PGC_INTERNAL, PGC_S_DYNAMIC_DEFAULT); + } + /* * Loop till we find a free IPC key. Trust CreateDataDirLockFile() to * ensure no more than one postmaster per data directory can enter this diff --git a/src/backend/port/win32_shmem.c b/src/backend/port/win32_shmem.c index 62e08074770..05494c14a93 100644 --- a/src/backend/port/win32_shmem.c +++ b/src/backend/port/win32_shmem.c @@ -401,6 +401,11 @@ retry: on_shmem_exit(pgwin32_SharedMemoryDelete, PointerGetDatum(hmap2)); *shim = hdr; + + /* Report whether huge pages are in use */ + SetConfigOption("huge_pages_status", (flProtect & SEC_LARGE_PAGES) ? + "on" : "off", PGC_INTERNAL, PGC_S_DYNAMIC_DEFAULT); + return hdr; } diff --git a/src/backend/storage/ipc/ipci.c b/src/backend/storage/ipc/ipci.c index 8f1ded7338f..cc387c00a15 100644 --- a/src/backend/storage/ipc/ipci.c +++ b/src/backend/storage/ipc/ipci.c @@ -190,6 +190,13 @@ CreateSharedMemoryAndSemaphores(void) */ seghdr = PGSharedMemoryCreate(size, &shim); + /* + * Make sure that huge pages are never reported as "unknown" while the + * server is running. + */ + Assert(strcmp("unknown", + GetConfigOption("huge_pages_status", false, false)) != 0); + InitShmemAccess(seghdr); /* diff --git a/src/backend/utils/misc/guc_tables.c b/src/backend/utils/misc/guc_tables.c index f8ef87d26dc..59ab630ae40 100644 --- a/src/backend/utils/misc/guc_tables.c +++ b/src/backend/utils/misc/guc_tables.c @@ -365,6 +365,13 @@ static const struct config_enum_entry huge_pages_options[] = { {NULL, 0, false} }; +static const struct config_enum_entry huge_pages_status_options[] = { + {"off", HUGE_PAGES_OFF, false}, + {"on", HUGE_PAGES_ON, false}, + {"unknown", HUGE_PAGES_UNKNOWN, false}, + {NULL, 0, false} +}; + static const struct config_enum_entry recovery_prefetch_options[] = { {"off", RECOVERY_PREFETCH_OFF, false}, {"on", RECOVERY_PREFETCH_ON, false}, @@ -550,6 +557,7 @@ int ssl_renegotiation_limit; */ int huge_pages = HUGE_PAGES_TRY; int huge_page_size; +int huge_pages_status = HUGE_PAGES_UNKNOWN; /* * These variables are all dummies that don't do anything, except in some @@ -4877,6 +4885,17 @@ struct config_enum ConfigureNamesEnum[] = }, { + {"huge_pages_status", PGC_INTERNAL, PRESET_OPTIONS, + gettext_noop("Indicates the status of huge pages."), + NULL, + GUC_NOT_IN_SAMPLE | GUC_DISALLOW_IN_FILE + }, + &huge_pages_status, + HUGE_PAGES_UNKNOWN, huge_pages_status_options, + NULL, NULL, NULL + }, + + { {"recovery_prefetch", PGC_SIGHUP, WAL_RECOVERY, gettext_noop("Prefetch referenced blocks during recovery."), gettext_noop("Look ahead in the WAL to find references to uncached data.") diff --git a/src/include/storage/pg_shmem.h b/src/include/storage/pg_shmem.h index 4dd05f156d5..ba0cdc13c77 100644 --- a/src/include/storage/pg_shmem.h +++ b/src/include/storage/pg_shmem.h @@ -46,12 +46,13 @@ extern PGDLLIMPORT int shared_memory_type; extern PGDLLIMPORT int huge_pages; extern PGDLLIMPORT int huge_page_size; -/* Possible values for huge_pages */ +/* Possible values for huge_pages and huge_pages_status */ typedef enum { HUGE_PAGES_OFF, HUGE_PAGES_ON, - HUGE_PAGES_TRY + HUGE_PAGES_TRY, /* only for huge_pages */ + HUGE_PAGES_UNKNOWN /* only for huge_pages_status */ } HugePagesType; /* Possible values for shared_memory_type */ diff --git a/src/test/authentication/t/003_peer.pl b/src/test/authentication/t/003_peer.pl index d8e49760726..eacff2b52aa 100644 --- a/src/test/authentication/t/003_peer.pl +++ b/src/test/authentication/t/003_peer.pl @@ -100,6 +100,12 @@ my $system_user = $node->safe_psql('postgres', q(select (string_to_array(SYSTEM_USER, ':'))[2])); +# While on it, check the status of huge pages, that can be either on +# or off, but never unknown. +my $huge_pages_status = + $node->safe_psql('postgres', q(SHOW huge_pages_status;)); +isnt($huge_pages_status, 'unknown', "check huge_pages_status"); + # Tests without the user name map. # Failure as connection is attempted with a database role not mapping # to an authorized system user. diff --git a/src/test/authentication/t/005_sspi.pl b/src/test/authentication/t/005_sspi.pl index 05d81f34229..37fd5bc2437 100644 --- a/src/test/authentication/t/005_sspi.pl +++ b/src/test/authentication/t/005_sspi.pl @@ -21,6 +21,10 @@ $node->init; $node->append_conf('postgresql.conf', "log_connections = on\n"); $node->start; +my $huge_pages_status = + $node->safe_psql('postgres', q(SHOW huge_pages_status;)); +isnt($huge_pages_status, 'unknown', "check huge_pages_status"); + # SSPI is set up by default. Make sure it interacts correctly with # require_auth. $node->connect_ok("require_auth=sspi", |