Skip to content

Commit eae6d58

Browse files
author
Peter Zijlstra
committed
locking/lockdep: Fix lockdep_init_map_*() confusion
Commit dfd5e3f ("locking/lockdep: Mark local_lock_t") added yet another lockdep_init_map_*() variant, but forgot to update all the existing users of the most complicated version. This could lead to a loss of lock_type and hence an incorrect report. Given the relative rarity of both local_lock and these annotations, this is unlikely to happen in practise, still, best fix things. Fixes: dfd5e3f ("locking/lockdep: Mark local_lock_t") Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Link: https://lkml.kernel.org/r/YqyEDtoan20K0CVD@worktop.programming.kicks-ass.net
1 parent 7e6b9db commit eae6d58

File tree

2 files changed

+21
-16
lines changed

2 files changed

+21
-16
lines changed

include/linux/lockdep.h

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ static inline void
188188
lockdep_init_map_waits(struct lockdep_map *lock, const char *name,
189189
struct lock_class_key *key, int subclass, u8 inner, u8 outer)
190190
{
191-
lockdep_init_map_type(lock, name, key, subclass, inner, LD_WAIT_INV, LD_LOCK_NORMAL);
191+
lockdep_init_map_type(lock, name, key, subclass, inner, outer, LD_LOCK_NORMAL);
192192
}
193193

194194
static inline void
@@ -211,24 +211,28 @@ static inline void lockdep_init_map(struct lockdep_map *lock, const char *name,
211211
* or they are too narrow (they suffer from a false class-split):
212212
*/
213213
#define lockdep_set_class(lock, key) \
214-
lockdep_init_map_waits(&(lock)->dep_map, #key, key, 0, \
215-
(lock)->dep_map.wait_type_inner, \
216-
(lock)->dep_map.wait_type_outer)
214+
lockdep_init_map_type(&(lock)->dep_map, #key, key, 0, \
215+
(lock)->dep_map.wait_type_inner, \
216+
(lock)->dep_map.wait_type_outer, \
217+
(lock)->dep_map.lock_type)
217218

218219
#define lockdep_set_class_and_name(lock, key, name) \
219-
lockdep_init_map_waits(&(lock)->dep_map, name, key, 0, \
220-
(lock)->dep_map.wait_type_inner, \
221-
(lock)->dep_map.wait_type_outer)
220+
lockdep_init_map_type(&(lock)->dep_map, name, key, 0, \
221+
(lock)->dep_map.wait_type_inner, \
222+
(lock)->dep_map.wait_type_outer, \
223+
(lock)->dep_map.lock_type)
222224

223225
#define lockdep_set_class_and_subclass(lock, key, sub) \
224-
lockdep_init_map_waits(&(lock)->dep_map, #key, key, sub,\
225-
(lock)->dep_map.wait_type_inner, \
226-
(lock)->dep_map.wait_type_outer)
226+
lockdep_init_map_type(&(lock)->dep_map, #key, key, sub, \
227+
(lock)->dep_map.wait_type_inner, \
228+
(lock)->dep_map.wait_type_outer, \
229+
(lock)->dep_map.lock_type)
227230

228231
#define lockdep_set_subclass(lock, sub) \
229-
lockdep_init_map_waits(&(lock)->dep_map, #lock, (lock)->dep_map.key, sub,\
230-
(lock)->dep_map.wait_type_inner, \
231-
(lock)->dep_map.wait_type_outer)
232+
lockdep_init_map_type(&(lock)->dep_map, #lock, (lock)->dep_map.key, sub,\
233+
(lock)->dep_map.wait_type_inner, \
234+
(lock)->dep_map.wait_type_outer, \
235+
(lock)->dep_map.lock_type)
232236

233237
#define lockdep_set_novalidate_class(lock) \
234238
lockdep_set_class_and_name(lock, &__lockdep_no_validate__, #lock)

kernel/locking/lockdep.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5238,9 +5238,10 @@ __lock_set_class(struct lockdep_map *lock, const char *name,
52385238
return 0;
52395239
}
52405240

5241-
lockdep_init_map_waits(lock, name, key, 0,
5242-
lock->wait_type_inner,
5243-
lock->wait_type_outer);
5241+
lockdep_init_map_type(lock, name, key, 0,
5242+
lock->wait_type_inner,
5243+
lock->wait_type_outer,
5244+
lock->lock_type);
52445245
class = register_lock_class(lock, subclass, 0);
52455246
hlock->class_idx = class - lock_classes;
52465247

0 commit comments

Comments
 (0)