From 9a1450ecbe291cfc92e97f49506db9f443c8cbe9 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Thu, 7 Jul 2022 16:51:18 +0900 Subject: [PATCH v2] Fix huge_pages on current Windows. Since Windows 10 1703, it's necessary to pass a flag to MapViewOfFile() to enable large pages at map time. Reported-by: Okano Naoki Author: Thomas Munro Discussion: https://postgr.es/m/17448-0a96583a67edb1f7%40postgresql.org --- src/backend/port/win32_shmem.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/backend/port/win32_shmem.c b/src/backend/port/win32_shmem.c index 6cf69411db..2f51da5a6a 100644 --- a/src/backend/port/win32_shmem.c +++ b/src/backend/port/win32_shmem.c @@ -216,6 +216,7 @@ PGSharedMemoryCreate(Size size, SIZE_T largePageSize = 0; Size orig_size = size; DWORD flProtect = PAGE_READWRITE; + DWORD desiredAccess; ShmemProtectiveRegion = VirtualAlloc(NULL, PROTECTIVE_REGION_SIZE, MEM_RESERVE, PAGE_NOACCESS); @@ -353,12 +354,17 @@ retry: if (!CloseHandle(hmap)) elog(LOG, "could not close handle to shared memory: error code %lu", GetLastError()); + desiredAccess = FILE_MAP_WRITE | FILE_MAP_READ; + + /* Set large pages if wanted. */ + if ((flProtect & SEC_LARGE_PAGES) != 0) + desiredAccess |= FILE_MAP_LARGE_PAGES; /* * Get a pointer to the new shared memory segment. Map the whole segment * at once, and let the system decide on the initial address. */ - memAddress = MapViewOfFileEx(hmap2, FILE_MAP_WRITE | FILE_MAP_READ, 0, 0, 0, NULL); + memAddress = MapViewOfFileEx(hmap2, desiredAccess, 0, 0, 0, NULL); if (!memAddress) ereport(FATAL, (errmsg("could not create shared memory segment: error code %lu", GetLastError()), -- 2.36.1