pgsql: Prevent potentially hazardous compiler/cpu reordering during lwl

From: Andres Freund <andres(at)anarazel(dot)de>
To: pgsql-committers(at)postgresql(dot)org
Subject: pgsql: Prevent potentially hazardous compiler/cpu reordering during lwl
Date: 2014-12-19 14:01:05
Message-ID: E1Y1y77-0002qn-Tr@gemulon.postgresql.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-committers

Prevent potentially hazardous compiler/cpu reordering during lwlock release.

In LWLockRelease() (and in 9.4+ LWLockUpdateVar()) we release enqueued
waiters using PGSemaphoreUnlock(). As there are other sources of such
unlocks backends only wake up if MyProc->lwWaiting is set to false;
which is only done in the aforementioned functions.

Before this commit there were dangers because the store to lwWaitLink
could become visible before the store to lwWaitLink. This could both
happen due to compiler reordering (on most compilers) and on some
platforms due to the CPU reordering stores.

The possible consequence of this is that a backend stops waiting
before lwWaitLink is set to NULL. If that backend then tries to
acquire another lock and has to wait there the list could become
corrupted once the lwWaitLink store is finally performed.

Add a write memory barrier to prevent that issue.

Unfortunately the barrier support has been only added in 9.2. Given
that the issue has not knowingly been observed in praxis it seems
sufficient to prohibit compiler reordering using volatile for 9.0 and
9.1. Actual problems due to compiler reordering are more likely
anyway.

Discussion: 20140210134625(dot)GA15246(at)awork2(dot)anarazel(dot)de

Branch
------
REL9_2_STABLE

Details
-------
http://git.postgresql.org/pg/commitdiff/b71e37c88354387819b53cf6580db861c89e8943

Modified Files
--------------
src/backend/storage/lmgr/lwlock.c | 12 ++++++++++++
1 file changed, 12 insertions(+)

Browse pgsql-committers by date

  From Date Subject
Next Message Andres Freund 2014-12-19 14:01:23 pgsql: Prevent potentially hazardous compiler/cpu reordering during lwl
Previous Message Andres Freund 2014-12-19 14:00:49 pgsql: Prevent potentially hazardous compiler/cpu reordering during lwl