Skip to content

Commit b94409a

Browse files
committed
Prevent lwlock dtrace probes from unnecessary work
If dtrace is compiled in but disabled, the lwlock dtrace probes still evaluate their arguments. Since PostgreSQL 13, T_NAME(lock) does nontrivial work, so it should be avoided if not needed. To fix, make these calls conditional on the *_ENABLED() macro corresponding to each probe. Reviewed-by: Craig Ringer <[email protected]> Discussion: https://www.postgresql.org/message-id/CAGRY4nwxKUS_RvXFW-ugrZBYxPFFM5kjwKT5O+0+Stuga5b4+Q@mail.gmail.com
1 parent c285bab commit b94409a

File tree

1 file changed

+24
-12
lines changed

1 file changed

+24
-12
lines changed

src/backend/storage/lmgr/lwlock.c

+24-12
Original file line numberDiff line numberDiff line change
@@ -1318,7 +1318,8 @@ LWLockAcquire(LWLock *lock, LWLockMode mode)
13181318
#endif
13191319

13201320
LWLockReportWaitStart(lock);
1321-
TRACE_POSTGRESQL_LWLOCK_WAIT_START(T_NAME(lock), mode);
1321+
if (TRACE_POSTGRESQL_LWLOCK_WAIT_START_ENABLED())
1322+
TRACE_POSTGRESQL_LWLOCK_WAIT_START(T_NAME(lock), mode);
13221323

13231324
for (;;)
13241325
{
@@ -1340,7 +1341,8 @@ LWLockAcquire(LWLock *lock, LWLockMode mode)
13401341
}
13411342
#endif
13421343

1343-
TRACE_POSTGRESQL_LWLOCK_WAIT_DONE(T_NAME(lock), mode);
1344+
if (TRACE_POSTGRESQL_LWLOCK_WAIT_DONE_ENABLED())
1345+
TRACE_POSTGRESQL_LWLOCK_WAIT_DONE(T_NAME(lock), mode);
13441346
LWLockReportWaitEnd();
13451347

13461348
LOG_LWDEBUG("LWLockAcquire", lock, "awakened");
@@ -1349,7 +1351,8 @@ LWLockAcquire(LWLock *lock, LWLockMode mode)
13491351
result = false;
13501352
}
13511353

1352-
TRACE_POSTGRESQL_LWLOCK_ACQUIRE(T_NAME(lock), mode);
1354+
if (TRACE_POSTGRESQL_LWLOCK_ACQUIRE_ENABLED())
1355+
TRACE_POSTGRESQL_LWLOCK_ACQUIRE(T_NAME(lock), mode);
13531356

13541357
/* Add lock to list of locks held by this backend */
13551358
held_lwlocks[num_held_lwlocks].lock = lock;
@@ -1400,14 +1403,16 @@ LWLockConditionalAcquire(LWLock *lock, LWLockMode mode)
14001403
RESUME_INTERRUPTS();
14011404

14021405
LOG_LWDEBUG("LWLockConditionalAcquire", lock, "failed");
1403-
TRACE_POSTGRESQL_LWLOCK_CONDACQUIRE_FAIL(T_NAME(lock), mode);
1406+
if (TRACE_POSTGRESQL_LWLOCK_CONDACQUIRE_FAIL_ENABLED())
1407+
TRACE_POSTGRESQL_LWLOCK_CONDACQUIRE_FAIL(T_NAME(lock), mode);
14041408
}
14051409
else
14061410
{
14071411
/* Add lock to list of locks held by this backend */
14081412
held_lwlocks[num_held_lwlocks].lock = lock;
14091413
held_lwlocks[num_held_lwlocks++].mode = mode;
1410-
TRACE_POSTGRESQL_LWLOCK_CONDACQUIRE(T_NAME(lock), mode);
1414+
if (TRACE_POSTGRESQL_LWLOCK_CONDACQUIRE_ENABLED())
1415+
TRACE_POSTGRESQL_LWLOCK_CONDACQUIRE(T_NAME(lock), mode);
14111416
}
14121417
return !mustwait;
14131418
}
@@ -1479,7 +1484,8 @@ LWLockAcquireOrWait(LWLock *lock, LWLockMode mode)
14791484
#endif
14801485

14811486
LWLockReportWaitStart(lock);
1482-
TRACE_POSTGRESQL_LWLOCK_WAIT_START(T_NAME(lock), mode);
1487+
if (TRACE_POSTGRESQL_LWLOCK_WAIT_START_ENABLED())
1488+
TRACE_POSTGRESQL_LWLOCK_WAIT_START(T_NAME(lock), mode);
14831489

