Re: Atomic operations within spinlocks
Tom Lane <tgl@sss.pgh.pa.us>
From: Tom Lane <tgl@sss.pgh.pa.us>
To: Andres Freund <andres@anarazel.de>
Cc: pgsql-hackers@lists.postgresql.org
Date: 2020-06-04T17:57:19Z
Lists: pgsql-hackers
Andres Freund <andres@anarazel.de> writes: > On 2020-06-03 14:19:45 -0400, Tom Lane wrote: >> This seems to me to be very bad code. > I think straight out prohibiting use of atomics inside a spinlock will > lead to more complicated and slower code, rather than than improving > anything. I'm to blame for the ClockSweepTick() case, and I don't really > see how we could avoid the atomic-while-spinlocked without relying on > 64bit atomics, which are emulated on more platforms, and without having > a more complicated retry loop. Well, if you don't want to touch freelist.c then there is no point worrying about what pg_stat_get_wal_receiver is doing. But having now studied that freelist.c code, I don't like it one bit. It's overly complicated and not very accurately commented, making it *really* hard to convince oneself that it's not buggy. I think a good case could be made for ripping out what's there now and just redefining nextVictimBuffer as a pg_atomic_uint64 that we never reset (ie, make its comment actually true). Then ClockSweepTick reduces to pg_atomic_fetch_add_u64(&StrategyControl->nextVictimBuffer, 1) % NBuffers and when we want to know how many cycles have been completed, we just divide the counter by NBuffers. Now admittedly, this is relying on both pg_atomic_fetch_add_u64 being fast and int64 division being fast ... but to throw your own argument back at you, do we really care anymore about performance on machines where those things aren't true? Furthermore, since all this is happening in a code path that's going to lead to I/O, I'm not exactly convinced that a few nanoseconds matter anyway. regards, tom lane
Commits
-
Convert SpinLock* macros to static inline functions.
- bfc321b4723e 19 (unreleased) landed
-
Clean up includes of s_lock.h.
- f219167910ad 14.0 landed
-
Fix deadlock danger when atomic ops are done under spinlock.
- 5fffa8fce37b 13.0 landed
- 6cc2866c4cdf 12.4 landed
- 825d89dda5ad 11.9 landed
- c2a84bee1228 10.14 landed
- 8bc13287ed3e 9.6.19 landed
- 3e69bf3b142b 9.5.23 landed
- cf1234a10e50 14.0 landed
-
Add basic spinlock tests to regression tests.
- 3f66e1c5a576 10.14 landed
- e027219f2131 11.9 landed
- 008c119928a3 12.4 landed
- 59225dcefef2 13.0 landed
- 3b37a6de027c 14.0 landed
- e8302f107af9 9.6.19 landed
- 7e91f90a8ed4 9.5.23 landed
-
spinlock emulation: Fix bug when more than INT_MAX spinlocks are initialized.
- dcf3cb60cbef 9.5.23 landed
- 660622053419 9.6.19 landed
- b295f666b7f0 10.14 landed
- 34d29222a0bb 11.9 landed
- b91cfaa34f44 12.4 landed
- 276bdc93924a 13.0 landed
- 4d4ca24efe8e 14.0 landed
-
Avoid potential spinlock in a signal handler as part of global barriers.
- 09bff91b316e 13.0 landed
- fd49d5380757 14.0 landed
-
Make pg_stat_wal_receiver consistent with the WAL receiver's shmem info
- 2c8dd05d6cbc 13.0 cited
-
Improve 64bit atomics support.
- e8fdbd58fe56 10.0 cited