Commit b97c4bc16734a2e597dac7f91ee9eb78f4aeef9a

Authored by Luca Barbieri
Committed by Thomas Gleixner
1 parent f56e8a0765

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