Commit cfd3ef2346f924d6c0e82236c20fdb3a8840136a

Authored by Arjan van de Ven
Committed by Linus Torvalds
1 parent ee3ce191e8

[PATCH] lockdep: spin_lock_irqsave_nested()

Introduce spin_lock_irqsave_nested(); implementation from:
 http://lkml.org/lkml/2006/6/1/122
Patch from:
 http://lkml.org/lkml/2006/9/13/258

[akpm@osdl.org: two compile fixes]
Signed-off-by: Arjan van de Ven <arjan@linux.intel.com>
Signed-off-by: Jiri Kosina <jikos@jikos.cz>
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Acked-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>

Showing 3 changed files with 41 additions and 0 deletions Side-by-side Diff

include/linux/spinlock.h
... ... @@ -199,7 +199,22 @@
199 199 BUILD_CHECK_IRQ_FLAGS(flags); \
200 200 flags = _write_lock_irqsave(lock); \
201 201 } while (0)
  202 +
  203 +#ifdef CONFIG_DEBUG_LOCK_ALLOC
  204 +#define spin_lock_irqsave_nested(lock, flags, subclass) \
  205 + do { \
  206 + BUILD_CHECK_IRQ_FLAGS(flags); \
  207 + flags = _spin_lock_irqsave_nested(lock, subclass); \
  208 + } while (0)
202 209 #else
  210 +#define spin_lock_irqsave_nested(lock, flags, subclass) \
  211 + do { \
  212 + BUILD_CHECK_IRQ_FLAGS(flags); \
  213 + flags = _spin_lock_irqsave(lock); \
  214 + } while (0)
  215 +#endif
  216 +
  217 +#else
203 218 #define spin_lock_irqsave(lock, flags) \
204 219 do { \
205 220 BUILD_CHECK_IRQ_FLAGS(flags); \
... ... @@ -215,6 +230,9 @@
215 230 BUILD_CHECK_IRQ_FLAGS(flags); \
216 231 _write_lock_irqsave(lock, flags); \
217 232 } while (0)
  233 +#define spin_lock_irqsave_nested(lock, flags, subclass) \
  234 + spin_lock_irqsave(lock, flags)
  235 +
218 236 #endif
219 237  
220 238 #define spin_lock_irq(lock) _spin_lock_irq(lock)
include/linux/spinlock_api_smp.h
... ... @@ -32,6 +32,8 @@
32 32 void __lockfunc _write_lock_irq(rwlock_t *lock) __acquires(lock);
33 33 unsigned long __lockfunc _spin_lock_irqsave(spinlock_t *lock)
34 34 __acquires(lock);
  35 +unsigned long __lockfunc _spin_lock_irqsave_nested(spinlock_t *lock, int subclass)
  36 + __acquires(lock);
35 37 unsigned long __lockfunc _read_lock_irqsave(rwlock_t *lock)
36 38 __acquires(lock);
37 39 unsigned long __lockfunc _write_lock_irqsave(rwlock_t *lock)
... ... @@ -293,6 +293,27 @@
293 293 }
294 294  
295 295 EXPORT_SYMBOL(_spin_lock_nested);
  296 +unsigned long __lockfunc _spin_lock_irqsave_nested(spinlock_t *lock, int subclass)
  297 +{
  298 + unsigned long flags;
  299 +
  300 + local_irq_save(flags);
  301 + preempt_disable();
  302 + spin_acquire(&lock->dep_map, subclass, 0, _RET_IP_);
  303 + /*
  304 + * On lockdep we dont want the hand-coded irq-enable of
  305 + * _raw_spin_lock_flags() code, because lockdep assumes
  306 + * that interrupts are not re-enabled during lock-acquire:
  307 + */
  308 +#ifdef CONFIG_PROVE_SPIN_LOCKING
  309 + _raw_spin_lock(lock);
  310 +#else
  311 + _raw_spin_lock_flags(lock, &flags);
  312 +#endif
  313 + return flags;
  314 +}
  315 +
  316 +EXPORT_SYMBOL(_spin_lock_irqsave_nested);
296 317  
297 318 #endif
298 319