From a04f0c3c24efc8aeb524fb9e96f6a90345238e64 Mon Sep 17 00:00:00 2001 From: Peter Geoghegan Date: Wed, 22 Apr 2020 19:51:43 -0700 Subject: [PATCH 2/2] Valgrind instrumentation --- src/backend/storage/buffer/bufmgr.c | 44 +++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index f9980cf80c..774a161534 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -49,6 +49,7 @@ #include "storage/proc.h" #include "storage/smgr.h" #include "storage/standby.h" +#include "utils/memdebug.h" #include "utils/ps_status.h" #include "utils/rel.h" #include "utils/resowner_private.h" @@ -875,6 +876,13 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, bufBlock = isLocalBuf ? LocalBufHdrGetBlock(bufHdr) : BufHdrGetBlock(bufHdr); +#ifdef USE_VALGRIND + if (!isLocalBuf) + { + Buffer b = BufferDescriptorGetBuffer(bufHdr); + VALGRIND_MAKE_MEM_DEFINED(BufferGetPage(b), BLCKSZ); + } +#endif if (isExtend) { /* new buffers are zero-filled */ @@ -1039,6 +1047,12 @@ BufferAlloc(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, buf = GetBufferDescriptor(buf_id); valid = PinBuffer(buf, strategy); +#ifdef USE_VALGRIND + { + Buffer b = BufferDescriptorGetBuffer(buf); + VALGRIND_MAKE_MEM_DEFINED(BufferGetPage(b), BLCKSZ); + } +#endif /* Can release the mapping lock as soon as we've pinned it */ LWLockRelease(newPartitionLock); @@ -1136,6 +1150,12 @@ BufferAlloc(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, /* Read the LSN while holding buffer header lock */ buf_state = LockBufHdr(buf); +#ifdef USE_VALGRIND + { + Buffer b = BufferDescriptorGetBuffer(buf); + VALGRIND_MAKE_MEM_DEFINED(BufferGetPage(b), BLCKSZ); + } +#endif lsn = BufferGetLSN(buf); UnlockBufHdr(buf, buf_state); @@ -1633,6 +1653,12 @@ PinBuffer(BufferDesc *buf, BufferAccessStrategy strategy) buf_state)) { result = (buf_state & BM_VALID) != 0; +#ifdef USE_VALGRIND + { + Buffer b = BufferDescriptorGetBuffer(buf); + VALGRIND_MAKE_MEM_DEFINED(BufferGetPage(b), BLCKSZ); + } +#endif break; } } @@ -1731,6 +1757,12 @@ UnpinBuffer(BufferDesc *buf, bool fixOwner) /* I'd better not still hold any locks on the buffer */ Assert(!LWLockHeldByMe(BufferDescriptorGetContentLock(buf))); Assert(!LWLockHeldByMe(BufferDescriptorGetIOLock(buf))); +#ifdef USE_VALGRIND + { + Buffer b = BufferDescriptorGetBuffer(buf); + VALGRIND_MAKE_MEM_NOACCESS(BufferGetPage(b), BLCKSZ); + } +#endif /* * Decrement the shared reference count. @@ -2007,6 +2039,12 @@ BufferSync(int flags) */ if (pg_atomic_read_u32(&bufHdr->state) & BM_CHECKPOINT_NEEDED) { +#ifdef USE_VALGRIND + { + Buffer b = BufferDescriptorGetBuffer(bufHdr); + VALGRIND_MAKE_MEM_DEFINED(BufferGetPage(b), BLCKSZ); + } +#endif if (SyncOneBuffer(buf_id, false, &wb_context) & BUF_WRITTEN) { TRACE_POSTGRESQL_BUFFER_SYNC_WRITTEN(buf_id); @@ -2730,6 +2768,12 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) * Run PageGetLSN while holding header lock, since we don't have the * buffer locked exclusively in all cases. */ +#ifdef USE_VALGRIND + { + Buffer b = BufferDescriptorGetBuffer(buf); + VALGRIND_MAKE_MEM_DEFINED(BufferGetPage(b), BLCKSZ); + } +#endif recptr = BufferGetLSN(buf); /* To check if block content changes while flushing. - vadim 01/17/97 */ -- 2.25.1