14841490
for (;;)
14851491
{
@@ -1497,7 +1503,8 @@ LWLockAcquireOrWait(LWLock *lock, LWLockMode mode)
14971503
Assert(nwaiters < MAX_BACKENDS);
14981504
}
14991505
#endif
1500-
TRACE_POSTGRESQL_LWLOCK_WAIT_DONE(T_NAME(lock), mode);
1506+
if (TRACE_POSTGRESQL_LWLOCK_WAIT_DONE_ENABLED())
1507+
TRACE_POSTGRESQL_LWLOCK_WAIT_DONE(T_NAME(lock), mode);
15011508
LWLockReportWaitEnd();
15021509

15031510
LOG_LWDEBUG("LWLockAcquireOrWait", lock, "awakened");
@@ -1527,15 +1534,17 @@ LWLockAcquireOrWait(LWLock *lock, LWLockMode mode)
15271534
/* Failed to get lock, so release interrupt holdoff */
15281535
RESUME_INTERRUPTS();
15291536
LOG_LWDEBUG("LWLockAcquireOrWait", lock, "failed");
1530-
TRACE_POSTGRESQL_LWLOCK_ACQUIRE_OR_WAIT_FAIL(T_NAME(lock), mode);
1537+
if (TRACE_POSTGRESQL_LWLOCK_ACQUIRE_OR_WAIT_FAIL_ENABLED())
1538+
TRACE_POSTGRESQL_LWLOCK_ACQUIRE_OR_WAIT_FAIL(T_NAME(lock), mode);
15311539
}
15321540
else
15331541
{
15341542
LOG_LWDEBUG("LWLockAcquireOrWait", lock, "succeeded");
15351543
/* Add lock to list of locks held by this backend */
15361544
held_lwlocks[num_held_lwlocks].lock = lock;
15371545
held_lwlocks[num_held_lwlocks++].mode = mode;
1538-
TRACE_POSTGRESQL_LWLOCK_ACQUIRE_OR_WAIT(T_NAME(lock), mode);
1546+
if (TRACE_POSTGRESQL_LWLOCK_ACQUIRE_OR_WAIT_ENABLED())
1547+
TRACE_POSTGRESQL_LWLOCK_ACQUIRE_OR_WAIT(T_NAME(lock), mode);
15391548
}
15401549

15411550
return !mustwait;
@@ -1695,7 +1704,8 @@ LWLockWaitForVar(LWLock *lock, uint64 *valptr, uint64 oldval, uint64 *newval)
16951704
#endif
16961705

16971706
LWLockReportWaitStart(lock);
1698-
TRACE_POSTGRESQL_LWLOCK_WAIT_START(T_NAME(lock), LW_EXCLUSIVE);
1707+
if (TRACE_POSTGRESQL_LWLOCK_WAIT_START_ENABLED())
1708+
TRACE_POSTGRESQL_LWLOCK_WAIT_START(T_NAME(lock), LW_EXCLUSIVE);
16991709

17001710
for (;;)
17011711
{
@@ -1714,7 +1724,8 @@ LWLockWaitForVar(LWLock *lock, uint64 *valptr, uint64 oldval, uint64 *newval)
17141724
}
17151725
#endif
17161726

1717-
TRACE_POSTGRESQL_LWLOCK_WAIT_DONE(T_NAME(lock), LW_EXCLUSIVE);
1727+
if (TRACE_POSTGRESQL_LWLOCK_WAIT_DONE_ENABLED())
1728+
TRACE_POSTGRESQL_LWLOCK_WAIT_DONE(T_NAME(lock), LW_EXCLUSIVE);
17181729
LWLockReportWaitEnd();
17191730

17201731
LOG_LWDEBUG("LWLockWaitForVar", lock, "awakened");
@@ -1840,7 +1851,8 @@ LWLockRelease(LWLock *lock)
18401851
/* nobody else can have that kind of lock */
18411852
Assert(!(oldstate & LW_VAL_EXCLUSIVE));
18421853

1843-
TRACE_POSTGRESQL_LWLOCK_RELEASE(T_NAME(lock));
1854+
if (TRACE_POSTGRESQL_LWLOCK_RELEASE_ENABLED())
1855+
TRACE_POSTGRESQL_LWLOCK_RELEASE(T_NAME(lock));
18441856

18451857
/*
18461858
* We're still waiting for backends to get scheduled, don't wake them up

0 commit comments

Comments
 (0)