[PATCH v2] Avoid memory barrier in read_seqcount() through load acquire
Christoph Lameter (Ampere)
cl at gentwo.org
Wed Aug 28 10:15:33 PDT 2024
On Fri, 23 Aug 2024, Thomas Gleixner wrote:
> This all can be done without the extra copies of the counter
> accessors. Uncompiled patch below.
Great. Thanks. Tried it too initially but could not make it work right.
One thing that we also want is the use of the smp_cond_load_acquire to
have the cpu power down while waiting for a cacheline change.
The code has several places where loops occur when the last bit is set in
the seqcount.
We could use smp_cond_load_acquire in load_sequence() but what do we do
about the loops at the higher level? Also this does not sync with the lock
checking logic.
diff --git a/include/linux/seqlock.h b/include/linux/seqlock.h
index 68b3af8bd6c6..4442a97ffe9a 100644
--- a/include/linux/seqlock.h
+++ b/include/linux/seqlock.h
@@ -135,7 +135,7 @@ static inline void seqcount_lockdep_reader_access(const seqcount_t *s)
static __always_inline unsigned __seqprop_load_sequence(const seqcount_t *s, bool acquire)
{
if (acquire && IS_ENABLED(CONFIG_ARCH_HAS_ACQUIRE_RELEASE))
- return smp_load_acquire(&s->sequence);
+ return smp_cond_load_acquire(&s->sequence, (s->sequence & 1) == 0);
else
return READ_ONCE(s->sequence);
}
More information about the linux-arm-kernel
mailing list