locking: Implement new raw_spinlock

Now that the raw_spin name space is freed up, we can implement
raw_spinlock and the related functions which are used to annotate the
locks which are not converted to sleeping spinlocks in preempt-rt.

A side effect is that only such locks can be used with the low level
lock fsunctions which circumvent lockdep.

For !rt spin_* functions are mapped to the raw_spin* implementations.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Peter Zijlstra <peterz@infradead.org>
Acked-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
Thomas Gleixner 2009-12-02 20:02:59 +01:00
parent e5931943d0
commit c2f21ce2e3
8 changed files with 297 additions and 135 deletions

View file

@ -17,26 +17,29 @@
int in_lock_functions(unsigned long addr);
#define assert_spin_locked(x) BUG_ON(!spin_is_locked(x))
#define assert_raw_spin_locked(x) BUG_ON(!raw_spin_is_locked(x))
void __lockfunc _spin_lock(spinlock_t *lock) __acquires(lock);
void __lockfunc _spin_lock_nested(spinlock_t *lock, int subclass)
void __lockfunc _spin_lock(raw_spinlock_t *lock) __acquires(lock);
void __lockfunc _spin_lock_nested(raw_spinlock_t *lock, int subclass)
__acquires(lock);
void __lockfunc _spin_lock_nest_lock(spinlock_t *lock, struct lockdep_map *map)
void __lockfunc
_spin_lock_nest_lock(raw_spinlock_t *lock, struct lockdep_map *map)
__acquires(lock);
void __lockfunc _spin_lock_bh(spinlock_t *lock) __acquires(lock);
void __lockfunc _spin_lock_irq(spinlock_t *lock) __acquires(lock);
void __lockfunc _spin_lock_bh(raw_spinlock_t *lock) __acquires(lock);
void __lockfunc _spin_lock_irq(raw_spinlock_t *lock) __acquires(lock);
unsigned long __lockfunc _spin_lock_irqsave(spinlock_t *lock)
unsigned long __lockfunc _spin_lock_irqsave(raw_spinlock_t *lock)
__acquires(lock);
unsigned long __lockfunc _spin_lock_irqsave_nested(spinlock_t *lock, int subclass)
unsigned long __lockfunc
_spin_lock_irqsave_nested(raw_spinlock_t *lock, int subclass)
__acquires(lock);
int __lockfunc _spin_trylock(spinlock_t *lock);
int __lockfunc _spin_trylock_bh(spinlock_t *lock);
void __lockfunc _spin_unlock(spinlock_t *lock) __releases(lock);
void __lockfunc _spin_unlock_bh(spinlock_t *lock) __releases(lock);
void __lockfunc _spin_unlock_irq(spinlock_t *lock) __releases(lock);
void __lockfunc _spin_unlock_irqrestore(spinlock_t *lock, unsigned long flags)
int __lockfunc _spin_trylock(raw_spinlock_t *lock);
int __lockfunc _spin_trylock_bh(raw_spinlock_t *lock);
void __lockfunc _spin_unlock(raw_spinlock_t *lock) __releases(lock);
void __lockfunc _spin_unlock_bh(raw_spinlock_t *lock) __releases(lock);
void __lockfunc _spin_unlock_irq(raw_spinlock_t *lock) __releases(lock);
void __lockfunc
_spin_unlock_irqrestore(raw_spinlock_t *lock, unsigned long flags)
__releases(lock);
#ifdef CONFIG_INLINE_SPIN_LOCK
@ -79,7 +82,7 @@ void __lockfunc _spin_unlock_irqrestore(spinlock_t *lock, unsigned long flags)
#define _spin_unlock_irqrestore(lock, flags) __spin_unlock_irqrestore(lock, flags)
#endif
static inline int __spin_trylock(spinlock_t *lock)
static inline int __spin_trylock(raw_spinlock_t *lock)
{
preempt_disable();
if (_raw_spin_trylock(lock)) {
@ -97,7 +100,7 @@ static inline int __spin_trylock(spinlock_t *lock)
*/
#if !defined(CONFIG_GENERIC_LOCKBREAK) || defined(CONFIG_DEBUG_LOCK_ALLOC)
static inline unsigned long __spin_lock_irqsave(spinlock_t *lock)
static inline unsigned long __spin_lock_irqsave(raw_spinlock_t *lock)
{
unsigned long flags;
@ -117,7 +120,7 @@ static inline unsigned long __spin_lock_irqsave(spinlock_t *lock)
return flags;
}
static inline void __spin_lock_irq(spinlock_t *lock)
static inline void __spin_lock_irq(raw_spinlock_t *lock)
{
local_irq_disable();
preempt_disable();
@ -125,7 +128,7 @@ static inline void __spin_lock_irq(spinlock_t *lock)
LOCK_CONTENDED(lock, _raw_spin_trylock, _raw_spin_lock);
}
static inline void __spin_lock_bh(spinlock_t *lock)
static inline void __spin_lock_bh(raw_spinlock_t *lock)
{
local_bh_disable();
preempt_disable();
@ -133,7 +136,7 @@ static inline void __spin_lock_bh(spinlock_t *lock)
LOCK_CONTENDED(lock, _raw_spin_trylock, _raw_spin_lock);
}
static inline void __spin_lock(spinlock_t *lock)
static inline void __spin_lock(raw_spinlock_t *lock)
{
preempt_disable();
spin_acquire(&lock->dep_map, 0, 0, _RET_IP_);
@ -142,14 +145,14 @@ static inline void __spin_lock(spinlock_t *lock)
#endif /* CONFIG_PREEMPT */
static inline void __spin_unlock(spinlock_t *lock)
static inline void __spin_unlock(raw_spinlock_t *lock)
{
spin_release(&lock->dep_map, 1, _RET_IP_);
_raw_spin_unlock(lock);
preempt_enable();
}
static inline void __spin_unlock_irqrestore(spinlock_t *lock,
static inline void __spin_unlock_irqrestore(raw_spinlock_t *lock,
unsigned long flags)
{
spin_release(&lock->dep_map, 1, _RET_IP_);
@ -158,7 +161,7 @@ static inline void __spin_unlock_irqrestore(spinlock_t *lock,
preempt_enable();
}
static inline void __spin_unlock_irq(spinlock_t *lock)
static inline void __spin_unlock_irq(raw_spinlock_t *lock)
{
spin_release(&lock->dep_map, 1, _RET_IP_);
_raw_spin_unlock(lock);
@ -166,7 +169,7 @@ static inline void __spin_unlock_irq(spinlock_t *lock)
preempt_enable();
}
static inline void __spin_unlock_bh(spinlock_t *lock)
static inline void __spin_unlock_bh(raw_spinlock_t *lock)
{
spin_release(&lock->dep_map, 1, _RET_IP_);
_raw_spin_unlock(lock);
@ -174,7 +177,7 @@ static inline void __spin_unlock_bh(spinlock_t *lock)
local_bh_enable_ip((unsigned long)__builtin_return_address(0));
}
static inline int __spin_trylock_bh(spinlock_t *lock)
static inline int __spin_trylock_bh(raw_spinlock_t *lock)
{
local_bh_disable();
preempt_disable();