From c7c5ff7f9edf4ee4d4e4eb7edff20f64b5f8dc1a Mon Sep 17 00:00:00 2001 From: Peter Geoghegan Date: Thu, 30 Apr 2020 12:31:42 -0700 Subject: [PATCH v3 1/2] Add Valgrind buffer access instrumentation. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Based on a patch from Álvaro Herrera posted to: https://www.postgresql.org/message-id/20150723195349.GW5596@postgresql.org --- src/backend/storage/buffer/bufmgr.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 29c920800a..8ef073b382 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" @@ -1633,6 +1634,13 @@ PinBuffer(BufferDesc *buf, BufferAccessStrategy strategy) buf_state)) { result = (buf_state & BM_VALID) != 0; + + /* + * If we successfully acquired our first pin on this buffer + * within this backend, mark buffer contents defined + */ + if (result) + VALGRIND_MAKE_MEM_DEFINED(BufHdrGetBlock(buf), BLCKSZ); break; } } @@ -1683,6 +1691,13 @@ PinBuffer_Locked(BufferDesc *buf) */ Assert(GetPrivateRefCountEntry(BufferDescriptorGetBuffer(buf), false) == NULL); + /* + * Buffer can't have a preexisting pin, so mark its page as defined to + * Valgrind (this is similar to the PinBuffer() case where the backend + * doesn't already have a buffer pin) + */ + VALGRIND_MAKE_MEM_DEFINED(BufHdrGetBlock(buf), BLCKSZ); + /* * Since we hold the buffer spinlock, we can update the buffer state and * release the lock in one operation. @@ -1728,6 +1743,9 @@ UnpinBuffer(BufferDesc *buf, bool fixOwner) uint32 buf_state; uint32 old_buf_state; + /* Mark undefined, now that no pins remain in backend */ + VALGRIND_MAKE_MEM_NOACCESS(BufHdrGetBlock(buf), BLCKSZ); + /* I'd better not still hold any locks on the buffer */ Assert(!LWLockHeldByMe(BufferDescriptorGetContentLock(buf))); Assert(!LWLockHeldByMe(BufferDescriptorGetIOLock(buf))); -- 2.25.1