From 699b1f40da3139def660235fa8a782ec8dd8f575 Mon Sep 17 00:00:00 2001 From: Heikki Linnakangas Date: Wed, 29 Jan 2014 21:33:56 +0200 Subject: [PATCH] Fix thinko in huge_tlb_pages patch. We calculated the rounded-up size for the allocation, but then failed to use the rounded-up value in the mmap() call. Oops. Also, initialize allocsize, to silence warnings seen with some compilers, as pointed out by Jeff Janes. --- src/backend/port/sysv_shmem.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/backend/port/sysv_shmem.c b/src/backend/port/sysv_shmem.c index f7596bf6e0..ac3a9fe3b0 100644 --- a/src/backend/port/sysv_shmem.c +++ b/src/backend/port/sysv_shmem.c @@ -329,7 +329,7 @@ PGSharedMemoryIsInUse(unsigned long id1, unsigned long id2) static void * CreateAnonymousSegment(Size *size) { - Size allocsize; + Size allocsize = *size; void *ptr = MAP_FAILED; #ifndef MAP_HUGETLB @@ -358,11 +358,10 @@ CreateAnonymousSegment(Size *size) */ int hugepagesize = 2 * 1024 * 1024; - allocsize = *size; if (allocsize % hugepagesize != 0) allocsize += hugepagesize - (allocsize % hugepagesize); - ptr = mmap(NULL, *size, PROT_READ | PROT_WRITE, + ptr = mmap(NULL, allocsize, PROT_READ | PROT_WRITE, PG_MMAP_FLAGS | MAP_HUGETLB, -1, 0); if (huge_tlb_pages == HUGE_TLB_TRY && ptr == MAP_FAILED) elog(DEBUG1, "mmap with MAP_HUGETLB failed, huge pages disabled: %m"); @@ -372,8 +371,12 @@ CreateAnonymousSegment(Size *size) if (huge_tlb_pages == HUGE_TLB_OFF || (huge_tlb_pages == HUGE_TLB_TRY && ptr == MAP_FAILED)) { + /* + * use the original size, not the rounded up value, when falling + * back to non-huge pages. + */ allocsize = *size; - ptr = mmap(NULL, *size, PROT_READ | PROT_WRITE, PG_MMAP_FLAGS, -1, 0); + ptr = mmap(NULL, allocsize, PROT_READ | PROT_WRITE, PG_MMAP_FLAGS, -1, 0); } if (ptr == MAP_FAILED)