locking/lockdep: Mark local_lock_t
[ Upstream commit dfd5e3f5fe27bda91d5cc028c86ffbb7a0614489 ] The local_lock_t's are special, because they cannot form IRQ inversions, make sure we can tell them apart from the rest of the locks. Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Signed-off-by: Sasha Levin <sashal@kernel.org>
这个提交包含在:
@@ -1293,6 +1293,7 @@ register_lock_class(struct lockdep_map *lock, unsigned int subclass, int force)
|
||||
class->name_version = count_matching_names(class);
|
||||
class->wait_type_inner = lock->wait_type_inner;
|
||||
class->wait_type_outer = lock->wait_type_outer;
|
||||
class->lock_type = lock->lock_type;
|
||||
/*
|
||||
* We use RCU's safe list-add method to make
|
||||
* parallel walking of the hash-list safe:
|
||||
@@ -4621,9 +4622,9 @@ print_lock_invalid_wait_context(struct task_struct *curr,
|
||||
*/
|
||||
static int check_wait_context(struct task_struct *curr, struct held_lock *next)
|
||||
{
|
||||
short next_inner = hlock_class(next)->wait_type_inner;
|
||||
short next_outer = hlock_class(next)->wait_type_outer;
|
||||
short curr_inner;
|
||||
u8 next_inner = hlock_class(next)->wait_type_inner;
|
||||
u8 next_outer = hlock_class(next)->wait_type_outer;
|
||||
u8 curr_inner;
|
||||
int depth;
|
||||
|
||||
if (!next_inner || next->trylock)
|
||||
@@ -4646,7 +4647,7 @@ static int check_wait_context(struct task_struct *curr, struct held_lock *next)
|
||||
|
||||
for (; depth < curr->lockdep_depth; depth++) {
|
||||
struct held_lock *prev = curr->held_locks + depth;
|
||||
short prev_inner = hlock_class(prev)->wait_type_inner;
|
||||
u8 prev_inner = hlock_class(prev)->wait_type_inner;
|
||||
|
||||
if (prev_inner) {
|
||||
/*
|
||||
@@ -4695,9 +4696,9 @@ static inline int check_wait_context(struct task_struct *curr,
|
||||
/*
|
||||
* Initialize a lock instance's lock-class mapping info:
|
||||
*/
|
||||
void lockdep_init_map_waits(struct lockdep_map *lock, const char *name,
|
||||
void lockdep_init_map_type(struct lockdep_map *lock, const char *name,
|
||||
struct lock_class_key *key, int subclass,
|
||||
short inner, short outer)
|
||||
u8 inner, u8 outer, u8 lock_type)
|
||||
{
|
||||
int i;
|
||||
|
||||
@@ -4720,6 +4721,7 @@ void lockdep_init_map_waits(struct lockdep_map *lock, const char *name,
|
||||
|
||||
lock->wait_type_outer = outer;
|
||||
lock->wait_type_inner = inner;
|
||||
lock->lock_type = lock_type;
|
||||
|
||||
/*
|
||||
* No key, no joy, we need to hash something.
|
||||
@@ -4754,7 +4756,7 @@ void lockdep_init_map_waits(struct lockdep_map *lock, const char *name,
|
||||
raw_local_irq_restore(flags);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(lockdep_init_map_waits);
|
||||
EXPORT_SYMBOL_GPL(lockdep_init_map_type);
|
||||
|
||||
struct lock_class_key __lockdep_no_validate__;
|
||||
EXPORT_SYMBOL_GPL(__lockdep_no_validate__);
|
||||
|
在新工单中引用
屏蔽一个用户