Merge commit 'v2.6.29-rc7' into perfcounters/core
[linux-2.6.git] / kernel / mutex-debug.h
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
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)