From e3dc0153b8c2fccb963cb1d2d7a3c75b5f1f24e6 Mon Sep 17 00:00:00 2001 From: Robert Haas Date: Tue, 29 Apr 2014 11:38:36 -0400 Subject: [PATCH] Fix bug. --- src/backend/utils/mmgr/sb_map.c | 8 +++++++- src/backend/utils/mmgr/sb_region.c | 3 ++- src/include/utils/sb_map.h | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/backend/utils/mmgr/sb_map.c b/src/backend/utils/mmgr/sb_map.c index e66c2c076b..7c629dfe0f 100644 --- a/src/backend/utils/mmgr/sb_map.c +++ b/src/backend/utils/mmgr/sb_map.c @@ -41,6 +41,7 @@ const uint64 maxpages_4b = UINT64CONST(0x100000000) / FPM_PAGE_SIZE; struct sb_map { relptr(sb_map) self; + Size offset; Size npages; bool use64; }; @@ -89,9 +90,10 @@ sb_map_size(char *base, Size npages) * been set. */ void -sb_map_initialize(sb_map *m, char *base, Size npages) +sb_map_initialize(sb_map *m, char *base, Size offset, Size npages) { relptr_store(base, m->self, m); + m->offset = offset; m->npages = npages; if (sizeof(Size) <= 4 || (base != NULL && npages < maxpages_4b)) m->use64 = false; @@ -106,6 +108,8 @@ void sb_map_set(sb_map *m, Size pageno, void *ptr) { char *base = sb_map_base(m); + Assert(pageno >= m->offset); + pageno -= m->offset; Assert(pageno < m->npages); if (m->use64) @@ -122,6 +126,8 @@ void * sb_map_get(sb_map *m, Size pageno) { char *base = sb_map_base(m); + Assert(pageno >= m->offset); + pageno -= m->offset; Assert(pageno < m->npages); if (m->use64) diff --git a/src/backend/utils/mmgr/sb_region.c b/src/backend/utils/mmgr/sb_region.c index 974091b34c..47ad11c266 100644 --- a/src/backend/utils/mmgr/sb_region.c +++ b/src/backend/utils/mmgr/sb_region.c @@ -394,7 +394,8 @@ sb_private_region_for_allocator(Size npages) FreePageManagerInitialize(region->fpm, region->region_start, NULL, false); FreePageManagerPut(region->fpm, metadata_bytes / FPM_PAGE_SIZE, new_region_net_pages); - sb_map_initialize(region->pagemap, NULL, new_region_net_pages); + sb_map_initialize(region->pagemap, NULL, metadata_bytes / FPM_PAGE_SIZE, + new_region_net_pages); region->contiguous_pages = new_region_net_pages; /* Now fix the value. */ freelist = Min(fls(new_region_net_pages), NUM_PRIVATE_FREELISTS); dlist_push_head(&private_freelist[freelist], ®ion->fl_node); diff --git a/src/include/utils/sb_map.h b/src/include/utils/sb_map.h index a0683537c4..519bf52290 100644 --- a/src/include/utils/sb_map.h +++ b/src/include/utils/sb_map.h @@ -17,7 +17,7 @@ typedef struct sb_map sb_map; extern Size sb_map_size(char *base, Size npages); -extern void sb_map_initialize(sb_map *, char *base, Size npages); +extern void sb_map_initialize(sb_map *, char *base, Size offset, Size npages); extern void sb_map_set(sb_map *, Size pageno, void *ptr); extern void *sb_map_get(sb_map *, Size pageno); -- 2.39.5