• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Mutexes: blocking mutual exclusion locks
3  *
4  * started by Ingo Molnar:
5  *
6  *  Copyright (C) 2004, 2005, 2006 Red Hat, Inc., Ingo Molnar <mingo@redhat.com>
7  *
8  * This file contains mutex debugging related internal declarations,
9  * prototypes and inline functions, for the CONFIG_DEBUG_MUTEXES case.
10  * More details are in kernel/mutex-debug.c.
11  */
12 
13 /*
14  * This must be called with lock->wait_lock held.
15  */
16 extern void
17 debug_mutex_set_owner(struct mutex *lock, struct thread_info *new_owner);
18 
debug_mutex_clear_owner(struct mutex * lock)19 static inline void debug_mutex_clear_owner(struct mutex *lock)
20 {
21 	lock->owner = NULL;
22 }
23 
24 extern void debug_mutex_lock_common(struct mutex *lock,
25 				    struct mutex_waiter *waiter);
26 extern void debug_mutex_wake_waiter(struct mutex *lock,
27 				    struct mutex_waiter *waiter);
28 extern void debug_mutex_free_waiter(struct mutex_waiter *waiter);
29 extern void debug_mutex_add_waiter(struct mutex *lock,
30 				   struct mutex_waiter *waiter,
31 				   struct thread_info *ti);
32 extern void mutex_remove_waiter(struct mutex *lock, struct mutex_waiter *waiter,
33 				struct thread_info *ti);
34 extern void debug_mutex_unlock(struct mutex *lock);
35 extern void debug_mutex_init(struct mutex *lock, const char *name,
36 			     struct lock_class_key *key);
37 
38 #define spin_lock_mutex(lock, flags)			\
39 	do {						\
40 		struct mutex *l = container_of(lock, struct mutex, wait_lock); \
41 							\
42 		DEBUG_LOCKS_WARN_ON(in_interrupt());	\
43 		local_irq_save(flags);			\
44 		__raw_spin_lock(&(lock)->raw_lock);	\
45 		DEBUG_LOCKS_WARN_ON(l->magic != l);	\
46 	} while (0)
47 
48 #define spin_unlock_mutex(lock, flags)			\
49 	do {						\
50 		__raw_spin_unlock(&(lock)->raw_lock);	\
51 		local_irq_restore(flags);		\
52 		preempt_check_resched();		\
53 	} while (0)
54