diff --git a/src/backend/port/sysv_shmem.c b/src/backend/port/sysv_shmem.c index 0399265c4dd..b80fcd58931 100644 --- a/src/backend/port/sysv_shmem.c +++ b/src/backend/port/sysv_shmem.c @@ -758,6 +758,8 @@ round_off_mapping_sizes_for_hugepages(MemoryMappingSizes *mapping, int hugepages if (hugepagesize == 0) return; + elog(WARNING, "shmem_reserved=%ld, shmem_req_size=%ld", mapping->shmem_reserved, mapping->shmem_req_size); + if (mapping->shmem_req_size % hugepagesize != 0) mapping->shmem_req_size += add_size(mapping->shmem_req_size, hugepagesize - (mapping->shmem_req_size % hugepagesize)); @@ -839,7 +841,7 @@ CreateAnonymousSegment(int segment_id, MemoryMappingSizes *mapping) (errmsg("segment[%s]: could not create anonymous shared memory file: %m", segname))); - elog(DEBUG1, "segment[%s]: mmap(%zu)", segname, mapping->shmem_req_size); + elog(WARNING, "segment[%s]: mmap(%zu)", segname, mapping->shmem_req_size); /* * Reserve maximum required address space for future expansion of this @@ -894,7 +896,6 @@ CreateAnonymousSegment(int segment_id, MemoryMappingSizes *mapping) anonseg->addr = ptr; anonseg->size = mapping->shmem_reserved; } - /* * PrepareHugePages * @@ -1418,6 +1419,29 @@ PGSharedMemoryDetach(void) } } +void +JWPGSharedMemoryBuffersDetachTrick(void) +{ + AnonShmemSegment *sbseg = &AnonShmemSegs[BUFFERS_SHMEM_SEGMENT]; + elog(WARNING, "unmapping s_b, but not closing fd(%d), from postmaster to accelerate fork()", sbseg->fd); + if(munmap(sbseg->addr, sbseg->size) != 0) { + ereport(FATAL, (errmsg("sb segment: could not unmap anonymous shared memory: %m"))); + } +} + +void +JWPGSharedMemoryBuffersReattachTrick(void) +{ + AnonShmemSegment *sbseg = &AnonShmemSegs[BUFFERS_SHMEM_SEGMENT]; + + if(sbseg->fd == -1) + elog(PANIC, "children got wrong memfd fd"); + + sbseg->addr = mmap(NULL, sbseg->size, PROT_READ | PROT_WRITE, MAP_SHARED, sbseg->fd, 0); + if (sbseg->addr == MAP_FAILED) + elog(PANIC, "children failed mmap: %m"); +} + void ShmemControlInit(void) { diff --git a/src/backend/postmaster/bgwriter.c b/src/backend/postmaster/bgwriter.c index 80e3088fc7e..b59c82f6c1f 100644 --- a/src/backend/postmaster/bgwriter.c +++ b/src/backend/postmaster/bgwriter.c @@ -93,6 +93,7 @@ BackgroundWriterMain(const void *startup_data, size_t startup_data_len) WritebackContext wb_context; Assert(startup_data_len == 0); + elog(WARNING, "bwriter starting"); MyBackendType = B_BG_WRITER; AuxiliaryProcessMainCommon(); diff --git a/src/backend/postmaster/launch_backend.c b/src/backend/postmaster/launch_backend.c index 85da8ac381a..43db2570a95 100644 --- a/src/backend/postmaster/launch_backend.c +++ b/src/backend/postmaster/launch_backend.c @@ -227,6 +227,9 @@ postmaster_child_launch(BackendType child_type, int child_slot, conn_timing.fork_end = GetCurrentTimestamp(); } + //elog(WARNING, "starting %d", pid); + JWPGSharedMemoryBuffersReattachTrick(); + /* Close the postmaster's sockets */ ClosePostmasterPorts(child_type == B_LOGGER); diff --git a/src/backend/storage/ipc/ipci.c b/src/backend/storage/ipc/ipci.c index 1e92b0bcc5e..a18cb6227c5 100644 --- a/src/backend/storage/ipc/ipci.c +++ b/src/backend/storage/ipc/ipci.c @@ -257,7 +257,7 @@ CreateSharedMemoryAndSemaphores(void) inhseg->UsedShmemSegID = i; /* Compute the size of the shared-memory block */ - elog(DEBUG3, "invoking IpcMemoryCreate(segment %s, size=%zu, reserved address space=%zu)", + elog(WARNING, "invoking IpcMemoryCreate(segment %s, size=%zu, reserved address space=%zu)", MappingName(i), mapping->shmem_req_size, mapping->shmem_reserved); /* @@ -289,6 +289,10 @@ CreateSharedMemoryAndSemaphores(void) */ if (shmem_startup_hook) shmem_startup_hook(); + + /* JW HACK */ + JWPGSharedMemoryBuffersDetachTrick(); + } /* diff --git a/src/include/storage/pg_shmem.h b/src/include/storage/pg_shmem.h index ac679259787..2160af8de1a 100644 --- a/src/include/storage/pg_shmem.h +++ b/src/include/storage/pg_shmem.h @@ -219,6 +219,8 @@ extern PGShmemHeader *PGSharedMemoryCreate(int segment_id, MemoryMappingSizes *m PGShmemHeader **shim); extern bool PGSharedMemoryIsInUse(unsigned long id1, unsigned long id2); extern void PGSharedMemoryDetach(void); +extern void JWPGSharedMemoryBuffersDetachTrick(void); +extern void JWPGSharedMemoryBuffersReattachTrick(void); extern void GetHugePageSize(Size *hugepagesize, int *mmap_flags, int *memfd_flags); extern bool PGSharedMemoryResize(int segment_id, MemoryMappingSizes *mapping_sizes);