Commit 4fe87745a6722d42ff27a60768c77958fa1fc498
Committed by
Linus Torvalds
1 parent
c46261de0d
Exists in
master
and in
4 other branches
lockstat: hook into spinlock_t, rwlock_t, rwsem and mutex
Call the new lockstat tracking functions from the various lock primitives. Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl> Acked-by: Ingo Molnar <mingo@elte.hu> Acked-by: Jason Baron <jbaron@redhat.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Showing 3 changed files with 26 additions and 18 deletions Side-by-side Diff
kernel/mutex.c
... | ... | @@ -139,6 +139,12 @@ |
139 | 139 | list_add_tail(&waiter.list, &lock->wait_list); |
140 | 140 | waiter.task = task; |
141 | 141 | |
142 | + old_val = atomic_xchg(&lock->count, -1); | |
143 | + if (old_val == 1) | |
144 | + goto done; | |
145 | + | |
146 | + lock_contended(&lock->dep_map, _RET_IP_); | |
147 | + | |
142 | 148 | for (;;) { |
143 | 149 | /* |
144 | 150 | * Lets try to take the lock again - this is needed even if |
... | ... | @@ -174,6 +180,8 @@ |
174 | 180 | spin_lock_mutex(&lock->wait_lock, flags); |
175 | 181 | } |
176 | 182 | |
183 | + lock_acquired(&lock->dep_map); | |
184 | +done: | |
177 | 185 | /* got the lock - rejoice! */ |
178 | 186 | mutex_remove_waiter(lock, &waiter, task_thread_info(task)); |
179 | 187 | debug_mutex_set_owner(lock, task_thread_info(task)); |
kernel/rwsem.c
... | ... | @@ -20,7 +20,7 @@ |
20 | 20 | might_sleep(); |
21 | 21 | rwsem_acquire_read(&sem->dep_map, 0, 0, _RET_IP_); |
22 | 22 | |
23 | - __down_read(sem); | |
23 | + LOCK_CONTENDED(sem, __down_read_trylock, __down_read); | |
24 | 24 | } |
25 | 25 | |
26 | 26 | EXPORT_SYMBOL(down_read); |
... | ... | @@ -47,7 +47,7 @@ |
47 | 47 | might_sleep(); |
48 | 48 | rwsem_acquire(&sem->dep_map, 0, 0, _RET_IP_); |
49 | 49 | |
50 | - __down_write(sem); | |
50 | + LOCK_CONTENDED(sem, __down_write_trylock, __down_write); | |
51 | 51 | } |
52 | 52 | |
53 | 53 | EXPORT_SYMBOL(down_write); |
... | ... | @@ -111,7 +111,7 @@ |
111 | 111 | might_sleep(); |
112 | 112 | rwsem_acquire_read(&sem->dep_map, subclass, 0, _RET_IP_); |
113 | 113 | |
114 | - __down_read(sem); | |
114 | + LOCK_CONTENDED(sem, __down_read_trylock, __down_read); | |
115 | 115 | } |
116 | 116 | |
117 | 117 | EXPORT_SYMBOL(down_read_nested); |
... | ... | @@ -130,7 +130,7 @@ |
130 | 130 | might_sleep(); |
131 | 131 | rwsem_acquire(&sem->dep_map, subclass, 0, _RET_IP_); |
132 | 132 | |
133 | - __down_write_nested(sem, subclass); | |
133 | + LOCK_CONTENDED(sem, __down_write_trylock, __down_write); | |
134 | 134 | } |
135 | 135 | |
136 | 136 | EXPORT_SYMBOL(down_write_nested); |
kernel/spinlock.c
... | ... | @@ -72,7 +72,7 @@ |
72 | 72 | { |
73 | 73 | preempt_disable(); |
74 | 74 | rwlock_acquire_read(&lock->dep_map, 0, 0, _RET_IP_); |
75 | - _raw_read_lock(lock); | |
75 | + LOCK_CONTENDED(lock, _raw_read_trylock, _raw_read_lock); | |
76 | 76 | } |
77 | 77 | EXPORT_SYMBOL(_read_lock); |
78 | 78 | |
... | ... | @@ -89,7 +89,7 @@ |
89 | 89 | * that interrupts are not re-enabled during lock-acquire: |
90 | 90 | */ |
91 | 91 | #ifdef CONFIG_LOCKDEP |
92 | - _raw_spin_lock(lock); | |
92 | + LOCK_CONTENDED(lock, _raw_spin_trylock, _raw_spin_lock); | |
93 | 93 | #else |
94 | 94 | _raw_spin_lock_flags(lock, &flags); |
95 | 95 | #endif |
... | ... | @@ -102,7 +102,7 @@ |
102 | 102 | local_irq_disable(); |
103 | 103 | preempt_disable(); |
104 | 104 | spin_acquire(&lock->dep_map, 0, 0, _RET_IP_); |
105 | - _raw_spin_lock(lock); | |
105 | + LOCK_CONTENDED(lock, _raw_spin_trylock, _raw_spin_lock); | |
106 | 106 | } |
107 | 107 | EXPORT_SYMBOL(_spin_lock_irq); |
108 | 108 | |
... | ... | @@ -111,7 +111,7 @@ |
111 | 111 | local_bh_disable(); |
112 | 112 | preempt_disable(); |
113 | 113 | spin_acquire(&lock->dep_map, 0, 0, _RET_IP_); |
114 | - _raw_spin_lock(lock); | |
114 | + LOCK_CONTENDED(lock, _raw_spin_trylock, _raw_spin_lock); | |
115 | 115 | } |
116 | 116 | EXPORT_SYMBOL(_spin_lock_bh); |
117 | 117 | |
... | ... | @@ -122,7 +122,7 @@ |
122 | 122 | local_irq_save(flags); |
123 | 123 | preempt_disable(); |
124 | 124 | rwlock_acquire_read(&lock->dep_map, 0, 0, _RET_IP_); |
125 | - _raw_read_lock(lock); | |
125 | + LOCK_CONTENDED(lock, _raw_read_trylock, _raw_read_lock); | |
126 | 126 | return flags; |
127 | 127 | } |
128 | 128 | EXPORT_SYMBOL(_read_lock_irqsave); |
... | ... | @@ -132,7 +132,7 @@ |
132 | 132 | local_irq_disable(); |
133 | 133 | preempt_disable(); |
134 | 134 | rwlock_acquire_read(&lock->dep_map, 0, 0, _RET_IP_); |
135 | - _raw_read_lock(lock); | |
135 | + LOCK_CONTENDED(lock, _raw_read_trylock, _raw_read_lock); | |
136 | 136 | } |
137 | 137 | EXPORT_SYMBOL(_read_lock_irq); |
138 | 138 | |
... | ... | @@ -141,7 +141,7 @@ |
141 | 141 | local_bh_disable(); |
142 | 142 | preempt_disable(); |
143 | 143 | rwlock_acquire_read(&lock->dep_map, 0, 0, _RET_IP_); |
144 | - _raw_read_lock(lock); | |
144 | + LOCK_CONTENDED(lock, _raw_read_trylock, _raw_read_lock); | |
145 | 145 | } |
146 | 146 | EXPORT_SYMBOL(_read_lock_bh); |
147 | 147 | |
... | ... | @@ -152,7 +152,7 @@ |
152 | 152 | local_irq_save(flags); |
153 | 153 | preempt_disable(); |
154 | 154 | rwlock_acquire(&lock->dep_map, 0, 0, _RET_IP_); |
155 | - _raw_write_lock(lock); | |
155 | + LOCK_CONTENDED(lock, _raw_write_trylock, _raw_write_lock); | |
156 | 156 | return flags; |
157 | 157 | } |
158 | 158 | EXPORT_SYMBOL(_write_lock_irqsave); |
... | ... | @@ -162,7 +162,7 @@ |
162 | 162 | local_irq_disable(); |
163 | 163 | preempt_disable(); |
164 | 164 | rwlock_acquire(&lock->dep_map, 0, 0, _RET_IP_); |
165 | - _raw_write_lock(lock); | |
165 | + LOCK_CONTENDED(lock, _raw_write_trylock, _raw_write_lock); | |
166 | 166 | } |
167 | 167 | EXPORT_SYMBOL(_write_lock_irq); |
168 | 168 | |
... | ... | @@ -171,7 +171,7 @@ |
171 | 171 | local_bh_disable(); |
172 | 172 | preempt_disable(); |
173 | 173 | rwlock_acquire(&lock->dep_map, 0, 0, _RET_IP_); |
174 | - _raw_write_lock(lock); | |
174 | + LOCK_CONTENDED(lock, _raw_write_trylock, _raw_write_lock); | |
175 | 175 | } |
176 | 176 | EXPORT_SYMBOL(_write_lock_bh); |
177 | 177 | |
... | ... | @@ -179,7 +179,7 @@ |
179 | 179 | { |
180 | 180 | preempt_disable(); |
181 | 181 | spin_acquire(&lock->dep_map, 0, 0, _RET_IP_); |
182 | - _raw_spin_lock(lock); | |
182 | + LOCK_CONTENDED(lock, _raw_spin_trylock, _raw_spin_lock); | |
183 | 183 | } |
184 | 184 | |
185 | 185 | EXPORT_SYMBOL(_spin_lock); |
... | ... | @@ -188,7 +188,7 @@ |
188 | 188 | { |
189 | 189 | preempt_disable(); |
190 | 190 | rwlock_acquire(&lock->dep_map, 0, 0, _RET_IP_); |
191 | - _raw_write_lock(lock); | |
191 | + LOCK_CONTENDED(lock, _raw_write_trylock, _raw_write_lock); | |
192 | 192 | } |
193 | 193 | |
194 | 194 | EXPORT_SYMBOL(_write_lock); |
... | ... | @@ -289,7 +289,7 @@ |
289 | 289 | { |
290 | 290 | preempt_disable(); |
291 | 291 | spin_acquire(&lock->dep_map, subclass, 0, _RET_IP_); |
292 | - _raw_spin_lock(lock); | |
292 | + LOCK_CONTENDED(lock, _raw_spin_trylock, _raw_spin_lock); | |
293 | 293 | } |
294 | 294 | |
295 | 295 | EXPORT_SYMBOL(_spin_lock_nested); |
... | ... | @@ -306,7 +306,7 @@ |
306 | 306 | * that interrupts are not re-enabled during lock-acquire: |
307 | 307 | */ |
308 | 308 | #ifdef CONFIG_LOCKDEP |
309 | - _raw_spin_lock(lock); | |
309 | + LOCK_CONTENDED(lock, _raw_spin_trylock, _raw_spin_lock); | |
310 | 310 | #else |
311 | 311 | _raw_spin_lock_flags(lock, &flags); |
312 | 312 | #endif |