| From: | shihao zhong <zhong950419(at)gmail(dot)com> |
|---|---|
| To: | Alexandre Felipe <o(dot)alexandre(dot)felipe(at)gmail(dot)com> |
| Cc: | Andres Freund <andres(at)anarazel(dot)de>, PostgreSQL Hackers <pgsql-hackers(at)lists(dot)postgresql(dot)org> |
| Subject: | Re: Throwing away unnecessary spin-locks |
| Date: | 2026-10-02 05:30:07 |
| Message-ID: | CAGRkXqT-SAZqdR=HT7DFiYOseBQK8Be8YNX4TjiRJ=v=MZh6jw@mail.gmail.com |
| Views: | Whole Thread | Raw Message | Download mbox | Resend email |
| Thread: | |
| Lists: | pgsql-hackers |
Hi Alexandre,
> #define SLOCK_DEFINE_SCALAR_ACCESSORS(typename) \
> static inline typename \
> slock_read_barrier_##typename(volatile slock_t *lock, volatile typename
*p) \
> { \
> typename val; \
> \
> (void) lock; \
> AssertPointerAlignment(p, alignof(typename)); \
> val = *p; \
> pg_read_barrier(); \
> return val; \
> } \
> static inline void \
> slock_write_barrier_##typename(volatile slock_t *lock, volatile typename
*p, typename v) \
> { \
> (void) lock; \
> AssertPointerAlignment(p, alignof(typename)); \
> *p = v; \
> pg_write_barrier(); \
>
> }
On x86 pg_read_barrier() and pg_write_barrier() are only compiler
barriers, so v1 ends up as a plain load and a plain store there. That
hides problems. ARM, RISC-V and POWER are weakly ordered, and on those
a write barrier placed after the store does not order it against the
stores before it. The spinlock version does not have that problem.
I think the safer route is what recent commits like df3978c2340 did,
convert the field to pg_atomic and use pg_atomic_read_membarrier_u32()
and pg_atomic_write_membarrier_u32().
Thanks,
Shihao
| From | Date | Subject | |
|---|---|---|---|
| Next Message | shihao zhong | 2026-10-02 05:37:39 | Re: Set 1s WaitLatch timeout if standby limit has expired in ResolveRecoveryConflictWithBufferPin |
| Previous Message | Alexandre Felipe | 2026-10-02 05:06:01 | Re: Throwing away unnecessary spin-locks |