Commit b97c4bc16734a2e597dac7f91ee9eb78f4aeef9a
Committed by
Thomas Gleixner
1 parent
f56e8a0765
Exists in
master
and in
4 other branches
locking: Make sparse work with inline spinlocks and rwlocks
Currently sparse does not work with inline spinlock and rwlock functions. The problem is that they do not use the __acquires/__releases out-of-line functions, but use inline functions with no sparse annotations. This patch adds the appropriate annotations to make it work properly. Signed-off-by: Luca Barbieri <luca@luca-barbieri.com> Cc: Ingo Molnar <mingo@elte.hu> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Showing 2 changed files with 18 additions and 15 deletions Side-by-side Diff
include/linux/rwlock.h
... | ... | @@ -29,25 +29,25 @@ |
29 | 29 | #endif |
30 | 30 | |
31 | 31 | #ifdef CONFIG_DEBUG_SPINLOCK |
32 | - extern void do_raw_read_lock(rwlock_t *lock); | |
32 | + extern void do_raw_read_lock(rwlock_t *lock) __acquires(lock); | |
33 | 33 | #define do_raw_read_lock_flags(lock, flags) do_raw_read_lock(lock) |
34 | 34 | extern int do_raw_read_trylock(rwlock_t *lock); |
35 | - extern void do_raw_read_unlock(rwlock_t *lock); | |
36 | - extern void do_raw_write_lock(rwlock_t *lock); | |
35 | + extern void do_raw_read_unlock(rwlock_t *lock) __releases(lock); | |
36 | + extern void do_raw_write_lock(rwlock_t *lock) __acquires(lock); | |
37 | 37 | #define do_raw_write_lock_flags(lock, flags) do_raw_write_lock(lock) |
38 | 38 | extern int do_raw_write_trylock(rwlock_t *lock); |
39 | - extern void do_raw_write_unlock(rwlock_t *lock); | |
39 | + extern void do_raw_write_unlock(rwlock_t *lock) __releases(lock); | |
40 | 40 | #else |
41 | -# define do_raw_read_lock(rwlock) arch_read_lock(&(rwlock)->raw_lock) | |
41 | +# define do_raw_read_lock(rwlock) do {__acquire(lock); arch_read_lock(&(rwlock)->raw_lock); } while (0) | |
42 | 42 | # define do_raw_read_lock_flags(lock, flags) \ |
43 | - arch_read_lock_flags(&(lock)->raw_lock, *(flags)) | |
43 | + do {__acquire(lock); arch_read_lock_flags(&(lock)->raw_lock, *(flags)); } while (0) | |
44 | 44 | # define do_raw_read_trylock(rwlock) arch_read_trylock(&(rwlock)->raw_lock) |
45 | -# define do_raw_read_unlock(rwlock) arch_read_unlock(&(rwlock)->raw_lock) | |
46 | -# define do_raw_write_lock(rwlock) arch_write_lock(&(rwlock)->raw_lock) | |
45 | +# define do_raw_read_unlock(rwlock) do {arch_read_unlock(&(rwlock)->raw_lock); __release(lock); } while (0) | |
46 | +# define do_raw_write_lock(rwlock) do {__acquire(lock); arch_write_lock(&(rwlock)->raw_lock); } while (0) | |
47 | 47 | # define do_raw_write_lock_flags(lock, flags) \ |
48 | - arch_write_lock_flags(&(lock)->raw_lock, *(flags)) | |
48 | + do {__acquire(lock); arch_write_lock_flags(&(lock)->raw_lock, *(flags)); } while (0) | |
49 | 49 | # define do_raw_write_trylock(rwlock) arch_write_trylock(&(rwlock)->raw_lock) |
50 | -# define do_raw_write_unlock(rwlock) arch_write_unlock(&(rwlock)->raw_lock) | |
50 | +# define do_raw_write_unlock(rwlock) do {arch_write_unlock(&(rwlock)->raw_lock); __release(lock); } while (0) | |
51 | 51 | #endif |
52 | 52 | |
53 | 53 | #define read_can_lock(rwlock) arch_read_can_lock(&(rwlock)->raw_lock) |
include/linux/spinlock.h
... | ... | @@ -128,19 +128,21 @@ |
128 | 128 | #define raw_spin_unlock_wait(lock) arch_spin_unlock_wait(&(lock)->raw_lock) |
129 | 129 | |
130 | 130 | #ifdef CONFIG_DEBUG_SPINLOCK |
131 | - extern void do_raw_spin_lock(raw_spinlock_t *lock); | |
131 | + extern void do_raw_spin_lock(raw_spinlock_t *lock) __acquires(lock); | |
132 | 132 | #define do_raw_spin_lock_flags(lock, flags) do_raw_spin_lock(lock) |
133 | 133 | extern int do_raw_spin_trylock(raw_spinlock_t *lock); |
134 | - extern void do_raw_spin_unlock(raw_spinlock_t *lock); | |
134 | + extern void do_raw_spin_unlock(raw_spinlock_t *lock) __releases(lock); | |
135 | 135 | #else |
136 | -static inline void do_raw_spin_lock(raw_spinlock_t *lock) | |
136 | +static inline void do_raw_spin_lock(raw_spinlock_t *lock) __acquires(lock) | |
137 | 137 | { |
138 | + __acquire(lock); | |
138 | 139 | arch_spin_lock(&lock->raw_lock); |
139 | 140 | } |
140 | 141 | |
141 | 142 | static inline void |
142 | -do_raw_spin_lock_flags(raw_spinlock_t *lock, unsigned long *flags) | |
143 | +do_raw_spin_lock_flags(raw_spinlock_t *lock, unsigned long *flags) __acquires(lock) | |
143 | 144 | { |
145 | + __acquire(lock); | |
144 | 146 | arch_spin_lock_flags(&lock->raw_lock, *flags); |
145 | 147 | } |
146 | 148 | |
147 | 149 | |
... | ... | @@ -149,9 +151,10 @@ |
149 | 151 | return arch_spin_trylock(&(lock)->raw_lock); |
150 | 152 | } |
151 | 153 | |
152 | -static inline void do_raw_spin_unlock(raw_spinlock_t *lock) | |
154 | +static inline void do_raw_spin_unlock(raw_spinlock_t *lock) __releases(lock) | |
153 | 155 | { |
154 | 156 | arch_spin_unlock(&lock->raw_lock); |
157 | + __release(lock); | |
155 | 158 | } |
156 | 159 | #endif |
157 | 160 |