[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>
This commit is contained in:
Родитель
ee3ce191e8
Коммит
cfd3ef2346
|
@ -199,6 +199,21 @@ do { \
|
|||
BUILD_CHECK_IRQ_FLAGS(flags); \
|
||||
flags = _write_lock_irqsave(lock); \
|
||||
} while (0)
|
||||
|
||||
#ifdef CONFIG_DEBUG_LOCK_ALLOC
|
||||
#define spin_lock_irqsave_nested(lock, flags, subclass) \
|
||||
do { \
|
||||
BUILD_CHECK_IRQ_FLAGS(flags); \
|
||||
flags = _spin_lock_irqsave_nested(lock, subclass); \
|
||||
} while (0)
|
||||
#else
|
||||
#define spin_lock_irqsave_nested(lock, flags, subclass) \
|
||||
do { \
|
||||
BUILD_CHECK_IRQ_FLAGS(flags); \
|
||||
flags = _spin_lock_irqsave(lock); \
|
||||
} while (0)
|
||||
#endif
|
||||
|
||||
#else
|
||||
#define spin_lock_irqsave(lock, flags) \
|
||||
do { \
|
||||
|
@ -215,6 +230,9 @@ do { \
|
|||
BUILD_CHECK_IRQ_FLAGS(flags); \
|
||||
_write_lock_irqsave(lock, flags); \
|
||||
} while (0)
|
||||
#define spin_lock_irqsave_nested(lock, flags, subclass) \
|
||||
spin_lock_irqsave(lock, flags)
|
||||
|
||||
#endif
|
||||
|
||||
#define spin_lock_irq(lock) _spin_lock_irq(lock)
|
||||
|
|
|
@ -32,6 +32,8 @@ void __lockfunc _read_lock_irq(rwlock_t *lock) __acquires(lock);
|
|||
void __lockfunc _write_lock_irq(rwlock_t *lock) __acquires(lock);
|
||||
unsigned long __lockfunc _spin_lock_irqsave(spinlock_t *lock)
|
||||
__acquires(lock);
|
||||
unsigned long __lockfunc _spin_lock_irqsave_nested(spinlock_t *lock, int subclass)
|
||||
__acquires(lock);
|
||||
unsigned long __lockfunc _read_lock_irqsave(rwlock_t *lock)
|
||||
__acquires(lock);
|
||||
unsigned long __lockfunc _write_lock_irqsave(rwlock_t *lock)
|
||||
|
|
|
@ -293,6 +293,27 @@ void __lockfunc _spin_lock_nested(spinlock_t *lock, int subclass)
|
|||
}
|
||||
|
||||
EXPORT_SYMBOL(_spin_lock_nested);
|
||||
unsigned long __lockfunc _spin_lock_irqsave_nested(spinlock_t *lock, int subclass)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
local_irq_save(flags);
|
||||
preempt_disable();
|
||||
spin_acquire(&lock->dep_map, subclass, 0, _RET_IP_);
|
||||
/*
|
||||
* On lockdep we dont want the hand-coded irq-enable of
|
||||
* _raw_spin_lock_flags() code, because lockdep assumes
|
||||
* that interrupts are not re-enabled during lock-acquire:
|
||||
*/
|
||||
#ifdef CONFIG_PROVE_SPIN_LOCKING
|
||||
_raw_spin_lock(lock);
|
||||
#else
|
||||
_raw_spin_lock_flags(lock, &flags);
|
||||
#endif
|
||||
return flags;
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(_spin_lock_irqsave_nested);
|
||||
|
||||
#endif
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче