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)