bufmgr: Pass io_object and io_context through to PinBufferForBlock()

PinBufferForBlock() is always_inline and called in a loop in
StartReadBuffersImpl(). Previously it computed io_context and io_object
internally, which required calling IOContextForStrategy() -- a non-inline
function the compiler cannot prove is side-effect-free. This could potential
cause unneeded redundant function calls.

Compute io_context and io_object in the callers instead, allowing
StartReadBuffersImpl() to do so once before entering the loop.

Author: Melanie Plageman <melanieplageman@gmail.com>
Suggested-by: Andres Freund <andres@anarazel.de>
Discussion: https://postgr.es/m/zljergweqti7x67lg5ije2rzjusie37nslsnkjkkby4laqqbfw@3p3zu522yykv
This commit is contained in:
Andres Freund 2026-03-26 10:50:44 -04:00
parent 5dcb15e89a
commit c2a68e08b1

View file

@ -1223,11 +1223,11 @@ PinBufferForBlock(Relation rel,
ForkNumber forkNum,
BlockNumber blockNum,
BufferAccessStrategy strategy,
IOObject io_object,
IOContext io_context,
bool *foundPtr)
{
BufferDesc *bufHdr;
IOContext io_context;
IOObject io_object;
Assert(blockNum != P_NEW);
@ -1236,17 +1236,6 @@ PinBufferForBlock(Relation rel,
persistence == RELPERSISTENCE_PERMANENT ||
persistence == RELPERSISTENCE_UNLOGGED));
if (persistence == RELPERSISTENCE_TEMP)
{
io_context = IOCONTEXT_NORMAL;
io_object = IOOBJECT_TEMP_RELATION;
}
else
{
io_context = IOContextForStrategy(strategy);
io_object = IOOBJECT_RELATION;
}
TRACE_POSTGRESQL_BUFFER_READ_START(forkNum, blockNum,
smgr->smgr_rlocator.locator.spcOid,
smgr->smgr_rlocator.locator.dbOid,
@ -1339,9 +1328,23 @@ ReadBuffer_common(Relation rel, SMgrRelation smgr, char smgr_persistence,
mode == RBM_ZERO_AND_LOCK))
{
bool found;
IOContext io_context;
IOObject io_object;
if (persistence == RELPERSISTENCE_TEMP)
{
io_context = IOCONTEXT_NORMAL;
io_object = IOOBJECT_TEMP_RELATION;
}
else
{
io_context = IOContextForStrategy(strategy);
io_object = IOOBJECT_RELATION;
}
buffer = PinBufferForBlock(rel, smgr, persistence,
forkNum, blockNum, strategy, &found);
forkNum, blockNum, strategy,
io_object, io_context, &found);
ZeroAndLockBuffer(buffer, mode, found);
return buffer;
}
@ -1379,11 +1382,24 @@ StartReadBuffersImpl(ReadBuffersOperation *operation,
int actual_nblocks = *nblocks;
int maxcombine = 0;
bool did_start_io;
IOContext io_context;
IOObject io_object;
Assert(*nblocks == 1 || allow_forwarding);
Assert(*nblocks > 0);
Assert(*nblocks <= MAX_IO_COMBINE_LIMIT);
if (operation->persistence == RELPERSISTENCE_TEMP)
{
io_context = IOCONTEXT_NORMAL;
io_object = IOOBJECT_TEMP_RELATION;
}
else
{
io_context = IOContextForStrategy(operation->strategy);
io_object = IOOBJECT_RELATION;
}
for (int i = 0; i < actual_nblocks; ++i)
{
bool found;
@ -1432,6 +1448,7 @@ StartReadBuffersImpl(ReadBuffersOperation *operation,
operation->forknum,
blockNum + i,
operation->strategy,
io_object, io_context,
&found);
}