mirror of
https://github.com/postgres/postgres.git
synced 2026-03-28 13:23:48 -04:00
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:
parent
5dcb15e89a
commit
c2a68e08b1
1 changed files with 31 additions and 14 deletions
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue