Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

locking/percpu-rwsem: Add percpu_is_write_locked() and percpu_is_read_locked()

Implement simple accessors to probe percpu-rwsem's locked state:
percpu_is_write_locked(), percpu_is_read_locked().

Signed-off-by: Marco Elver <elver@google.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Reviewed-by: Dmitry Vyukov <dvyukov@google.com>
Acked-by: Ian Rogers <irogers@google.com>
Link: https://lore.kernel.org/r/20220829124719.675715-11-elver@google.com

authored by

Marco Elver and committed by
Peter Zijlstra
01fe8a3f f95e5a3d

+12
+6
include/linux/percpu-rwsem.h
··· 121 121 preempt_enable(); 122 122 } 123 123 124 + extern bool percpu_is_read_locked(struct percpu_rw_semaphore *); 124 125 extern void percpu_down_write(struct percpu_rw_semaphore *); 125 126 extern void percpu_up_write(struct percpu_rw_semaphore *); 127 + 128 + static inline bool percpu_is_write_locked(struct percpu_rw_semaphore *sem) 129 + { 130 + return atomic_read(&sem->block); 131 + } 126 132 127 133 extern int __percpu_init_rwsem(struct percpu_rw_semaphore *, 128 134 const char *, struct lock_class_key *);
+6
kernel/locking/percpu-rwsem.c
··· 192 192 __sum; \ 193 193 }) 194 194 195 + bool percpu_is_read_locked(struct percpu_rw_semaphore *sem) 196 + { 197 + return per_cpu_sum(*sem->read_count) != 0 && !atomic_read(&sem->block); 198 + } 199 + EXPORT_SYMBOL_GPL(percpu_is_read_locked); 200 + 195 201 /* 196 202 * Return true if the modular sum of the sem->read_count per-CPU variable is 197 203 * zero. If this sum is zero, then it is stable due to the fact that if any