mirror of
https://github.com/torvalds/linux.git
synced 2026-05-28 17:13:52 +02:00
seqlock: add raw_seqcount_try_begin
Add raw_seqcount_try_begin() to opens a read critical section of the given seqcount_t if the counter is even. This enables eliding the critical section entirely if the counter is odd, instead of doing the speculation knowing it will fail. Suggested-by: Peter Zijlstra <peterz@infradead.org> Signed-off-by: Suren Baghdasaryan <surenb@google.com> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Reviewed-by: David Hildenbrand <david@redhat.com> Reviewed-by: Liam R. Howlett <Liam.Howlett@Oracle.com> Link: https://lkml.kernel.org/r/20241122174416.1367052-1-surenb@google.com
This commit is contained in:
parent
b4943b8bfc
commit
96450ead16
|
|
@ -318,6 +318,28 @@ SEQCOUNT_LOCKNAME(mutex, struct mutex, true, mutex)
|
|||
__seq; \
|
||||
})
|
||||
|
||||
/**
|
||||
* raw_seqcount_try_begin() - begin a seqcount_t read critical section
|
||||
* w/o lockdep and w/o counter stabilization
|
||||
* @s: Pointer to seqcount_t or any of the seqcount_LOCKNAME_t variants
|
||||
*
|
||||
* Similar to raw_seqcount_begin(), except it enables eliding the critical
|
||||
* section entirely if odd, instead of doing the speculation knowing it will
|
||||
* fail.
|
||||
*
|
||||
* Useful when counter stabilization is more or less equivalent to taking
|
||||
* the lock and there is a slowpath that does that.
|
||||
*
|
||||
* If true, start will be set to the (even) sequence count read.
|
||||
*
|
||||
* Return: true when a read critical section is started.
|
||||
*/
|
||||
#define raw_seqcount_try_begin(s, start) \
|
||||
({ \
|
||||
start = raw_read_seqcount(s); \
|
||||
!(start & 1); \
|
||||
})
|
||||
|
||||
/**
|
||||
* raw_seqcount_begin() - begin a seqcount_t read critical section w/o
|
||||
* lockdep and w/o counter stabilization
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user