Re: Server hangs on multiple connections

From: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
To: David Christian <davidc(at)comtechmobile(dot)com>
Cc: pgsql-bugs(at)postgreSQL(dot)org
Subject: Re: Server hangs on multiple connections
Date: 2002-09-21 00:40:39
Message-ID: 4882.1032568839@sss.pgh.pa.us
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-bugs

Well, the long and the short of it seems to be that no one before you
ever tried to run Postgres on a multi-CPU PowerPC machine :-(

Some digging around on the net made it clear that we were missing
synchronization instructions that are critical for access to shared
memory in a multi-CPU system. I have applied the attached patch to
CVS tip (7.3beta2-almost). It looks like it will apply cleanly to
7.2.*, so please try it out (with optimization re-enabled) and let
us know what you see!

(I have confirmed that this patch causes no trouble on LinuxPPC and
OS X 10.1, but I do not have a multi-CPU machine to see if it really
solves the problem...)

regards, tom lane

*** src/backend/storage/lmgr/s_lock.c.orig Thu Jun 20 16:29:35 2002
--- src/backend/storage/lmgr/s_lock.c Fri Sep 20 20:11:53 2002
***************
*** 115,120 ****
--- 115,123 ----
/* 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,139 ****
--- 137,143 ----
fail: li r3,1 \n\
blr \n\
success: \n\
+ isync \n\
li r3,0 \n\
blr \n\
");
***************
*** 158,163 ****
--- 162,168 ----
fail: li 3,1 \n\
blr \n\
success: \n\
+ isync \n\
li 3,0 \n\
blr \n\
");
*** src/include/storage/s_lock.h.orig Mon Sep 2 09:50:09 2002
--- src/include/storage/s_lock.h Fri Sep 20 20:11:46 2002
***************
*** 217,222 ****
--- 217,237 ----
#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

Responses

Browse pgsql-bugs by date

  From Date Subject
Next Message elein 2002-09-22 00:35:21 plpython plpy.log/warning minor aesthetic bug
Previous Message Deron Brookins 2002-09-20 22:09:28 Re: Fix for PSQL 7.2.2 doesn't compile on OS X 10.2