diff options
Diffstat (limited to 'include/linux/mutex.h')
| -rw-r--r-- | include/linux/mutex.h | 30 | 
1 files changed, 25 insertions, 5 deletions
diff --git a/include/linux/mutex.h b/include/linux/mutex.h index f363bc8fdc7..42aa9b9ecd5 100644 --- a/include/linux/mutex.h +++ b/include/linux/mutex.h @@ -10,12 +10,14 @@  #ifndef __LINUX_MUTEX_H  #define __LINUX_MUTEX_H +#include <asm/current.h>  #include <linux/list.h>  #include <linux/spinlock_types.h>  #include <linux/linkage.h>  #include <linux/lockdep.h> - -#include <asm/atomic.h> +#include <linux/atomic.h> +#include <asm/processor.h> +#include <linux/osq_lock.h>  /*   * Simple, straightforward mutexes with strict semantics: @@ -51,7 +53,10 @@ struct mutex {  	spinlock_t		wait_lock;  	struct list_head	wait_list;  #if defined(CONFIG_DEBUG_MUTEXES) || defined(CONFIG_SMP) -	struct thread_info	*owner; +	struct task_struct	*owner; +#endif +#ifdef CONFIG_MUTEX_SPIN_ON_OWNER +	struct optimistic_spin_queue osq; /* Spinner MCS lock */  #endif  #ifdef CONFIG_DEBUG_MUTEXES  	const char 		*name; @@ -92,7 +97,7 @@ do {							\  							\  	__mutex_init((mutex), #mutex, &__key);		\  } while (0) -# define mutex_destroy(mutex)				do { } while (0) +static inline void mutex_destroy(struct mutex *lock) {}  #endif  #ifdef CONFIG_DEBUG_LOCK_ALLOC @@ -127,11 +132,13 @@ static inline int mutex_is_locked(struct mutex *lock)  }  /* - * See kernel/mutex.c for detailed documentation of these APIs. + * See kernel/locking/mutex.c for detailed documentation of these APIs.   * Also see Documentation/mutex-design.txt.   */  #ifdef CONFIG_DEBUG_LOCK_ALLOC  extern void mutex_lock_nested(struct mutex *lock, unsigned int subclass); +extern void _mutex_lock_nest_lock(struct mutex *lock, struct lockdep_map *nest_lock); +  extern int __must_check mutex_lock_interruptible_nested(struct mutex *lock,  					unsigned int subclass);  extern int __must_check mutex_lock_killable_nested(struct mutex *lock, @@ -140,6 +147,13 @@ extern int __must_check mutex_lock_killable_nested(struct mutex *lock,  #define mutex_lock(lock) mutex_lock_nested(lock, 0)  #define mutex_lock_interruptible(lock) mutex_lock_interruptible_nested(lock, 0)  #define mutex_lock_killable(lock) mutex_lock_killable_nested(lock, 0) + +#define mutex_lock_nest_lock(lock, nest_lock)				\ +do {									\ +	typecheck(struct lockdep_map *, &(nest_lock)->dep_map);	\ +	_mutex_lock_nest_lock(lock, &(nest_lock)->dep_map);		\ +} while (0) +  #else  extern void mutex_lock(struct mutex *lock);  extern int __must_check mutex_lock_interruptible(struct mutex *lock); @@ -148,6 +162,7 @@ extern int __must_check mutex_lock_killable(struct mutex *lock);  # define mutex_lock_nested(lock, subclass) mutex_lock(lock)  # define mutex_lock_interruptible_nested(lock, subclass) mutex_lock_interruptible(lock)  # define mutex_lock_killable_nested(lock, subclass) mutex_lock_killable(lock) +# define mutex_lock_nest_lock(lock, nest_lock) mutex_lock(lock)  #endif  /* @@ -158,6 +173,11 @@ extern int __must_check mutex_lock_killable(struct mutex *lock);   */  extern int mutex_trylock(struct mutex *lock);  extern void mutex_unlock(struct mutex *lock); +  extern int atomic_dec_and_mutex_lock(atomic_t *cnt, struct mutex *lock); +#ifndef arch_mutex_cpu_relax +# define arch_mutex_cpu_relax() cpu_relax()  #endif + +#endif /* __LINUX_MUTEX_H */  | 
