]> granicus.if.org Git - postgresql/commitdiff
Fix thinko in huge_tlb_pages patch.
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>
Wed, 29 Jan 2014 19:33:56 +0000 (21:33 +0200)
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>
Wed, 29 Jan 2014 19:33:56 +0000 (21:33 +0200)
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

index f7596bf6e0b8d5a66df2ad01559c162b550fd6af..ac3a9fe3b0b59faaf455a1714939d94ab8ccc1d0 100644 (file)
@@ -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)