public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] seqlock: Use WRITE_ONCE() when updating sequence
@ 2024-12-17 23:17 Daniel Xu
  2024-12-18  3:30 ` Waiman Long
                   ` (2 more replies)
  0 siblings, 3 replies; 27+ messages in thread
From: Daniel Xu @ 2024-12-17 23:17 UTC (permalink / raw)
  To: mingo, will, peterz; +Cc: longman, boqun.feng, linux-kernel, paulmck

`sequence` is a concurrently accessed shared variable on the reader
side. Therefore, it needs to be wrapped in WRITE_ONCE() in order to
prevent unwanted compiler optimizations like store tearing.

Signed-off-by: Daniel Xu <dxu@dxuuu.xyz>
---
 include/linux/seqlock.h | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/include/linux/seqlock.h b/include/linux/seqlock.h
index 5298765d6ca4..f4c6f2507742 100644
--- a/include/linux/seqlock.h
+++ b/include/linux/seqlock.h
@@ -45,7 +45,7 @@ static inline void __seqcount_init(seqcount_t *s, const char *name,
 	 * Make sure we are not reinitializing a held lock:
 	 */
 	lockdep_init_map(&s->dep_map, name, key, 0);
-	s->sequence = 0;
+	WRITE_ONCE(s->sequence, 0);
 }
 
 #ifdef CONFIG_DEBUG_LOCK_ALLOC
@@ -405,7 +405,7 @@ do {									\
 static inline void do_raw_write_seqcount_begin(seqcount_t *s)
 {
 	kcsan_nestable_atomic_begin();
-	s->sequence++;
+	WRITE_ONCE(s->sequence, READ_ONCE(s->sequence) + 1);
 	smp_wmb();
 }
 
@@ -426,7 +426,7 @@ do {									\
 static inline void do_raw_write_seqcount_end(seqcount_t *s)
 {
 	smp_wmb();
-	s->sequence++;
+	WRITE_ONCE(s->sequence, READ_ONCE(s->sequence) + 1);
 	kcsan_nestable_atomic_end();
 }
 
@@ -548,9 +548,9 @@ static inline void do_write_seqcount_end(seqcount_t *s)
 static inline void do_raw_write_seqcount_barrier(seqcount_t *s)
 {
 	kcsan_nestable_atomic_begin();
-	s->sequence++;
+	WRITE_ONCE(s->sequence, READ_ONCE(s->sequence) + 1);
 	smp_wmb();
-	s->sequence++;
+	WRITE_ONCE(s->sequence, READ_ONCE(s->sequence) + 1);
 	kcsan_nestable_atomic_end();
 }
 
@@ -569,7 +569,7 @@ static inline void do_write_seqcount_invalidate(seqcount_t *s)
 {
 	smp_wmb();
 	kcsan_nestable_atomic_begin();
-	s->sequence+=2;
+	WRITE_ONCE(s->sequence, READ_ONCE(s->sequence) + 2);
 	kcsan_nestable_atomic_end();
 }
 
@@ -673,7 +673,7 @@ read_seqcount_latch_retry(const seqcount_latch_t *s, unsigned start)
 static __always_inline void raw_write_seqcount_latch(seqcount_latch_t *s)
 {
 	smp_wmb();	/* prior stores before incrementing "sequence" */
-	s->seqcount.sequence++;
+	WRITE_ONCE(s->seqcount.sequence, READ_ONCE(s->seqcount.sequence) + 1);
 	smp_wmb();      /* increment "sequence" before following stores */
 }
 
-- 
2.47.0


^ permalink raw reply related	[flat|nested] 27+ messages in thread

end of thread, other threads:[~2025-01-25  0:32 UTC | newest]

Thread overview: 27+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-12-17 23:17 [PATCH] seqlock: Use WRITE_ONCE() when updating sequence Daniel Xu
2024-12-18  3:30 ` Waiman Long
2024-12-18 15:45   ` Paul E. McKenney
2024-12-18 16:10     ` Waiman Long
2024-12-18 16:57       ` Paul E. McKenney
2024-12-18 18:38         ` Waiman Long
2024-12-18 18:52           ` Paul E. McKenney
2024-12-18 20:09             ` Waiman Long
2024-12-18 10:30 ` Peter Zijlstra
2024-12-18 15:43   ` Paul E. McKenney
2024-12-18 16:23     ` Peter Zijlstra
2024-12-18 16:29       ` Peter Zijlstra
2024-12-18 16:59         ` Paul E. McKenney
2024-12-18 17:12           ` Peter Zijlstra
2024-12-18 19:15             ` Paul E. McKenney
2024-12-18 19:56             ` Florian Weimer
2024-12-19 16:10               ` Paul E. McKenney
2024-12-19 16:45                 ` Florian Weimer
2024-12-19 17:48                   ` Paul E. McKenney
2024-12-19 17:53                   ` Peter Zijlstra
2024-12-19 16:34             ` Will Deacon
2024-12-19 17:53               ` Paul E. McKenney
2024-12-19 17:58                 ` Will Deacon
2024-12-19 18:06                   ` Paul E. McKenney
2024-12-19 18:31                     ` Will Deacon
2024-12-20 17:40                       ` Paul E. McKenney
2025-01-25  0:31 ` Daniel Xu

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox