-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathmutex-debug.h
77 lines (71 loc) · 2.44 KB
/
mutex-debug.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
/*
* Mutexes: blocking mutual exclusion locks
*
* started by Ingo Molnar:
*
* Copyright (C) 2004, 2005, 2006 Red Hat, Inc., Ingo Molnar <[email protected]>
*
* 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;
}
#include <linux/aee.h>
#define MT_DEBUG_LOCKS_WARN_ON(c) \
({ \
int __ret = 0; \
\
if (!oops_in_progress && unlikely(c)) { \
aee_kernel_warning(#c,"Mutex Debug\n");\
if (debug_locks_off() && !debug_locks_silent) \
WARN_ON(1); \
else \
dump_stack();\
__ret = 1; \
} \
__ret; \
})
#ifdef DEBUG_LOCKS_WARN_ON
#undef DEBUG_LOCKS_WARN_ON
#define DEBUG_LOCKS_WARN_ON(c) MT_DEBUG_LOCKS_WARN_ON(c)
#endif
#define spin_lock_mutex(lock, flags) \
do { \
struct mutex *l = container_of(lock, struct mutex, wait_lock); \
\
if(DEBUG_LOCKS_WARN_ON(in_interrupt())){ \
printk("[MUTEX WARN!!] mutex lock in interrupt context!\n");\
}\
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)