On Mon, Apr 11, 2016 at 12:01 AM, Andres Freund <[email protected]> wrote:
>> InitBufferPool() manually fixes up alignment; that should probably be
>> removed now.
Attached patch does that.
>> I also wonder if it doesn't make sense to fix PG_CACHE_LINE_SIZE to
>> 64byte on x86. I personally think a manual ifdef in pg_config_manual.h
>> is ok for that.
>
> Also, this doesn't seem to be complete. This now aligns sizes to
> cacheline boundaries, but it doesn't actually align the returned values
> afaics? That might kind of work sometimes, if freeoffset is initially
> aligned to PG_CACHE_LINE_SIZE, but that's not guaranteed, it's just
> shmhdr->freeoffset += MAXALIGN(sizeof(slock_t));
And tries to fix that.
> Additionally, doesn't this obsolete
>
> /*
> * Preferred alignment for disk I/O buffers. On some CPUs, copies between
> * user space and kernel space are significantly faster if the user buffer
> * is aligned on a larger-than-MAXALIGN boundary. Ideally this should be
> * a platform-dependent value, but for now we just hard-wire it.
> */
> #define ALIGNOF_BUFFER 32
I didn't go as far as trying to remove this; a few other random things
are using it.
> and
>
> /* extra alignment for large requests, since they are probably
> buffers */
> if (size >= BLCKSZ)
> newStart = BUFFERALIGN(newStart);
But I got this one.
I fixed the InitBufferPool issue you mentioned in the other email, too.
--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company
diff --git a/src/backend/storage/buffer/buf_init.c b/src/backend/storage/buffer/buf_init.c
index a5cffc7..5804870 100644
--- a/src/backend/storage/buffer/buf_init.c
+++ b/src/backend/storage/buffer/buf_init.c
@@ -76,11 +76,9 @@ InitBufferPool(void)
/* Align descriptors to a cacheline boundary. */
BufferDescriptors = (BufferDescPadded *)
- CACHELINEALIGN(
- ShmemInitStruct("Buffer Descriptors",
- NBuffers * sizeof(BufferDescPadded)
- + PG_CACHE_LINE_SIZE,
- &foundDescs));
+ ShmemInitStruct("Buffer Descriptors",
+ NBuffers * sizeof(BufferDescPadded),
+ &foundDescs);
BufferBlocks = (char *)
ShmemInitStruct("Buffer Blocks",
@@ -88,10 +86,9 @@ InitBufferPool(void)
/* Align lwlocks to cacheline boundary */
BufferIOLWLockArray = (LWLockMinimallyPadded *)
- CACHELINEALIGN(ShmemInitStruct("Buffer IO Locks",
- NBuffers * (Size) sizeof(LWLockMinimallyPadded)
- + PG_CACHE_LINE_SIZE,
- &foundIOLocks));
+ ShmemInitStruct("Buffer IO Locks",
+ NBuffers * (Size) sizeof(LWLockMinimallyPadded),
+ &foundIOLocks);
BufferIOLWLockTranche.name = "buffer_io";
BufferIOLWLockTranche.array_base = BufferIOLWLockArray;
diff --git a/src/backend/storage/ipc/shmem.c b/src/backend/storage/ipc/shmem.c
index 1ad68cd..8e6cbdb 100644
--- a/src/backend/storage/ipc/shmem.c
+++ b/src/backend/storage/ipc/shmem.c
@@ -112,6 +112,7 @@ void
InitShmemAllocation(void)
{
PGShmemHeader *shmhdr = ShmemSegHdr;
+ char *aligned;
Assert(shmhdr != NULL);
@@ -139,6 +140,11 @@ InitShmemAllocation(void)
shmhdr->freeoffset += MAXALIGN(sizeof(slock_t));
Assert(shmhdr->freeoffset <= shmhdr->totalsize);
+ /* Make sure the first allocation begins on a cache line boundary. */
+ aligned = (char *)
+ (CACHELINEALIGN((((char *) shmhdr) + shmhdr->freeoffset)));
+ shmhdr->freeoffset = aligned - (char *) shmhdr;
+
SpinLockInit(ShmemLock);
/* ShmemIndex can't be set up yet (need LWLocks first) */
@@ -189,10 +195,6 @@ ShmemAlloc(Size size)
newStart = ShmemSegHdr->freeoffset;
- /* extra alignment for large requests, since they are probably buffers */
- if (size >= BLCKSZ)
- newStart = BUFFERALIGN(newStart);
-
newFree = newStart + size;
if (newFree <= ShmemSegHdr->totalsize)
{
--
Sent via pgsql-hackers mailing list ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers