mirror of
https://github.com/postgres/postgres.git
synced 2026-10-23 13:29:09 +03:00
Use a non-locking initial test in TAS_SPIN on AArch64.
Our testing showed that this is helpful at sufficiently high contention levels and doesn't hurt performance on smaller machines. The new TAS_SPIN macro for AArch64 is identical to the ones added for PPC and x86_64 (see commitsbc2a050d40andb03d196be0). Back-patch of commit3d0b4b1068, which first shipped in v18. Salvatore Dipietro reports that this change is beneficial on newer Linux kernels, and the original commit has aged long enough to provide some confidence that it won't cause problems. v14 is left alone since it lacks commita82a5eee31and will soon be out of support. Reported-by: Salvatore Dipietro <dipiets@amazon.it> Reviewed-by: Jingtang Zhang <mrdrivingduck@gmail.com> Reviewed-by: Andres Freund <andres@anarazel.de> Tested-by: Tom Lane <tgl@sss.pgh.pa.us> Discussion: https://postgr.es/m/ZxgDEb_VpWyNZKB_%40nathan Discussion: https://postgr.es/m/20260915114623.431827-1-dipiets%40amazon.it Backpatch-through: 15
This commit is contained in:
@@ -272,18 +272,24 @@ tas(volatile slock_t *lock)
|
||||
|
||||
#define S_UNLOCK(lock) __sync_lock_release(lock)
|
||||
|
||||
/*
|
||||
* Using an ISB instruction to delay in spinlock loops appears beneficial on
|
||||
* high-core-count ARM64 processors. It seems mostly a wash for smaller gear,
|
||||
* and ISB doesn't exist at all on pre-v7 ARM chips.
|
||||
*/
|
||||
#if defined(__aarch64__)
|
||||
|
||||
/*
|
||||
* On ARM64, it's a win to use a non-locking test before the TAS proper. It
|
||||
* may be a win on 32-bit ARM, too, but nobody's tested it yet.
|
||||
*/
|
||||
#define TAS_SPIN(lock) (*(lock) ? 1 : TAS(lock))
|
||||
|
||||
#define SPIN_DELAY() spin_delay()
|
||||
|
||||
static __inline__ void
|
||||
spin_delay(void)
|
||||
{
|
||||
/*
|
||||
* Using an ISB instruction to delay in spinlock loops appears beneficial
|
||||
* on high-core-count ARM64 processors. It seems mostly a wash for smaller
|
||||
* gear, and ISB doesn't exist at all on pre-v7 ARM chips.
|
||||
*/
|
||||
__asm__ __volatile__(
|
||||
" isb; \n");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user