From: Andres Freund Date: Mon, 30 May 2016 22:35:53 +0000 (-0700) Subject: Move memory barrier in UnlockBufHdr to before releasing the lock. X-Git-Tag: REL9_6_BETA2~134 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=87a3023c60f4bab551441492652ef19371847fd3;p=thirdparty%2Fpostgresql.git Move memory barrier in UnlockBufHdr to before releasing the lock. This bug appears to have been introduced late in the development of 48354581a4 ("Allow Pin/UnpinBuffer to operate in a lockfree manner."). Found while debugging a bug which turned out to be independent of the commit mentioned above. Backpatch: - --- diff --git a/src/include/storage/buf_internals.h b/src/include/storage/buf_internals.h index c9cae956a54..511d7409e6e 100644 --- a/src/include/storage/buf_internals.h +++ b/src/include/storage/buf_internals.h @@ -242,8 +242,8 @@ extern PGDLLIMPORT LWLockMinimallyPadded *BufferIOLWLockArray; extern uint32 LockBufHdr(BufferDesc *desc); #define UnlockBufHdr(desc, s) \ do { \ - pg_atomic_write_u32(&(desc)->state, (s) & (~BM_LOCKED)); \ pg_write_barrier(); \ + pg_atomic_write_u32(&(desc)->state, (s) & (~BM_LOCKED)); \ } while (0)