Arrange to align shared disk buffers on at least 32-byte boundaries,
not just MAXALIGN boundaries. This makes a noticeable difference in the speed of transfers to and from kernel space, at least on recent Pentiums, and might help other CPUs too. We should look at making this happen for local buffers and buffile.c too. Patch from Manfred Spraul.
This commit is contained in:
parent
11b274f00f
commit
5aa29e88e9
@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/storage/ipc/shmem.c,v 1.70 2003/08/04 02:40:03 momjian Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/storage/ipc/shmem.c,v 1.71 2003/09/21 17:57:21 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -131,6 +131,7 @@ InitShmemAllocation(void *seghdr)
|
||||
void *
|
||||
ShmemAlloc(Size size)
|
||||
{
|
||||
uint32 newStart;
|
||||
uint32 newFree;
|
||||
void *newSpace;
|
||||
|
||||
@ -146,10 +147,16 @@ ShmemAlloc(Size size)
|
||||
|
||||
SpinLockAcquire(ShmemLock);
|
||||
|
||||
newFree = shmemseghdr->freeoffset + 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)
|
||||
{
|
||||
newSpace = (void *) MAKE_PTR(shmemseghdr->freeoffset);
|
||||
newSpace = (void *) MAKE_PTR(newStart);
|
||||
shmemseghdr->freeoffset = newFree;
|
||||
}
|
||||
else
|
||||
|
@ -12,7 +12,7 @@
|
||||
* Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* $Id: c.h,v 1.152 2003/08/04 02:40:10 momjian Exp $
|
||||
* $Id: c.h,v 1.153 2003/09/21 17:57:21 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -522,13 +522,16 @@ typedef NameData *Name;
|
||||
* ----------------
|
||||
*/
|
||||
|
||||
#define TYPEALIGN(ALIGNVAL,LEN) (((long)(LEN) + (ALIGNVAL-1)) & ~(ALIGNVAL-1))
|
||||
#define TYPEALIGN(ALIGNVAL,LEN) \
|
||||
(((long) (LEN) + (ALIGNVAL-1)) & ~((long) (ALIGNVAL-1)))
|
||||
|
||||
#define SHORTALIGN(LEN) TYPEALIGN(ALIGNOF_SHORT, (LEN))
|
||||
#define INTALIGN(LEN) TYPEALIGN(ALIGNOF_INT, (LEN))
|
||||
#define LONGALIGN(LEN) TYPEALIGN(ALIGNOF_LONG, (LEN))
|
||||
#define DOUBLEALIGN(LEN) TYPEALIGN(ALIGNOF_DOUBLE, (LEN))
|
||||
#define MAXALIGN(LEN) TYPEALIGN(MAXIMUM_ALIGNOF, (LEN))
|
||||
/* MAXALIGN covers only built-in types, not buffers */
|
||||
#define BUFFERALIGN(LEN) TYPEALIGN(ALIGNOF_BUFFER, (LEN))
|
||||
|
||||
|
||||
/* ----------------------------------------------------------------
|
||||
|
@ -6,7 +6,7 @@
|
||||
* for developers. If you edit any of these, be sure to do a *full*
|
||||
* rebuild (and an initdb if noted).
|
||||
*
|
||||
* $Id: pg_config_manual.h,v 1.5 2003/08/04 00:43:29 momjian Exp $
|
||||
* $Id: pg_config_manual.h,v 1.6 2003/09/21 17:57:21 tgl Exp $
|
||||
*------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
@ -126,6 +126,14 @@
|
||||
*/
|
||||
#define BITS_PER_BYTE 8
|
||||
|
||||
/*
|
||||
* 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
|
||||
|
||||
/*
|
||||
* Disable UNIX sockets for those operating system.
|
||||
*/
|
||||
|
Loading…
Reference in New Issue
Block a user