From 123d6ca31b8968067fcade7378382dbfe95ebfb0 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Mon, 30 Sep 2002 20:24:53 +0000 Subject: [PATCH] Back-patch fix for correct TAS operation on multi-CPU PPC machines. --- src/backend/storage/lmgr/s_lock.c | 5 +++++ src/include/storage/s_lock.h | 15 +++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/src/backend/storage/lmgr/s_lock.c b/src/backend/storage/lmgr/s_lock.c index 4d951e79ab..3551abaae5 100644 --- a/src/backend/storage/lmgr/s_lock.c +++ b/src/backend/storage/lmgr/s_lock.c @@ -115,6 +115,9 @@ _success: \n\ /* used in darwin. */ /* We key off __APPLE__ here because this function differs from * the LinuxPPC implementation only in compiler syntax. + * + * NOTE: per the Enhanced PowerPC Architecture manual, v1.0 dated 7-May-2002, + * an isync is a sufficient synchronization barrier after a lwarx/stwcx loop. */ static void tas_dummy() @@ -134,6 +137,7 @@ tas: \n\ fail: li r3,1 \n\ blr \n\ success: \n\ + isync \n\ li r3,0 \n\ blr \n\ "); @@ -158,6 +162,7 @@ tas: \n\ fail: li 3,1 \n\ blr \n\ success: \n\ + isync \n\ li 3,0 \n\ blr \n\ "); diff --git a/src/include/storage/s_lock.h b/src/include/storage/s_lock.h index 711b7ee585..1e01fe86fe 100644 --- a/src/include/storage/s_lock.h +++ b/src/include/storage/s_lock.h @@ -217,6 +217,21 @@ tas(volatile slock_t *lock) #endif /* defined(__mc68000__) && defined(__linux__) */ +#if defined(__ppc__) || defined(__powerpc__) +/* + * We currently use out-of-line assembler for TAS on PowerPC; see s_lock.c. + * S_UNLOCK is almost standard but requires a "sync" instruction. + */ +#define S_UNLOCK(lock) \ +do \ +{\ + __asm__ __volatile__ (" sync \n"); \ + *((volatile slock_t *) (lock)) = 0; \ +} while (0) + +#endif /* defined(__ppc__) || defined(__powerpc__) */ + + #if defined(NEED_VAX_TAS_ASM) /* * VAXen -- even multiprocessor ones -- 2.39.5