Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
kernel
mutex-debug.c
Go to the documentation of this file.
1
/*
2
* kernel/mutex-debug.c
3
*
4
* Debugging code for mutexes
5
*
6
* Started by Ingo Molnar:
7
*
8
* Copyright (C) 2004, 2005, 2006 Red Hat, Inc., Ingo Molnar <
[email protected]
>
9
*
10
* lock debugging, locking tree, deadlock detection started by:
11
*
12
* Copyright (C) 2004, LynuxWorks, Inc., Igor Manyilov, Bill Huey
13
* Released under the General Public License (GPL).
14
*/
15
#include <
linux/mutex.h
>
16
#include <
linux/delay.h
>
17
#include <linux/export.h>
18
#include <linux/poison.h>
19
#include <linux/sched.h>
20
#include <
linux/spinlock.h
>
21
#include <
linux/kallsyms.h
>
22
#include <
linux/interrupt.h
>
23
#include <
linux/debug_locks.h
>
24
25
#include "
mutex-debug.h
"
26
27
/*
28
* Must be called with lock->wait_lock held.
29
*/
30
void
debug_mutex_lock_common
(
struct
mutex
*lock,
struct
mutex_waiter
*
waiter
)
31
{
32
memset
(waiter,
MUTEX_DEBUG_INIT
,
sizeof
(*waiter));
33
waiter->magic = waiter;
34
INIT_LIST_HEAD(&waiter->
list
);
35
}
36
37
void
debug_mutex_wake_waiter
(
struct
mutex
*lock,
struct
mutex_waiter
*
waiter
)
38
{
39
SMP_DEBUG_LOCKS_WARN_ON
(!spin_is_locked(&lock->
wait_lock
));
40
DEBUG_LOCKS_WARN_ON
(list_empty(&lock->
wait_list
));
41
DEBUG_LOCKS_WARN_ON
(waiter->magic != waiter);
42
DEBUG_LOCKS_WARN_ON
(list_empty(&waiter->
list
));
43
}
44
45
void
debug_mutex_free_waiter
(
struct
mutex_waiter
*
waiter
)
46
{
47
DEBUG_LOCKS_WARN_ON
(!list_empty(&waiter->
list
));
48
memset
(waiter,
MUTEX_DEBUG_FREE
,
sizeof
(*waiter));
49
}
50
51
void
debug_mutex_add_waiter
(
struct
mutex
*lock,
struct
mutex_waiter
*
waiter
,
52
struct
thread_info
*ti)
53
{
54
SMP_DEBUG_LOCKS_WARN_ON
(!spin_is_locked(&lock->
wait_lock
));
55
56
/* Mark the current thread as blocked on the lock: */
57
ti->
task
->blocked_on = waiter;
58
}
59
60
void
mutex_remove_waiter
(
struct
mutex
*lock,
struct
mutex_waiter
*
waiter
,
61
struct
thread_info
*ti)
62
{
63
DEBUG_LOCKS_WARN_ON
(list_empty(&waiter->
list
));
64
DEBUG_LOCKS_WARN_ON
(waiter->
task
!= ti->
task
);
65
DEBUG_LOCKS_WARN_ON
(ti->
task
->blocked_on != waiter);
66
ti->
task
->blocked_on =
NULL
;
67
68
list_del_init(&waiter->
list
);
69
waiter->
task
=
NULL
;
70
}
71
72
void
debug_mutex_unlock
(
struct
mutex
*lock)
73
{
74
if
(
unlikely
(!
debug_locks
))
75
return
;
76
77
DEBUG_LOCKS_WARN_ON
(lock->magic != lock);
78
DEBUG_LOCKS_WARN_ON
(lock->owner !=
current
);
79
DEBUG_LOCKS_WARN_ON
(!lock->
wait_list
.prev && !lock->
wait_list
.next);
80
mutex_clear_owner(lock);
81
}
82
83
void
debug_mutex_init
(
struct
mutex
*lock,
const
char
*
name
,
84
struct
lock_class_key
*
key
)
85
{
86
#ifdef CONFIG_DEBUG_LOCK_ALLOC
87
/*
88
* Make sure we are not reinitializing a held lock:
89
*/
90
debug_check_no_locks_freed
((
void
*)lock,
sizeof
(*lock));
91
lockdep_init_map
(&lock->dep_map, name, key, 0);
92
#endif
93
lock->magic = lock;
94
}
95
96
/***
97
* mutex_destroy - mark a mutex unusable
98
* @lock: the mutex to be destroyed
99
*
100
* This function marks the mutex uninitialized, and any subsequent
101
* use of the mutex is forbidden. The mutex must not be locked when
102
* this function is called.
103
*/
104
void
mutex_destroy
(
struct
mutex
*lock)
105
{
106
DEBUG_LOCKS_WARN_ON
(mutex_is_locked(lock));
107
lock->magic =
NULL
;
108
}
109
110
EXPORT_SYMBOL_GPL
(
mutex_destroy
);
Generated on Thu Jan 10 2013 14:54:38 for Linux Kernel by
1.8.2