On 2014-12-29 16:59:05 -0500, Bruce Momjian wrote: > diff --git a/src/backend/storage/buffer/buf_init.c > b/src/backend/storage/buffer/buf_init.c > new file mode 100644 > index ff6c713..c4dce5b > *** a/src/backend/storage/buffer/buf_init.c > --- b/src/backend/storage/buffer/buf_init.c > *************** InitBufferPool(void) > *** 67,72 **** > --- 67,73 ---- > bool foundBufs, > foundDescs; > > + fprintf(stderr, "Buffer Descriptors size = %ld\n", sizeof(BufferDesc)); > BufferDescriptors = (BufferDesc *) > ShmemInitStruct("Buffer Descriptors", > NBuffers * sizeof(BufferDesc), > &foundDescs); > diff --git a/src/backend/storage/ipc/shmem.c b/src/backend/storage/ipc/shmem.c > new file mode 100644 > index 2ea2216..669c07f > *** a/src/backend/storage/ipc/shmem.c > --- b/src/backend/storage/ipc/shmem.c > *************** ShmemInitStruct(const char *name, Size s > *** 327,332 **** > --- 327,335 ---- > ShmemIndexEnt *result; > void *structPtr; > > + if (strcmp(name, "Buffer Descriptors") == 0) > + size = BUFFERALIGN(size) + 64; > + > LWLockAcquire(ShmemIndexLock, LW_EXCLUSIVE); > > if (!ShmemIndex) > *************** ShmemInitStruct(const char *name, Size s > *** 413,418 **** > --- 416,432 ---- > " \"%s\" (%zu bytes > requested)", > name, size))); > } > + if (strcmp(name, "Buffer Descriptors") == 0) > + { > + /* align on 32 */ > + if ((int64)structPtr % 32 != 0) > + structPtr = (void *)((int64)structPtr + 32 - > (int64)structPtr % 32); > + /* align on 32 but not 64 */ > + if ((int64)structPtr % 64 == 0) > + structPtr = (void *)((int64)structPtr + 32); > + } > + fprintf(stderr, "shared memory alignment of %s: %ld-byte\n", > name, > + (int64)structPtr % 64 == 0 ? 64 : (int64)structPtr % > 64); > result->size = size; > result->location = structPtr; > }
> diff --git a/src/backend/storage/buffer/buf_init.c > b/src/backend/storage/buffer/buf_init.c > new file mode 100644 > index ff6c713..c4dce5b > *** a/src/backend/storage/buffer/buf_init.c > --- b/src/backend/storage/buffer/buf_init.c > *************** InitBufferPool(void) > *** 67,72 **** > --- 67,73 ---- > bool foundBufs, > foundDescs; > > + fprintf(stderr, "Buffer Descriptors size = %ld\n", sizeof(BufferDesc)); > BufferDescriptors = (BufferDesc *) > ShmemInitStruct("Buffer Descriptors", > NBuffers * sizeof(BufferDesc), > &foundDescs); > diff --git a/src/backend/storage/ipc/shmem.c b/src/backend/storage/ipc/shmem.c > new file mode 100644 > index 2ea2216..50f836e > *** a/src/backend/storage/ipc/shmem.c > --- b/src/backend/storage/ipc/shmem.c > *************** ShmemInitStruct(const char *name, Size s > *** 327,332 **** > --- 327,335 ---- > ShmemIndexEnt *result; > void *structPtr; > > + if (strcmp(name, "Buffer Descriptors") == 0) > + size = BUFFERALIGN(size) + 64; > + > LWLockAcquire(ShmemIndexLock, LW_EXCLUSIVE); > > if (!ShmemIndex) > *************** ShmemInitStruct(const char *name, Size s > *** 413,418 **** > --- 416,429 ---- > " \"%s\" (%zu bytes > requested)", > name, size))); > } > + if (strcmp(name, "Buffer Descriptors") == 0) > + { > + /* align on 64 */ > + if ((int64)structPtr % 64 != 0) > + structPtr = (void *)((int64)structPtr + 64 - > (int64)structPtr % 64); > + } > + fprintf(stderr, "shared memory alignment of %s: %ld-byte\n", > name, > + (int64)structPtr % 64 == 0 ? 64 : (int64)structPtr % > 64); > result->size = size; > result->location = structPtr; > } I can't run tests right now... What exactly do you want to see with these tests? that's essentially what I've already benchmarked + some fprintfs? Greetings, Andres Freund -- Andres Freund http://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Training & Services -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers