diff --git a/src/backend/port/sysv_shmem.c b/src/backend/port/sysv_shmem.c index 9de96ed..2ac3b41 100644 --- a/src/backend/port/sysv_shmem.c +++ b/src/backend/port/sysv_shmem.c @@ -479,9 +479,10 @@ PGSharedMemoryAttach(IpcMemoryId shmId, * and the hugepage-related mmap flags to use into *mmap_flags. */ static void -GetHugePageSize(Size *hugepagesize, int *mmap_flags) +GetHugePageSize(Size *hugepagesize, int *mmap_flags, unsigned int *total_pages) { Size default_hugepagesize = 0; + *total_pages = 0; /* * System-dependent code to find out the default huge page size. @@ -495,6 +496,7 @@ GetHugePageSize(Size *hugepagesize, int *mmap_flags) FILE *fp = AllocateFile("/proc/meminfo", "r"); char buf[128]; unsigned int sz; + unsigned int pg; char ch; if (fp) @@ -506,10 +508,13 @@ GetHugePageSize(Size *hugepagesize, int *mmap_flags) if (ch == 'k') { default_hugepagesize = sz * (Size) 1024; - break; } /* We could accept other units besides kB, if needed */ } + else if (sscanf(buf, "HugePages_Total: %u", &pg) == 1) + { + *total_pages = pg; + } } FreeFile(fp); } @@ -582,8 +587,9 @@ CreateAnonymousSegment(Size *size) */ Size hugepagesize; int mmap_flags; + unsigned int total_pages; - GetHugePageSize(&hugepagesize, &mmap_flags); + GetHugePageSize(&hugepagesize, &mmap_flags, &total_pages); if (allocsize % hugepagesize != 0) allocsize += hugepagesize - (allocsize % hugepagesize); @@ -592,8 +598,9 @@ CreateAnonymousSegment(Size *size) PG_MMAP_FLAGS | mmap_flags, -1, 0); mmap_errno = errno; if (huge_pages == HUGE_PAGES_TRY && ptr == MAP_FAILED) - elog(DEBUG1, "mmap(%zu) with MAP_HUGETLB failed, huge pages disabled: %m", - allocsize); + ereport((total_pages == 0) ? DEBUG3 : LOG, + (errmsg("fall back anonymous shared memory to non-huge " + "pages: required %zu bytes for huge pages", allocsize))); } #endif diff --git a/src/backend/port/win32_shmem.c b/src/backend/port/win32_shmem.c index d7a7199..9a9e98a 100644 --- a/src/backend/port/win32_shmem.c +++ b/src/backend/port/win32_shmem.c @@ -293,9 +293,9 @@ retry: huge_pages == HUGE_PAGES_TRY && (flProtect & SEC_LARGE_PAGES) != 0) { - elog(DEBUG1, "CreateFileMapping(%zu) with SEC_LARGE_PAGES failed, " - "huge pages disabled", - size); + ereport(LOG, + (errmsg("fall back anonymous shared memory to non-huge " + "pages: required %zu bytes for huge pages", size))); /* * Use the original size, not the rounded-up value, when