mirror of
https://github.com/postgres/postgres.git
synced 2025-11-25 12:03:53 +03:00
Avoid the use of a separate spinlock to protect a LWLock's wait queue.
Previously we used a spinlock, in adition to the atomically manipulated
->state field, to protect the wait queue. But it's pretty simple to
instead perform the locking using a flag in state.
Due to 6150a1b0 BufferDescs, on platforms (like PPC) with > 1 byte
spinlocks, increased their size above 64byte. As 64 bytes are the size
we pad allocated BufferDescs to, this can increase false sharing;
causing performance problems in turn. Together with the previous commit
this reduces the size to <= 64 bytes on all common platforms.
Author: Andres Freund
Discussion: CAA4eK1+ZeB8PMwwktf+3bRS0Pt4Ux6Rs6Aom0uip8c6shJWmyg@mail.gmail.com
20160327121858.zrmrjegmji2ymnvr@alap3.anarazel.de
This commit is contained in:
@@ -57,15 +57,11 @@ typedef struct LWLockTranche
|
||||
*/
|
||||
typedef struct LWLock
|
||||
{
|
||||
slock_t mutex; /* Protects LWLock and queue of PGPROCs */
|
||||
uint16 tranche; /* tranche ID */
|
||||
|
||||
pg_atomic_uint32 state; /* state of exclusive/nonexclusive lockers */
|
||||
#ifdef LOCK_DEBUG
|
||||
pg_atomic_uint32 nwaiters; /* number of waiters */
|
||||
#endif
|
||||
dlist_head waiters; /* list of waiting PGPROCs */
|
||||
#ifdef LOCK_DEBUG
|
||||
pg_atomic_uint32 nwaiters; /* number of waiters */
|
||||
struct PGPROC *owner; /* last exclusive owner of the lock */
|
||||
#endif
|
||||
} LWLock;
|
||||
|
||||
Reference in New Issue
Block a user