diff options
Diffstat (limited to 'kernel/locking/mutex-debug.h')
| -rw-r--r-- | kernel/locking/mutex-debug.h | 55 | 
1 files changed, 55 insertions, 0 deletions
| diff --git a/kernel/locking/mutex-debug.h b/kernel/locking/mutex-debug.h new file mode 100644 index 00000000000..0799fd3e4cf --- /dev/null +++ b/kernel/locking/mutex-debug.h @@ -0,0 +1,55 @@ +/* + * Mutexes: blocking mutual exclusion locks + * + * started by Ingo Molnar: + * + *  Copyright (C) 2004, 2005, 2006 Red Hat, Inc., Ingo Molnar <mingo@redhat.com> + * + * This file contains mutex debugging related internal declarations, + * prototypes and inline functions, for the CONFIG_DEBUG_MUTEXES case. + * More details are in kernel/mutex-debug.c. + */ + +/* + * This must be called with lock->wait_lock held. + */ +extern void debug_mutex_lock_common(struct mutex *lock, +				    struct mutex_waiter *waiter); +extern void debug_mutex_wake_waiter(struct mutex *lock, +				    struct mutex_waiter *waiter); +extern void debug_mutex_free_waiter(struct mutex_waiter *waiter); +extern void debug_mutex_add_waiter(struct mutex *lock, +				   struct mutex_waiter *waiter, +				   struct thread_info *ti); +extern void mutex_remove_waiter(struct mutex *lock, struct mutex_waiter *waiter, +				struct thread_info *ti); +extern void debug_mutex_unlock(struct mutex *lock); +extern void debug_mutex_init(struct mutex *lock, const char *name, +			     struct lock_class_key *key); + +static inline void mutex_set_owner(struct mutex *lock) +{ +	lock->owner = current; +} + +static inline void mutex_clear_owner(struct mutex *lock) +{ +	lock->owner = NULL; +} + +#define spin_lock_mutex(lock, flags)			\ +	do {						\ +		struct mutex *l = container_of(lock, struct mutex, wait_lock); \ +							\ +		DEBUG_LOCKS_WARN_ON(in_interrupt());	\ +		local_irq_save(flags);			\ +		arch_spin_lock(&(lock)->rlock.raw_lock);\ +		DEBUG_LOCKS_WARN_ON(l->magic != l);	\ +	} while (0) + +#define spin_unlock_mutex(lock, flags)				\ +	do {							\ +		arch_spin_unlock(&(lock)->rlock.raw_lock);	\ +		local_irq_restore(flags);			\ +		preempt_check_resched();			\ +	} while (0) | 
