// SPDX-License-Identifier: GPL-2.0-only /* * kernel/lockdep.c * * Runtime locking correctness validator * * Started by Ingo Molnar: * * Copyright (C) 2006,2007 Red Hat, Inc., Ingo Molnar <mingo@redhat.com> * Copyright (C) 2007 Red Hat, Inc., Peter Zijlstra * * this code maps all the lock dependencies as they occur in a live kernel * and will warn about the following classes of locking bugs: * * - lock inversion scenarios * - circular lock dependencies * - hardirq/softirq safe/unsafe locking bugs * * Bugs are reported even if the current locking scenario does not cause * any deadlock at this point. * * I.e. if anytime in the past two locks were taken in a different order, * even if it happened for another task, even if those were different * locks (but of the same class as this lock), this code will detect it. * * Thanks to Arjan van de Ven for coming up with the initial idea of * mapping lock dependencies runtime.
*/ #define DISABLE_BRANCH_PROFILING #include <linux/mutex.h> #include <linux/sched.h> #include <linux/sched/clock.h> #include <linux/sched/task.h> #include <linux/sched/mm.h> #include <linux/delay.h> #include <linux/module.h> #include <linux/proc_fs.h> #include <linux/seq_file.h> #include <linux/spinlock.h> #include <linux/kallsyms.h> #include <linux/interrupt.h> #include <linux/stacktrace.h> #include <linux/debug_locks.h> #include <linux/irqflags.h> #include <linux/utsname.h> #include <linux/hash.h> #include <linux/ftrace.h> #include <linux/stringify.h> #include <linux/bitmap.h> #include <linux/bitops.h> #include <linux/gfp.h> #include <linux/random.h> #include <linux/jhash.h> #include <linux/nmi.h> #include <linux/rcupdate.h> #include <linux/kprobes.h> #include <linux/lockdep.h> #include <linux/context_tracking.h> #include <linux/console.h> #include <linux/kasan.h>
static __always_inline bool lockdep_enabled(void)
{ if (!debug_locks) returnfalse;
if (this_cpu_read(lockdep_recursion)) returnfalse;
if (current->lockdep_recursion) returnfalse;
returntrue;
}
/* * lockdep_lock: protects the lockdep graph, the hashes and the * class/list/hash allocators. * * This is one of the rare exceptions where it's justified * to use a raw spinlock - we really dont want the spinlock * code to recurse back into the lockdep code...
*/ static arch_spinlock_t __lock = (arch_spinlock_t)__ARCH_SPIN_LOCK_UNLOCKED; staticstruct task_struct *__owner;
staticint graph_lock(void)
{
lockdep_lock();
lockevent_inc(lockdep_lock); /* * Make sure that if another CPU detected a bug while * walking the graph we dont change it (while the other * CPU is busy printing out stuff with the graph lock * dropped already)
*/ if (!debug_locks) {
lockdep_unlock(); return 0;
} return 1;
}
/* * Turn lock debugging off and return with 0 if it was off already, * and also release the graph lock:
*/ staticinlineint debug_locks_off_graph_unlock(void)
{ int ret = debug_locks_off();
/* * All data structures here are protected by the global debug_lock. * * nr_lock_classes is the number of elements of lock_classes[] that is * in use.
*/ #define KEYHASH_BITS (MAX_LOCKDEP_KEYS_BITS - 1) #define KEYHASH_SIZE (1UL << KEYHASH_BITS) staticstruct hlist_head lock_keys_hash[KEYHASH_SIZE]; unsignedlong nr_lock_classes; unsignedlong nr_zapped_classes; unsignedlong nr_dynamic_keys; unsignedlong max_lock_class_idx; struct lock_class lock_classes[MAX_LOCKDEP_KEYS];
DECLARE_BITMAP(lock_classes_in_use, MAX_LOCKDEP_KEYS);
/* * We keep a global list of all lock classes. The list is only accessed with * the lockdep spinlock lock held. free_lock_classes is a list with free * elements. These elements are linked together by the lock_entry member in * struct lock_class.
*/ static LIST_HEAD(all_lock_classes); static LIST_HEAD(free_lock_classes);
/** * struct pending_free - information about data structures about to be freed * @zapped: Head of a list with struct lock_class elements. * @lock_chains_being_freed: Bitmap that indicates which lock_chains[] elements * are about to be freed.
*/ struct pending_free { struct list_head zapped;
DECLARE_BITMAP(lock_chains_being_freed, MAX_LOCKDEP_CHAINS);
};
/** * struct delayed_free - data structures used for delayed freeing * * A data structure for delayed freeing of data structures that may be * accessed by RCU readers at the time these were freed. * * @rcu_head: Used to schedule an RCU callback for freeing data structures. * @index: Index of @pf to which freed data structures are added. * @scheduled: Whether or not an RCU callback has been scheduled. * @pf: Array with information about data structures about to be freed.
*/ staticstruct delayed_free { struct rcu_head rcu_head; int index; int scheduled; struct pending_free pf[2];
} delayed_free;
/* * The lockdep classes are in a hash-table as well, for fast lookup:
*/ #define CLASSHASH_BITS (MAX_LOCKDEP_KEYS_BITS - 1) #define CLASSHASH_SIZE (1UL << CLASSHASH_BITS) #define __classhashfn(key) hash_long((unsignedlong)key, CLASSHASH_BITS) #define classhashentry(key) (classhash_table + __classhashfn((key)))
/* * We put the lock dependency chains into a hash-table as well, to cache * their existence:
*/ #define CHAINHASH_BITS (MAX_LOCKDEP_CHAINS_BITS-1) #define CHAINHASH_SIZE (1UL << CHAINHASH_BITS) #define __chainhashfn(chain) hash_long(chain, CHAINHASH_BITS) #define chainhashentry(chain) (chainhash_table + __chainhashfn((chain)))
/* * The hash key of the lock dependency chains is a hash itself too: * it's a hash of all locks taken up to that lock, including that lock. * It's a 64-bit hash, because it's important for the keys to be * unique.
*/ staticinline u64 iterate_chain_key(u64 key, u32 idx)
{
u32 k0 = key, k1 = key >> 32;
__jhash_mix(idx, k0, k1); /* Macro that modifies arguments! */
staticvoid print_lockdep_off(constchar *bug_msg)
{
printk(KERN_DEBUG "%s\n", bug_msg);
printk(KERN_DEBUG "turning off the locking correctness validator.\n"); #ifdef CONFIG_LOCK_STAT
printk(KERN_DEBUG "Please attach the output of /proc/lock_stat to the bug report\n"); #endif
}
unsignedlong nr_stack_trace_entries;
#ifdef CONFIG_PROVE_LOCKING /** * struct lock_trace - single stack backtrace * @hash_entry: Entry in a stack_trace_hash[] list. * @hash: jhash() of @entries. * @nr_entries: Number of entries in @entries. * @entries: Actual stack backtrace.
*/ struct lock_trace { struct hlist_node hash_entry;
u32 hash;
u32 nr_entries; unsignedlong entries[] __aligned(sizeof(unsignedlong));
}; #define LOCK_TRACE_SIZE_IN_LONGS \
(sizeof(struct lock_trace) / sizeof(unsignedlong)) /* * Stack-trace: sequence of lock_trace structures. Protected by the graph_lock.
*/ staticunsignedlong stack_trace[MAX_STACK_TRACE_ENTRIES]; staticstruct hlist_head stack_trace_hash[STACK_TRACE_HASH_SIZE];
staticchar get_usage_char(struct lock_class *class, enum lock_usage_bit bit)
{ /* * The usage character defaults to '.' (i.e., irqs disabled and not in * irq context), which is the safest usage category.
*/ char c = '.';
/* * The order of the following usage checks matters, which will * result in the outcome character as follows: * * - '+': irq is enabled and not in irq context * - '-': in irq context and irq is disabled * - '?': in irq context and irq is enabled
*/ if (class->usage_mask & lock_flag(bit + LOCK_USAGE_DIR_MASK)) {
c = '+'; if (class->usage_mask & lock_flag(bit))
c = '?';
} elseif (class->usage_mask & lock_flag(bit))
c = '-';
return c;
}
void get_usage_chars(struct lock_class *class, char usage[LOCK_USAGE_CHARS])
{ int i = 0;
name = lock->name; if (!name)
name = __get_key_name(lock->key->subkeys, str);
printk(KERN_CONT "%s", name);
}
staticvoid print_lock(struct held_lock *hlock)
{ /* * We can be called locklessly through debug_show_all_locks() so be * extra careful, the hlock might have been released and cleared. * * If this indeed happens, lets pretend it does not hurt to continue * to print the lock unless the hlock class_idx does not point to a * registered class. The rationale here is: since we don't attempt * to distinguish whether we are in this situation, if it just * happened we can't count on class_idx to tell either.
*/ struct lock_class *lock = hlock_class(hlock);
if (!lock) {
printk(KERN_CONT "<RELEASED>\n"); return;
}
staticvoid lockdep_print_held_locks(struct task_struct *p)
{ int i, depth = READ_ONCE(p->lockdep_depth);
if (!depth)
printk("no locks held by %s/%d.\n", p->comm, task_pid_nr(p)); else
printk("%d lock%s held by %s/%d:\n", depth,
str_plural(depth), p->comm, task_pid_nr(p)); /* * It's not reliable to print a task's held locks if it's not sleeping * and it's not the current task.
*/ if (p != current && task_is_running(p)) return; for (i = 0; i < depth; i++) {
printk(" #%d: ", i);
print_lock(p->held_locks + i);
}
}
/* * Is this the address of a static object:
*/ #ifdef __KERNEL__ staticint static_obj(constvoid *obj)
{ unsignedlong addr = (unsignedlong) obj;
if (is_kernel_core_data(addr)) return 1;
/* * keys are allowed in the __ro_after_init section.
*/ if (is_kernel_rodata(addr)) return 1;
/* * in initdata section and used during bootup only? * NOTE: On some platforms the initdata section is * outside of the _stext ... _end range.
*/ if (system_state < SYSTEM_FREEING_INITMEM &&
init_section_contains((void *)addr, 1)) return 1;
/* * in-kernel percpu var?
*/ if (is_kernel_percpu_address(addr)) return 1;
/* * To make lock name printouts unique, we calculate a unique * class->name_version generation counter. The caller must hold the graph * lock.
*/ staticint count_matching_names(struct lock_class *new_class)
{ struct lock_class *class; int count = 0;
/* used from NMI context -- must be lockless */ static noinstr struct lock_class *
look_up_lock_class(conststruct lockdep_map *lock, unsignedint subclass)
{ struct lockdep_subclass_key *key; struct hlist_head *hash_head; struct lock_class *class;
if (unlikely(subclass >= MAX_LOCKDEP_SUBCLASSES)) {
instrumentation_begin();
debug_locks_off();
nbcon_cpu_emergency_enter();
printk(KERN_ERR "BUG: looking up invalid subclass: %u\n", subclass);
printk(KERN_ERR "turning off the locking correctness validator.\n");
dump_stack();
nbcon_cpu_emergency_exit();
instrumentation_end(); return NULL;
}
/* * If it is not initialised then it has never been locked, * so it won't be present in the hash table.
*/ if (unlikely(!lock->key)) return NULL;
/* * NOTE: the class-key must be unique. For dynamic locks, a static * lock_class_key variable is passed in through the mutex_init() * (or spin_lock_init()) call - which acts as the key. For static * locks we use the lock object itself as the key.
*/
BUILD_BUG_ON(sizeof(struct lock_class_key) > sizeof(struct lockdep_map));
key = lock->key->subkeys + subclass;
hash_head = classhashentry(key);
/* * We do an RCU walk of the hash, see lockdep_free_key_range().
*/ if (DEBUG_LOCKS_WARN_ON(!irqs_disabled())) return NULL;
hlist_for_each_entry_rcu_notrace(class, hash_head, hash_entry) { if (class->key == key) { /* * Huh! same key, different name? Did someone trample * on some memory? We're most confused.
*/
WARN_ONCE(class->name != lock->name &&
lock->key != &__lockdep_no_validate__, "Looking for class \"%s\" with key %ps, but found a different class \"%s\" with the same key\n",
lock->name, lock->key, class->name); returnclass;
}
}
return NULL;
}
/* * Static locks do not have their class-keys yet - for them the key is * the lock object itself. If the lock is in the per cpu area, the * canonical address of the lock (per cpu offset removed) is used.
*/ staticbool assign_lock_key(struct lockdep_map *lock)
{ unsignedlong can_addr, addr = (unsignedlong)lock;
#ifdef __KERNEL__ /* * lockdep_free_key_range() assumes that struct lock_class_key * objects do not overlap. Since we use the address of lock * objects as class key for static objects, check whether the * size of lock_class_key objects does not exceed the size of * the smallest lock object.
*/
BUILD_BUG_ON(sizeof(struct lock_class_key) > sizeof(raw_spinlock_t)); #endif
if (__is_kernel_percpu_address(addr, &can_addr))
lock->key = (void *)can_addr; elseif (__is_module_percpu_address(addr, &can_addr))
lock->key = (void *)can_addr; elseif (static_obj(lock))
lock->key = (void *)lock; else { /* Debug-check: all keys must be persistent! */
debug_locks_off();
nbcon_cpu_emergency_enter();
pr_err("INFO: trying to register non-static key.\n");
pr_err("The code is fine but needs lockdep annotation, or maybe\n");
pr_err("you didn't initialize this object before use?\n");
pr_err("turning off the locking correctness validator.\n");
dump_stack();
nbcon_cpu_emergency_exit(); returnfalse;
}
returntrue;
}
#ifdef CONFIG_DEBUG_LOCKDEP
/* Check whether element @e occurs in list @h */ staticbool in_list(struct list_head *e, struct list_head *h)
{ struct list_head *f;
list_for_each(f, h) { if (e == f) returntrue;
}
returnfalse;
}
/* * Check whether entry @e occurs in any of the locks_after or locks_before * lists.
*/ staticbool in_any_class_list(struct list_head *e)
{ struct lock_class *class; int i;
for (i = 0; i < ARRAY_SIZE(lock_classes); i++) { class = &lock_classes[i]; if (in_list(e, &class->locks_after) ||
in_list(e, &class->locks_before)) returntrue;
} returnfalse;
}
for (i = chain->base; i < chain->base + chain->depth; i++)
chain_key = iterate_chain_key(chain_key, chain_hlocks[i]); /* * The 'unsigned long long' casts avoid that a compiler warning * is reported when building tools/lib/lockdep.
*/ if (chain->chain_key != chain_key) {
printk(KERN_INFO "chain %lld: key %#llx <> %#llx\n",
(unsignedlonglong)(chain - lock_chains),
(unsignedlonglong)chain->chain_key,
(unsignedlonglong)chain_key); returnfalse;
} #endif returntrue;
}
staticbool in_any_zapped_class_list(struct lock_class *class)
{ struct pending_free *pf; int i;
for (i = 0, pf = delayed_free.pf; i < ARRAY_SIZE(delayed_free.pf); i++, pf++) { if (in_list(&class->lock_entry, &pf->zapped)) returntrue;
}
/* Check whether all classes occur in a lock list. */ for (i = 0; i < ARRAY_SIZE(lock_classes); i++) { class = &lock_classes[i]; if (!in_list(&class->lock_entry, &all_lock_classes) &&
!in_list(&class->lock_entry, &free_lock_classes) &&
!in_any_zapped_class_list(class)) {
printk(KERN_INFO "class %px/%s is not in any class list\n", class, class->name ? : "(?)"); returnfalse;
}
}
/* Check whether all classes have valid lock lists. */ for (i = 0; i < ARRAY_SIZE(lock_classes); i++) { class = &lock_classes[i]; if (!class_lock_list_valid(class, &class->locks_before)) returnfalse; if (!class_lock_list_valid(class, &class->locks_after)) returnfalse;
}
/* Check the chain_key of all lock chains. */ for (i = 0; i < ARRAY_SIZE(chainhash_table); i++) {
head = chainhash_table + i;
hlist_for_each_entry_rcu(chain, head, entry) { if (!check_lock_chain_key(chain)) returnfalse;
}
}
/* * Check whether all list entries that are in use occur in a class * lock list.
*/
for_each_set_bit(i, list_entries_in_use, ARRAY_SIZE(list_entries)) {
e = list_entries + i; if (!in_any_class_list(&e->entry)) {
printk(KERN_INFO "list entry %d is not in any class list; class %s <> %s\n",
(unsignedint)(e - list_entries),
e->class->name ? : "(?)",
e->links_to->name ? : "(?)"); returnfalse;
}
}
/* * Check whether all list entries that are not in use do not occur in * a class lock list.
*/
for_each_clear_bit(i, list_entries_in_use, ARRAY_SIZE(list_entries)) {
e = list_entries + i; if (in_any_class_list(&e->entry)) {
printk(KERN_INFO "list entry %d occurs in a class list; class %s <> %s\n",
(unsignedint)(e - list_entries),
e->class && e->class->name ? e->class->name : "(?)",
e->links_to && e->links_to->name ?
e->links_to->name : "(?)"); returnfalse;
}
}
returntrue;
}
int check_consistency = 0;
module_param(check_consistency, int, 0644);
staticvoid check_data_structures(void)
{ staticbool once = false;
if (check_consistency && !once) { if (!__check_data_structures()) {
once = true;
WARN_ON(once);
}
}
}
#else/* CONFIG_DEBUG_LOCKDEP */
staticinlinevoid check_data_structures(void) { }
#endif/* CONFIG_DEBUG_LOCKDEP */
staticvoid init_chain_block_buckets(void);
/* * Initialize the lock_classes[] array elements, the free_lock_classes list * and also the delayed_free structure.
*/ staticvoid init_data_structures_once(void)
{ staticbool __read_mostly ds_initialized, rcu_head_initialized; int i;
if (likely(rcu_head_initialized)) return;
if (system_state >= SYSTEM_SCHEDULING) {
init_rcu_head(&delayed_free.rcu_head);
rcu_head_initialized = true;
}
/* Check whether a key has been registered as a dynamic key. */ staticbool is_dynamic_key(conststruct lock_class_key *key)
{ struct hlist_head *hash_head; struct lock_class_key *k; bool found = false;
if (WARN_ON_ONCE(static_obj(key))) returnfalse;
/* * If lock debugging is disabled lock_keys_hash[] may contain * pointers to memory that has already been freed. Avoid triggering * a use-after-free in that case by returning early.
*/ if (!debug_locks) returntrue;
hash_head = keyhashentry(key);
rcu_read_lock();
hlist_for_each_entry_rcu(k, hash_head, hash_entry) { if (k == key) {
found = true; break;
}
}
rcu_read_unlock();
return found;
}
/* * Register a lock's class in the hash-table, if the class is not present * yet. Otherwise we look it up. We cache the result in the lock object * itself, so actual lookup of the hash should be once per lock object.
*/ staticstruct lock_class *
register_lock_class(struct lockdep_map *lock, unsignedint subclass, int force)
{ struct lockdep_subclass_key *key; struct hlist_head *hash_head; struct lock_class *class; int idx;
DEBUG_LOCKS_WARN_ON(!irqs_disabled());
class = look_up_lock_class(lock, subclass); if (likely(class)) goto out_set_class_cache;
if (!lock->key) { if (!assign_lock_key(lock)) return NULL;
} elseif (!static_obj(lock->key) && !is_dynamic_key(lock->key)) { return NULL;
}
if (!graph_lock()) { return NULL;
} /* * We have to do the hash-walk again, to avoid races * with another CPU:
*/
hlist_for_each_entry_rcu(class, hash_head, hash_entry) { if (class->key == key) goto out_unlock_set;
}
init_data_structures_once();
/* Allocate a new lock class and add it to the hash. */ class = list_first_entry_or_null(&free_lock_classes, typeof(*class),
lock_entry); if (!class) { if (!debug_locks_off_graph_unlock()) { return NULL;
}
nbcon_cpu_emergency_enter();
print_lockdep_off("BUG: MAX_LOCKDEP_KEYS too low!");
dump_stack();
nbcon_cpu_emergency_exit(); return NULL;
}
nr_lock_classes++;
__set_bit(class - lock_classes, lock_classes_in_use);
debug_atomic_inc(nr_unused_locks);
class->key = key;
class->name = lock->name;
class->subclass = subclass;
WARN_ON_ONCE(!list_empty(&class->locks_before));
WARN_ON_ONCE(!list_empty(&class->locks_after));
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:
*/
hlist_add_head_rcu(&class->hash_entry, hash_head); /* * Remove the class from the free list and add it to the global list * of classes.
*/
list_move_tail(&class->lock_entry, &all_lock_classes);
idx = class - lock_classes; if (idx > max_lock_class_idx)
max_lock_class_idx = idx;
if (verbose(class)) {
graph_unlock();
nbcon_cpu_emergency_enter();
printk("\nnew class %px: %s", class->key, class->name); if (class->name_version > 1)
printk(KERN_CONT "#%d", class->name_version);
printk(KERN_CONT "\n");
dump_stack();
nbcon_cpu_emergency_exit();
if (!graph_lock()) { return NULL;
}
}
out_unlock_set:
graph_unlock();
/* * Hash collision, did we smoke some? We found a class with a matching * hash but the subclass -- which is hashed in -- didn't match.
*/ if (DEBUG_LOCKS_WARN_ON(class->subclass != subclass)) return NULL;
returnclass;
}
#ifdef CONFIG_PROVE_LOCKING /* * Allocate a lockdep entry. (assumes the graph_lock held, returns * with NULL on failure)
*/ staticstruct lock_list *alloc_list_entry(void)
{ int idx = find_first_zero_bit(list_entries_in_use,
ARRAY_SIZE(list_entries));
if (idx >= ARRAY_SIZE(list_entries)) { if (!debug_locks_off_graph_unlock()) return NULL;
/* * Add a new dependency to the head of the list:
*/ staticint add_lock_to_list(struct lock_class *this, struct lock_class *links_to, struct list_head *head,
u16 distance, u8 dep, conststruct lock_trace *trace)
{ struct lock_list *entry; /* * Lock not present yet - get a new dependency struct and * add it to the list:
*/
entry = alloc_list_entry(); if (!entry) return 0;
entry->class = this;
entry->links_to = links_to;
entry->dep = dep;
entry->distance = distance;
entry->trace = trace; /* * Both allocation and removal are done under the graph lock; but * iteration is under RCU-sched; see look_up_lock_class() and * lockdep_free_key_range().
*/
list_add_tail_rcu(&entry->entry, head);
return 1;
}
/* * For good efficiency of modular, we use power of 2
*/ #define MAX_CIRCULAR_QUEUE_SIZE (1UL << CONFIG_LOCKDEP_CIRCULAR_QUEUE_BITS) #define CQ_MASK (MAX_CIRCULAR_QUEUE_SIZE-1)
/* * The circular_queue and helpers are used to implement graph * breadth-first search (BFS) algorithm, by which we can determine * whether there is a path from a lock to another. In deadlock checks, * a path from the next lock to be acquired to a previous held lock * indicates that adding the <prev> -> <next> lock dependency will * produce a circle in the graph. Breadth-first search instead of * depth-first search is used in order to find the shortest (circular) * path.
*/ struct circular_queue { struct lock_list *element[MAX_CIRCULAR_QUEUE_SIZE]; unsignedint front, rear;
};
/* * Dequeue an element from the circular_queue, return a lock_list if * the queue is not empty, or NULL if otherwise.
*/ staticinlinestruct lock_list * __cq_dequeue(struct circular_queue *cq)
{ struct lock_list * lock;
/* * Return the forward or backward dependency list. * * @lock: the lock_list to get its class's dependency list * @offset: the offset to struct lock_class to determine whether it is * locks_after or locks_before
*/ staticinlinestruct list_head *get_dep_list(struct lock_list *lock, int offset)
{ void *lock_class = lock->class;
return lock_class + offset;
} /* * Return values of a bfs search: * * BFS_E* indicates an error * BFS_R* indicates a result (match or not) * * BFS_EINVALIDNODE: Find a invalid node in the graph. * * BFS_EQUEUEFULL: The queue is full while doing the bfs. * * BFS_RMATCH: Find the matched node in the graph, and put that node into * *@target_entry. * * BFS_RNOMATCH: Haven't found the matched node and keep *@target_entry * _unchanged_.
*/ enum bfs_result {
BFS_EINVALIDNODE = -2,
BFS_EQUEUEFULL = -1,
BFS_RMATCH = 0,
BFS_RNOMATCH = 1,
};
/* * bfs_result < 0 means error
*/ staticinlinebool bfs_error(enum bfs_result res)
{ return res < 0;
}
/* * DEP_*_BIT in lock_list::dep * * For dependency @prev -> @next: * * SR: @prev is shared reader (->read != 0) and @next is recursive reader * (->read == 2) * ER: @prev is exclusive locker (->read == 0) and @next is recursive reader * SN: @prev is shared reader and @next is non-recursive locker (->read != 2) * EN: @prev is exclusive locker and @next is non-recursive locker * * Note that we define the value of DEP_*_BITs so that: * bit0 is prev->read == 0 * bit1 is next->read != 2
*/ #define DEP_SR_BIT (0 + (0 << 1)) /* 0 */ #define DEP_ER_BIT (1 + (0 << 1)) /* 1 */ #define DEP_SN_BIT (0 + (1 << 1)) /* 2 */ #define DEP_EN_BIT (1 + (1 << 1)) /* 3 */
/* * Initialize a lock_list entry @lock belonging to @class as the root for a BFS * search.
*/ staticinlinevoid __bfs_init_root(struct lock_list *lock, struct lock_class *class)
{
lock->class = class;
lock->parent = NULL;
lock->only_xr = 0;
}
/* * Initialize a lock_list entry @lock based on a lock acquisition @hlock as the * root for a BFS search. * * ->only_xr of the initial lock node is set to @hlock->read == 2, to make sure * that <prev> -> @hlock and @hlock -> <whatever __bfs() found> is not -(*R)-> * and -(S*)->.
*/ staticinlinevoid bfs_init_root(struct lock_list *lock, struct held_lock *hlock)
{
__bfs_init_root(lock, hlock_class(hlock));
lock->only_xr = (hlock->read == 2);
}
/* * Similar to bfs_init_root() but initialize the root for backwards BFS. * * ->only_xr of the initial lock node is set to @hlock->read != 0, to make sure * that <next> -> @hlock and @hlock -> <whatever backwards BFS found> is not * -(*S)-> and -(R*)-> (reverse order of -(*R)-> and -(S*)->).
*/ staticinlinevoid bfs_init_rootb(struct lock_list *lock, struct held_lock *hlock)
{
__bfs_init_root(lock, hlock_class(hlock));
lock->only_xr = (hlock->read != 0);
}
staticinlinestruct lock_list *__bfs_next(struct lock_list *lock, int offset)
{ if (!lock || !lock->parent) return NULL;
/* * Breadth-First Search to find a strong path in the dependency graph. * * @source_entry: the source of the path we are searching for. * @data: data used for the second parameter of @match function * @match: match function for the search * @target_entry: pointer to the target of a matched path * @offset: the offset to struct lock_class to determine whether it is * locks_after or locks_before * * We may have multiple edges (considering different kinds of dependencies, * e.g. ER and SN) between two nodes in the dependency graph. But * only the strong dependency path in the graph is relevant to deadlocks. A * strong dependency path is a dependency path that doesn't have two adjacent * dependencies as -(*R)-> -(S*)->, please see: * * Documentation/locking/lockdep-design.rst * * for more explanation of the definition of strong dependency paths * * In __bfs(), we only traverse in the strong dependency path: * * In lock_list::only_xr, we record whether the previous dependency only * has -(*R)-> in the search, and if it does (prev only has -(*R)->), we * filter out any -(S*)-> in the current dependency and after that, the * ->only_xr is set according to whether we only have -(*R)-> left.
*/ staticenum bfs_result __bfs(struct lock_list *source_entry, void *data, bool (*match)(struct lock_list *entry, void *data), bool (*skip)(struct lock_list *entry, void *data), struct lock_list **target_entry, int offset)
{ struct circular_queue *cq = &lock_cq; struct lock_list *lock = NULL; struct lock_list *entry; struct list_head *head; unsignedint cq_depth; bool first;
lockdep_assert_locked();
__cq_init(cq);
__cq_enqueue(cq, source_entry);
while ((lock = __bfs_next(lock, offset)) || (lock = __cq_dequeue(cq))) { if (!lock->class) return BFS_EINVALIDNODE;
/* * Step 1: check whether we already finish on this one. * * If we have visited all the dependencies from this @lock to * others (iow, if we have visited all lock_list entries in * @lock->class->locks_{after,before}) we skip, otherwise go * and visit all the dependencies in the list and mark this * list accessed.
*/ if (lock_accessed(lock)) continue; else
mark_lock_accessed(lock);
/* * Step 2: check whether prev dependency and this form a strong * dependency path.
*/ if (lock->parent) { /* Parent exists, check prev dependency */
u8 dep = lock->dep; bool prev_only_xr = lock->parent->only_xr;
/* * Mask out all -(S*)-> if we only have *R in previous * step, because -(*R)-> -(S*)-> don't make up a strong * dependency.
*/ if (prev_only_xr)
dep &= ~(DEP_SR_MASK | DEP_SN_MASK);
/* If nothing left, we skip */ if (!dep) continue;
/* If there are only -(*R)-> left, set that for the next step */
lock->only_xr = !(dep & (DEP_SN_MASK | DEP_EN_MASK));
}
/* * Step 3: we haven't visited this and there is a strong * dependency path to this, so check with @match. * If @skip is provide and returns true, we skip this * lock (and any path this lock is in).
*/ if (skip && skip(lock, data)) continue;
if (match(lock, data)) {
*target_entry = lock; return BFS_RMATCH;
}
/* * Step 4: if not match, expand the path by adding the * forward or backwards dependencies in the search *
*/
first = true;
head = get_dep_list(lock, offset);
list_for_each_entry_rcu(entry, head, entry) {
visit_lock_entry(entry, lock);
/* * Note we only enqueue the first of the list into the * queue, because we can always find a sibling * dependency from one (see __bfs_next()), as a result * the space of queue is saved.
*/ if (!first) continue;
first = false;
if (__cq_enqueue(cq, entry)) return BFS_EQUEUEFULL;
/* * Print a dependency chain entry (this is only done when a deadlock * has been detected):
*/ static noinline void
print_circular_bug_entry(struct lock_list *target, int depth)
{ if (debug_locks_silent) return;
printk("\n-> #%u", depth);
print_lock_name(NULL, target->class);
printk(KERN_CONT ":\n");
print_lock_trace(target->trace, 6);
}
/* * A direct locking problem where unsafe_class lock is taken * directly by safe_class lock, then all we need to show * is the deadlock scenario, as it is obvious that the * unsafe lock is taken under the safe lock. * * But if there is a chain instead, where the safe lock takes * an intermediate lock (middle_class) where this lock is * not the same as the safe lock, then the lock chain is * used to describe the problem. Otherwise we would need * to show a different CPU case for each link in the chain * from the safe_class lock to the unsafe_class lock.
*/ if (parent != source) {
printk("Chain exists of:\n ");
__print_lock_name(src, source);
printk(KERN_CONT " --> ");
__print_lock_name(NULL, parent);
printk(KERN_CONT " --> ");
__print_lock_name(tgt, target);
printk(KERN_CONT "\n\n");
}
/* * When a circular dependency is detected, print the * header first:
*/ static noinline void
print_circular_bug_header(struct lock_list *entry, unsignedint depth, struct held_lock *check_src, struct held_lock *check_tgt)
{ struct task_struct *curr = current;
if (debug_locks_silent) return;
pr_warn("\n");
pr_warn("======================================================\n");
pr_warn("WARNING: possible circular locking dependency detected\n");
print_kernel_ident();
pr_warn("------------------------------------------------------\n");
pr_warn("%s/%d is trying to acquire lock:\n",
curr->comm, task_pid_nr(curr));
print_lock(check_src);
pr_warn("\nbut task is already holding lock:\n");
print_lock(check_tgt);
pr_warn("\nwhich lock already depends on the new lock.\n\n");
pr_warn("\nthe existing dependency chain (in reverse order) is:\n");
print_circular_bug_entry(entry, depth);
}
/* * We are about to add B -> A into the dependency graph, and in __bfs() a * strong dependency path A -> .. -> B is found: hlock_class equals * entry->class. * * We will have a deadlock case (conflict) if A -> .. -> B -> A is a strong * dependency cycle, that means: * * Either * * a) B -> A is -(E*)-> * * or * * b) A -> .. -> B is -(*N)-> (i.e. A -> .. -(*N)-> B) * * as then we don't have -(*R)-> -(S*)-> in the cycle.
*/ staticinlinebool hlock_conflict(struct lock_list *entry, void *data)
{ struct held_lock *hlock = (struct held_lock *)data;
return hlock_class(hlock) == entry->class && /* Found A -> .. -> B */
(hlock->read == 0 || /* B -> A is -(E*)-> */
!entry->only_xr); /* A -> .. -> B is -(*N)-> */
}
/* * Prove that the dependency graph starting at <src> can not * lead to <target>. If it can, there is a circle when adding * <target> -> <src> dependency. * * Print an error and return BFS_RMATCH if it does.
*/ static noinline enum bfs_result
check_noncircular(struct held_lock *src, struct held_lock *target, struct lock_trace **const trace)
{ enum bfs_result ret; struct lock_list *target_entry; struct lock_list src_entry;
bfs_init_root(&src_entry, src);
debug_atomic_inc(nr_cyclic_checks);
ret = check_path(target, &src_entry, hlock_conflict, NULL, &target_entry);
if (unlikely(ret == BFS_RMATCH)) { if (!*trace) { /* * If save_trace fails here, the printing might * trigger a WARN but because of the !nr_entries it * should not do bad things.
*/
*trace = save_trace();
}
/* * Forwards and backwards subgraph searching, for the purposes of * proving that two subgraphs can be connected by a new dependency * without creating any illegal irq-safe -> irq-unsafe lock dependency. * * A irq safe->unsafe deadlock happens with the following conditions: * * 1) We have a strong dependency path A -> ... -> B * * 2) and we have ENABLED_IRQ usage of B and USED_IN_IRQ usage of A, therefore * irq can create a new dependency B -> A (consider the case that a holder * of B gets interrupted by an irq whose handler will try to acquire A). * * 3) the dependency circle A -> ... -> B -> A we get from 1) and 2) is a * strong circle: * * For the usage bits of B: * a) if A -> B is -(*N)->, then B -> A could be any type, so any * ENABLED_IRQ usage suffices. * b) if A -> B is -(*R)->, then B -> A must be -(E*)->, so only * ENABLED_IRQ_*_READ usage suffices. * * For the usage bits of A: * c) if A -> B is -(E*)->, then B -> A could be any type, so any * USED_IN_IRQ usage suffices. * d) if A -> B is -(S*)->, then B -> A must be -(*N)->, so only * USED_IN_IRQ_*_READ usage suffices.
*/
/* * There is a strong dependency path in the dependency graph: A -> B, and now * we need to decide which usage bit of A should be accumulated to detect * safe->unsafe bugs. * * Note that usage_accumulate() is used in backwards search, so ->only_xr * stands for whether A -> B only has -(S*)-> (in this case ->only_xr is true). * * As above, if only_xr is false, which means A -> B has -(E*)-> dependency * path, any usage of A should be considered. Otherwise, we should only * consider _READ usage.
*/ staticinlinebool usage_accumulate(struct lock_list *entry, void *mask)
{ if (!entry->only_xr)
*(unsignedlong *)mask |= entry->class->usage_mask; else/* Mask out _READ usage bits */
*(unsignedlong *)mask |= (entry->class->usage_mask & LOCKF_IRQ);
returnfalse;
}
/* * There is a strong dependency path in the dependency graph: A -> B, and now * we need to decide which usage bit of B conflicts with the usage bits of A, * i.e. which usage bit of B may introduce safe->unsafe deadlocks. * * As above, if only_xr is false, which means A -> B has -(*N)-> dependency * path, any usage of B should be considered. Otherwise, we should only * consider _READ usage.
*/ staticinlinebool usage_match(struct lock_list *entry, void *mask)
{ if (!entry->only_xr) return !!(entry->class->usage_mask & *(unsignedlong *)mask); else/* Mask out _READ usage bits */ return !!((entry->class->usage_mask & LOCKF_IRQ) & *(unsignedlong *)mask);
}
/* * Skip local_lock() for irq inversion detection. * * For !RT, local_lock() is not a real lock, so it won't carry any * dependency. * * For RT, an irq inversion happens when we have lock A and B, and on * some CPU we can have: * * lock(A); * <interrupted> * lock(B); * * where lock(B) cannot sleep, and we have a dependency B -> ... -> A. * * Now we prove local_lock() cannot exist in that dependency. First we * have the observation for any lock chain L1 -> ... -> Ln, for any * 1 <= i <= n, Li.inner_wait_type <= L1.inner_wait_type, otherwise * wait context check will complain. And since B is not a sleep lock, * therefore B.inner_wait_type >= 2, and since the inner_wait_type of * local_lock() is 3, which is greater than 2, therefore there is no * way the local_lock() exists in the dependency B -> ... -> A. * * As a result, we will skip local_lock(), when we search for irq * inversion bugs.
*/ if (entry->class->lock_type == LD_LOCK_PERCPU &&
DEBUG_LOCKS_WARN_ON(entry->class->wait_type_inner < LD_WAIT_CONFIG)) returnfalse;
/* * Skip WAIT_OVERRIDE for irq inversion detection -- it's not actually * a lock and only used to override the wait_type.
*/
returntrue;
}
/* * Find a node in the forwards-direction dependency sub-graph starting * at @root->class that matches @bit. * * Return BFS_MATCH if such a node exists in the subgraph, and put that node * into *@target_entry.
*/ staticenum bfs_result
find_usage_forwards(struct lock_list *root, unsignedlong usage_mask, struct lock_list **target_entry)
{ enum bfs_result result;
debug_atomic_inc(nr_find_usage_forwards_checks);
result = __bfs_forwards(root, &usage_mask, usage_match, usage_skip, target_entry);
return result;
}
/* * Find a node in the backwards-direction dependency sub-graph starting * at @root->class that matches @bit.
*/ staticenum bfs_result
find_usage_backwards(struct lock_list *root, unsignedlong usage_mask, struct lock_list **target_entry)
{ enum bfs_result result;
debug_atomic_inc(nr_find_usage_backwards_checks);
result = __bfs_backwards(root, &usage_mask, usage_match, usage_skip, target_entry);
return result;
}
staticvoid print_lock_class_header(struct lock_class *class, int depth)
{ int bit;
/* * Dependency path printing: * * After BFS we get a lock dependency path (linked via ->parent of lock_list), * printing out each lock in the dependency path will help on understanding how * the deadlock could happen. Here are some details about dependency path * printing: * * 1) A lock_list can be either forwards or backwards for a lock dependency, * for a lock dependency A -> B, there are two lock_lists: * * a) lock_list in the ->locks_after list of A, whose ->class is B and * ->links_to is A. In this case, we can say the lock_list is * "A -> B" (forwards case). * * b) lock_list in the ->locks_before list of B, whose ->class is A * and ->links_to is B. In this case, we can say the lock_list is * "B <- A" (bacwards case). * * The ->trace of both a) and b) point to the call trace where B was * acquired with A held. * * 2) A "helper" lock_list is introduced during BFS, this lock_list doesn't * represent a certain lock dependency, it only provides an initial entry * for BFS. For example, BFS may introduce a "helper" lock_list whose * ->class is A, as a result BFS will search all dependencies starting with * A, e.g. A -> B or A -> C. * * The notation of a forwards helper lock_list is like "-> A", which means * we should search the forwards dependencies starting with "A", e.g A -> B * or A -> C. * * The notation of a bacwards helper lock_list is like "<- B", which means * we should search the backwards dependencies ending with "B", e.g. * B <- A or B <- C.
*/
/* * printk the shortest lock dependencies from @root to @leaf in reverse order. * * We have a lock dependency path as follow: * * @root @leaf * | | * V V * ->parent ->parent * | lock_list | <--------- | lock_list | ... | lock_list | <--------- | lock_list | * | -> L1 | | L1 -> L2 | ... |Ln-2 -> Ln-1| | Ln-1 -> Ln| * * , so it's natural that we start from @leaf and print every ->class and * ->trace until we reach the @root.
*/ staticvoid __used
print_shortest_lock_dependencies(struct lock_list *leaf, struct lock_list *root)
{ struct lock_list *entry = leaf; int depth;
/*compute depth from generated tree by BFS*/
depth = get_lock_depth(leaf);
/* * printk the shortest lock dependencies from @leaf to @root. * * We have a lock dependency path (from a backwards search) as follow: * * @leaf @root * | | * V V * ->parent ->parent * | lock_list | ---------> | lock_list | ... | lock_list | ---------> | lock_list | * | L2 <- L1 | | L3 <- L2 | ... | Ln <- Ln-1 | | <- Ln | * * , so when we iterate from @leaf to @root, we actually print the lock * dependency path L1 -> L2 -> .. -> Ln in the non-reverse order. * * Another thing to notice here is that ->class of L2 <- L1 is L1, while the * ->trace of L2 <- L1 is the call trace of L2, in fact we don't have the call * trace of L1 in the dependency path, which is alright, because most of the * time we can figure out where L1 is held from the call trace of L2.
*/ staticvoid __used
print_shortest_lock_dependencies_backwards(struct lock_list *leaf, struct lock_list *root)
{ struct lock_list *entry = leaf; conststruct lock_trace *trace = NULL; int depth;
/*compute depth from generated tree by BFS*/
depth = get_lock_depth(leaf);
do {
print_lock_class_header(entry->class, depth); if (trace) {
printk("%*s ... acquired at:\n", depth, "");
print_lock_trace(trace, 2);
printk("\n");
}
/* * Record the pointer to the trace for the next lock_list * entry, see the comments for the function.
*/
trace = entry->trace;
if (depth == 0 && (entry != root)) {
printk("lockdep:%s bad path found in chain graph\n", __func__); break;
}
if (middle_class == safe_class)
middle_class = next_class;
/* * A direct locking problem where unsafe_class lock is taken * directly by safe_class lock, then all we need to show * is the deadlock scenario, as it is obvious that the * unsafe lock is taken under the safe lock. * * But if there is a chain instead, where the safe lock takes * an intermediate lock (middle_class) where this lock is * not the same as the safe lock, then the lock chain is * used to describe the problem. Otherwise we would need * to show a different CPU case for each link in the chain * from the safe_class lock to the unsafe_class lock.
*/ if (middle_class != unsafe_class) {
printk("Chain exists of:\n ");
__print_lock_name(NULL, safe_class);
printk(KERN_CONT " --> ");
__print_lock_name(NULL, middle_class);
printk(KERN_CONT " --> ");
__print_lock_name(NULL, unsafe_class);
printk(KERN_CONT "\n\n");
}
pr_warn("\nand this task is already holding:\n");
print_lock(prev);
pr_warn("which would create a new lock dependency:\n");
print_lock_name(prev, hlock_class(prev));
pr_cont(" ->");
print_lock_name(next, hlock_class(next));
pr_cont("\n");
pr_warn("\nbut this new dependency connects a %s-irq-safe lock:\n",
irqclass);
print_lock_name(NULL, backwards_entry->class);
pr_warn("\n... which became %s-irq-safe at:\n", irqclass);
pr_warn("\nto a %s-irq-unsafe lock:\n", irqclass);
print_lock_name(NULL, forwards_entry->class);
pr_warn("\n... which became %s-irq-unsafe at:\n", irqclass);
pr_warn("...");
pr_warn("\nother info that might help us debug this:\n\n");
print_irq_lock_scenario(backwards_entry, forwards_entry,
hlock_class(prev), hlock_class(next));
lockdep_print_held_locks(curr);
pr_warn("\nthe dependencies between %s-irq-safe lock and the holding lock:\n", irqclass);
print_shortest_lock_dependencies_backwards(backwards_entry, prev_root);
pr_warn("\nthe dependencies between the lock to be acquired");
pr_warn(" and %s-irq-unsafe lock:\n", irqclass);
next_root->trace = save_trace(); if (!next_root->trace) goto out;
print_shortest_lock_dependencies(forwards_entry, next_root);
/* * The bit number is encoded like: * * bit0: 0 exclusive, 1 read lock * bit1: 0 used in irq, 1 irq enabled * bit2-n: state
*/ staticint exclusive_bit(int new_bit)
{ int state = new_bit & LOCK_USAGE_STATE_MASK; int dir = new_bit & LOCK_USAGE_DIR_MASK;
/* * keep state, bit flip the direction and strip read.
*/ return state | (dir ^ LOCK_USAGE_DIR_MASK);
}
/* * Observe that when given a bitmask where each bitnr is encoded as above, a * right shift of the mask transforms the individual bitnrs as -1 and * conversely, a left shift transforms into +1 for the individual bitnrs. * * So for all bits whose number have LOCK_ENABLED_* set (bitnr1 == 1), we can * create the mask with those bit numbers using LOCK_USED_IN_* (bitnr1 == 0) * instead by subtracting the bit number by 2, or shifting the mask right by 2. * * Similarly, bitnr1 == 0 becomes bitnr1 == 1 by adding 2, or shifting left 2. * * So split the mask (note that LOCKF_ENABLED_IRQ_ALL|LOCKF_USED_IN_IRQ_ALL is * all bits set) and recompose with bitnr1 flipped.
*/ staticunsignedlong invert_dir_mask(unsignedlong mask)
{ unsignedlong excl = 0;
/* * Note that a LOCK_ENABLED_IRQ_*_READ usage and a LOCK_USED_IN_IRQ_*_READ * usage may cause deadlock too, for example: * * P1 P2 * <irq disabled> * write_lock(l1); <irq enabled> * read_lock(l2); * write_lock(l2); * <in irq> * read_lock(l1); * * , in above case, l1 will be marked as LOCK_USED_IN_IRQ_HARDIRQ_READ and l2 * will marked as LOCK_ENABLE_IRQ_HARDIRQ_READ, and this is a possible * deadlock. * * In fact, all of the following cases may cause deadlocks: * * LOCK_USED_IN_IRQ_* -> LOCK_ENABLED_IRQ_* * LOCK_USED_IN_IRQ_*_READ -> LOCK_ENABLED_IRQ_* * LOCK_USED_IN_IRQ_* -> LOCK_ENABLED_IRQ_*_READ * LOCK_USED_IN_IRQ_*_READ -> LOCK_ENABLED_IRQ_*_READ * * As a result, to calculate the "exclusive mask", first we invert the * direction (USED_IN/ENABLED) of the original mask, and 1) for all bits with * bitnr0 set (LOCK_*_READ), add those with bitnr0 cleared (LOCK_*). 2) for all * bits with bitnr0 cleared (LOCK_*_READ), add those with bitnr0 set (LOCK_*).
*/ staticunsignedlong exclusive_mask(unsignedlong mask)
{ unsignedlong excl = invert_dir_mask(mask);
/* * Retrieve the _possible_ original mask to which @mask is * exclusive. Ie: this is the opposite of exclusive_mask(). * Note that 2 possible original bits can match an exclusive * bit: one has LOCK_USAGE_READ_MASK set, the other has it * cleared. So both are returned for each exclusive bit.
*/ staticunsignedlong original_mask(unsignedlong mask)
{ unsignedlong excl = invert_dir_mask(mask);
/* * Find the first pair of bit match between an original * usage mask and an exclusive usage mask.
*/ staticint find_exclusive_match(unsignedlong mask, unsignedlong excl_mask, enum lock_usage_bit *bitp, enum lock_usage_bit *excl_bitp)
{ int bit, excl, excl_read;
for_each_set_bit(bit, &mask, LOCK_USED) { /* * exclusive_bit() strips the read bit, however, * LOCK_ENABLED_IRQ_*_READ may cause deadlocks too, so we need * to search excl | LOCK_USAGE_READ_MASK as well.
*/
excl = exclusive_bit(bit);
excl_read = excl | LOCK_USAGE_READ_MASK; if (excl_mask & lock_flag(excl)) {
*bitp = bit;
*excl_bitp = excl; return 0;
} elseif (excl_mask & lock_flag(excl_read)) {
*bitp = bit;
*excl_bitp = excl_read; return 0;
}
} return -1;
}
/* * Prove that the new dependency does not connect a hardirq-safe(-read) * lock with a hardirq-unsafe lock - to achieve this we search * the backwards-subgraph starting at <prev>, and the * forwards-subgraph starting at <next>:
*/ staticint check_irq_usage(struct task_struct *curr, struct held_lock *prev, struct held_lock *next)
{ unsignedlong usage_mask = 0, forward_mask, backward_mask; enum lock_usage_bit forward_bit = 0, backward_bit = 0; struct lock_list *target_entry1; struct lock_list *target_entry; struct lock_list this, that; enum bfs_result ret;
/* * Step 1: gather all hard/soft IRQs usages backward in an * accumulated usage mask.
*/
bfs_init_rootb(&this, prev);
ret = __bfs_backwards(&this, &usage_mask, usage_accumulate, usage_skip, NULL); if (bfs_error(ret)) {
print_bfs_bug(ret); return 0;
}
usage_mask &= LOCKF_USED_IN_IRQ_ALL; if (!usage_mask) return 1;
/* * Step 2: find exclusive uses forward that match the previous * backward accumulated mask.
*/
forward_mask = exclusive_mask(usage_mask);
bfs_init_root(&that, next);
ret = find_usage_forwards(&that, forward_mask, &target_entry1); if (bfs_error(ret)) {
print_bfs_bug(ret); return 0;
} if (ret == BFS_RNOMATCH) return 1;
/* * Step 3: we found a bad match! Now retrieve a lock from the backward * list whose usage mask matches the exclusive usage mask from the * lock found on the forward list. * * Note, we should only keep the LOCKF_ENABLED_IRQ_ALL bits, considering * the follow case: * * When trying to add A -> B to the graph, we find that there is a * hardirq-safe L, that L -> ... -> A, and another hardirq-unsafe M, * that B -> ... -> M. However M is **softirq-safe**, if we use exact * invert bits of M's usage_mask, we will find another lock N that is * **softirq-unsafe** and N -> ... -> A, however N -> .. -> M will not * cause a inversion deadlock.
*/
backward_mask = original_mask(target_entry1->class->usage_mask & LOCKF_ENABLED_IRQ_ALL);
ret = find_usage_backwards(&this, backward_mask, &target_entry); if (bfs_error(ret)) {
print_bfs_bug(ret); return 0;
} if (DEBUG_LOCKS_WARN_ON(ret == BFS_RNOMATCH)) return 1;
/* * Step 4: narrow down to a pair of incompatible usage bits * and report it.
*/
ret = find_exclusive_match(target_entry->class->usage_mask,
target_entry1->class->usage_mask,
&backward_bit, &forward_bit); if (DEBUG_LOCKS_WARN_ON(ret == -1)) return 1;
#ifdef CONFIG_LOCKDEP_SMALL /* * We are about to add A -> B into the dependency graph, and in __bfs() a * strong dependency path A -> .. -> B is found: hlock_class equals * entry->class. * * If A -> .. -> B can replace A -> B in any __bfs() search (means the former * is _stronger_ than or equal to the latter), we consider A -> B as redundant. * For example if A -> .. -> B is -(EN)-> (i.e. A -(E*)-> .. -(*N)-> B), and A * -> B is -(ER)-> or -(EN)->, then we don't need to add A -> B into the * dependency graph, as any strong path ..-> A -> B ->.. we can get with * having dependency A -> B, we could already get a equivalent path ..-> A -> * .. -> B -> .. with A -> .. -> B. Therefore A -> B is redundant. * * We need to make sure both the start and the end of A -> .. -> B is not * weaker than A -> B. For the start part, please see the comment in * check_redundant(). For the end part, we need: * * Either * * a) A -> B is -(*R)-> (everything is not weaker than that) * * or * * b) A -> .. -> B is -(*N)-> (nothing is stronger than this) *
*/ staticinlinebool hlock_equal(struct lock_list *entry, void *data)
{ struct held_lock *hlock = (struct held_lock *)data;
return hlock_class(hlock) == entry->class && /* Found A -> .. -> B */
(hlock->read == 2 || /* A -> B is -(*R)-> */
!entry->only_xr); /* A -> .. -> B is -(*N)-> */
}
/* * Check that the dependency graph starting at <src> can lead to * <target> or not. If it can, <src> -> <target> dependency is already * in the graph. * * Return BFS_RMATCH if it does, or BFS_RNOMATCH if it does not, return BFS_E* if * any error appears in the bfs search.
*/ static noinline enum bfs_result
check_redundant(struct held_lock *src, struct held_lock *target)
{ enum bfs_result ret; struct lock_list *target_entry; struct lock_list src_entry;
bfs_init_root(&src_entry, src); /* * Special setup for check_redundant(). * * To report redundant, we need to find a strong dependency path that * is equal to or stronger than <src> -> <target>. So if <src> is E, * we need to let __bfs() only search for a path starting at a -(E*)->, * we achieve this by setting the initial node's ->only_xr to true in * that case. And if <prev> is S, we set initial ->only_xr to false * because both -(S*)-> (equal) and -(E*)-> (stronger) are redundant.
*/
src_entry.only_xr = src->read == 0;
debug_atomic_inc(nr_redundant_checks);
/* * Note: we skip local_lock() for redundant check, because as the * comment in usage_skip(), A -> local_lock() -> B and A -> B are not * the same.
*/
ret = check_path(target, &src_entry, hlock_equal, usage_skip, &target_entry);
if (ret == BFS_RMATCH)
debug_atomic_inc(nr_redundant);
if (!debug_locks_off_graph_unlock() || debug_locks_silent) return;
nbcon_cpu_emergency_enter();
pr_warn("\n");
pr_warn("============================================\n");
pr_warn("WARNING: possible recursive locking detected\n");
print_kernel_ident();
pr_warn("--------------------------------------------\n");
pr_warn("%s/%d is trying to acquire lock:\n",
curr->comm, task_pid_nr(curr));
print_lock(next);
pr_warn("\nbut task is already holding lock:\n");
print_lock(prev);
if (class->cmp_fn) {
pr_warn("and the lock comparison function returns %i:\n",
class->cmp_fn(prev->instance, next->instance));
}
pr_warn("\nother info that might help us debug this:\n");
print_deadlock_scenario(next, prev);
lockdep_print_held_locks(curr);
pr_warn("\nstack backtrace:\n");
dump_stack();
nbcon_cpu_emergency_exit();
}
/* * Check whether we are holding such a class already. * * (Note that this has to be done separately, because the graph cannot * detect such classes of deadlocks.) * * Returns: 0 on deadlock detected, 1 on OK, 2 if another lock with the same * lock class is held but nest_lock is also held, i.e. we rely on the * nest_lock to avoid the deadlock.
*/ staticint
check_deadlock(struct task_struct *curr, struct held_lock *next)
{ struct lock_class *class; struct held_lock *prev; struct held_lock *nest = NULL; int i;
for (i = 0; i < curr->lockdep_depth; i++) {
prev = curr->held_locks + i;
if (prev->instance == next->nest_lock)
nest = prev;
if (hlock_class(prev) != hlock_class(next)) continue;
/* * Allow read-after-read recursion of the same * lock class (i.e. read_lock(lock)+read_lock(lock)):
*/ if ((next->read == 2) && prev->read) continue;
class = hlock_class(prev);
if (class->cmp_fn &&
class->cmp_fn(prev->instance, next->instance) < 0) continue;
/* * We're holding the nest_lock, which serializes this lock's * nesting behaviour.
*/ if (nest) return 2;
/* * There was a chain-cache miss, and we are about to add a new dependency * to a previous lock. We validate the following rules: * * - would the adding of the <prev> -> <next> dependency create a * circular dependency in the graph? [== circular deadlock] * * - does the new prev->next dependency connect any hardirq-safe lock * (in the full backwards-subgraph starting at <prev>) with any * hardirq-unsafe lock (in the full forwards-subgraph starting at * <next>)? [== illegal lock inversion with hardirq contexts] * * - does the new prev->next dependency connect any softirq-safe lock * (in the full backwards-subgraph starting at <prev>) with any * softirq-unsafe lock (in the full forwards-subgraph starting at * <next>)? [== illegal lock inversion with softirq contexts] * * any of these scenarios could lead to a deadlock. * * Then if all the validations pass, we add the forwards and backwards * dependency.
*/ staticint
check_prev_add(struct task_struct *curr, struct held_lock *prev, struct held_lock *next, u16 distance, struct lock_trace **const trace)
{ struct lock_list *entry; enum bfs_result ret;
if (!hlock_class(prev)->key || !hlock_class(next)->key) { /* * The warning statements below may trigger a use-after-free * of the class name. It is better to trigger a use-after free * and to have the class name most of the time instead of not * having the class name available.
*/
WARN_ONCE(!debug_locks_silent && !hlock_class(prev)->key, "Detected use-after-free of lock class %px/%s\n",
hlock_class(prev),
hlock_class(prev)->name);
WARN_ONCE(!debug_locks_silent && !hlock_class(next)->key, "Detected use-after-free of lock class %px/%s\n",
hlock_class(next),
hlock_class(next)->name); return 2;
}
if (prev->class_idx == next->class_idx) { struct lock_class *class = hlock_class(prev);
if (class->cmp_fn &&
class->cmp_fn(prev->instance, next->instance) < 0) return 2;
}
/* * Prove that the new <prev> -> <next> dependency would not * create a circular dependency in the graph. (We do this by * a breadth-first search into the graph starting at <next>, * and check whether we can reach <prev>.) * * The search is limited by the size of the circular queue (i.e., * MAX_CIRCULAR_QUEUE_SIZE) which keeps track of a breadth of nodes * in the graph whose neighbours are to be checked.
*/
ret = check_noncircular(next, prev, trace); if (unlikely(bfs_error(ret) || ret == BFS_RMATCH)) return 0;
if (!check_irq_usage(curr, prev, next)) return 0;
/* * Is the <prev> -> <next> dependency already present? * * (this may occur even though this is a new chain: consider * e.g. the L1 -> L2 -> L3 -> L4 and the L5 -> L1 -> L2 -> L3 * chains - the second one will be new, but L1 already has * L2 added to its dependency list, due to the first chain.)
*/
list_for_each_entry(entry, &hlock_class(prev)->locks_after, entry) { if (entry->class == hlock_class(next)) { if (distance == 1)
entry->distance = 1;
entry->dep |= calc_dep(prev, next);
/* * Also, update the reverse dependency in @next's * ->locks_before list. * * Here we reuse @entry as the cursor, which is fine * because we won't go to the next iteration of the * outer loop: * * For normal cases, we return in the inner loop. * * If we fail to return, we have inconsistency, i.e. * <prev>::locks_after contains <next> while * <next>::locks_before doesn't contain <prev>. In * that case, we return after the inner and indicate * something is wrong.
*/
list_for_each_entry(entry, &hlock_class(next)->locks_before, entry) { if (entry->class == hlock_class(prev)) { if (distance == 1)
entry->distance = 1;
entry->dep |= calc_depb(prev, next); return 1;
}
}
/* <prev> is not found in <next>::locks_before */ return 0;
}
}
/* * Is the <prev> -> <next> link redundant?
*/
ret = check_redundant(prev, next); if (bfs_error(ret)) return 0; elseif (ret == BFS_RMATCH) return 2;
if (!*trace) {
*trace = save_trace(); if (!*trace) return 0;
}
/* * Ok, all validations passed, add the new lock * to the previous lock's dependency list:
*/
ret = add_lock_to_list(hlock_class(next), hlock_class(prev),
&hlock_class(prev)->locks_after, distance,
calc_dep(prev, next), *trace);
if (!ret) return 0;
ret = add_lock_to_list(hlock_class(prev), hlock_class(next),
&hlock_class(next)->locks_before, distance,
calc_depb(prev, next), *trace); if (!ret) return 0;
return 2;
}
/* * Add the dependency to all directly-previous locks that are 'relevant'. * The ones that are relevant are (in increasing distance from curr): * all consecutive trylock entries and the final non-trylock entry - or * the end of this context's lock-chain - whichever comes first.
*/ staticint
check_prevs_add(struct task_struct *curr, struct held_lock *next)
{ struct lock_trace *trace = NULL; int depth = curr->lockdep_depth; struct held_lock *hlock;
/* * Debugging checks. * * Depth must not be zero for a non-head lock:
*/ if (!depth) goto out_bug; /* * At least two relevant locks must exist for this * to be a head:
*/ if (curr->held_locks[depth].irq_context !=
curr->held_locks[depth-1].irq_context) goto out_bug;
if (hlock->check) { int ret = check_prev_add(curr, hlock, next, distance, &trace); if (!ret) return 0;
/* * Stop after the first non-trylock entry, * as non-trylock entries have added their * own direct dependencies already, so this * lock is connected to them indirectly:
*/ if (!hlock->trylock) break;
}
depth--; /* * End of lock-stack?
*/ if (!depth) break; /* * Stop the search if we cross into another context:
*/ if (curr->held_locks[depth].irq_context !=
curr->held_locks[depth-1].irq_context) break;
} return 1;
out_bug: if (!debug_locks_off_graph_unlock()) return 0;
/* * Clearly we all shouldn't be here, but since we made it we * can reliable say we messed up our state. See the above two * gotos for reasons why we could possibly end up here.
*/
WARN_ON(1);
/* * The first 2 chain_hlocks entries in the chain block in the bucket * list contains the following meta data: * * entry[0]: * Bit 15 - always set to 1 (it is not a class index) * Bits 0-14 - upper 15 bits of the next block index * entry[1] - lower 16 bits of next block index * * A next block index of all 1 bits means it is the end of the list. * * On the unsized bucket (bucket-0), the 3rd and 4th entries contain * the chain block size: * * entry[2] - upper 16 bits of the chain block size * entry[3] - lower 16 bits of the chain block size
*/ #define MAX_CHAIN_BUCKETS 16 #define CHAIN_BLK_FLAG (1U << 15) #define CHAIN_BLK_LIST_END 0xFFFFU
staticint chain_block_buckets[MAX_CHAIN_BUCKETS];
staticinlineint size_to_bucket(int size)
{ if (size > MAX_CHAIN_BUCKETS) return 0;
return size - 1;
}
/* * Iterate all the chain blocks in a bucket.
*/ #define for_each_chain_block(bucket, prev, curr) \ for ((prev) = -1, (curr) = chain_block_buckets[bucket]; \
(curr) >= 0; \
(prev) = (curr), (curr) = chain_block_next(curr))
/* * next block or -1
*/ staticinlineint chain_block_next(int offset)
{ int next = chain_hlocks[offset];
WARN_ON_ONCE(!(next & CHAIN_BLK_FLAG));
if (next == CHAIN_BLK_LIST_END) return -1;
next &= ~CHAIN_BLK_FLAG;
next <<= 16;
next |= chain_hlocks[offset + 1];
staticinlinevoid add_chain_block(int offset, int size)
{ int bucket = size_to_bucket(size); int next = chain_block_buckets[bucket]; int prev, curr;
if (unlikely(size < 2)) { /* * We can't store single entries on the freelist. Leak them. * * One possible way out would be to uniquely mark them, other * than with CHAIN_BLK_FLAG, such that we can recover them when * the block before it is re-added.
*/ if (size)
nr_lost_chain_hlocks++; return;
}
nr_free_chain_hlocks += size; if (!bucket) {
nr_large_chain_blocks++;
/* * Only the first block in the list can be deleted. * * For the variable size bucket[0], the first block (the largest one) is * returned, broken up and put back into the pool. So if a chain block of * length > MAX_CHAIN_BUCKETS is ever used and zapped, it will just be * queued up after the primordial chain block and never be used until the * hlock entries in the primordial chain block is almost used up. That * causes fragmentation and reduce allocation efficiency. That can be * monitored by looking at the "large chain blocks" number in lockdep_stats.
*/ staticinlinevoid del_chain_block(int bucket, int size, int next)
{
nr_free_chain_hlocks -= size;
chain_block_buckets[bucket] = next;
if (!bucket)
nr_large_chain_blocks--;
}
staticvoid init_chain_block_buckets(void)
{ int i;
for (i = 0; i < MAX_CHAIN_BUCKETS; i++)
chain_block_buckets[i] = -1;
add_chain_block(0, ARRAY_SIZE(chain_hlocks));
}
/* * Return offset of a chain block of the right size or -1 if not found. * * Fairly simple worst-fit allocator with the addition of a number of size * specific free lists.
*/ staticint alloc_chain_hlocks(int req)
{ int bucket, curr, size;
/* * We rely on the MSB to act as an escape bit to denote freelist * pointers. Make sure this bit isn't set in 'normal' class_idx usage.
*/
BUILD_BUG_ON((MAX_LOCKDEP_KEYS-1) & CHAIN_BLK_FLAG);
init_data_structures_once();
if (nr_free_chain_hlocks < req) return -1;
/* * We require a minimum of 2 (u16) entries to encode a freelist * 'pointer'.
*/
req = max(req, 2);
bucket = size_to_bucket(req);
curr = chain_block_buckets[bucket];
/* * The variable sized freelist is sorted by size; the first entry is * the largest. Use it if it fits.
*/ if (curr >= 0) {
size = chain_block_size(curr); if (likely(size >= req)) {
del_chain_block(0, size, chain_block_next(curr)); if (size > req)
add_chain_block(curr + req, size - req); return curr;
}
}
/* * Last resort, split a block in a larger sized bucket.
*/ for (size = MAX_CHAIN_BUCKETS; size > req; size--) {
bucket = size_to_bucket(size);
curr = chain_block_buckets[bucket]; if (curr < 0) continue;
/* * Returns the index of the first held_lock of the current chain
*/ staticinlineint get_first_held_lock(struct task_struct *curr, struct held_lock *hlock)
{ int i; struct held_lock *hlock_curr;
for (i = curr->lockdep_depth - 1; i >= 0; i--) {
hlock_curr = curr->held_locks + i; if (hlock_curr->irq_context != hlock->irq_context) break;
pr_warn("Locks in cached chain:");
print_chain_keys_chain(chain);
pr_warn("\nstack backtrace:\n");
dump_stack();
nbcon_cpu_emergency_exit();
} #endif
/* * Checks whether the chain and the current held locks are consistent * in depth and also in content. If they are not it most likely means * that there was a collision during the calculation of the chain_key. * Returns: 0 not passed, 1 passed
*/ staticint check_no_collision(struct task_struct *curr, struct held_lock *hlock, struct lock_chain *chain)
{ #ifdef CONFIG_DEBUG_LOCKDEP int i, j, id;
i = get_first_held_lock(curr, hlock);
if (DEBUG_LOCKS_WARN_ON(chain->depth != curr->lockdep_depth - (i - 1))) {
print_collision(curr, hlock, chain); return 0;
}
for (j = 0; j < chain->depth - 1; j++, i++) {
id = hlock_id(&curr->held_locks[i]);
/* * Given an index that is >= -1, return the index of the next lock chain. * Return -2 if there is no next lock chain.
*/ long lockdep_next_lockchain(long i)
{
i = find_next_bit(lock_chains_in_use, ARRAY_SIZE(lock_chains), i + 1); return i < ARRAY_SIZE(lock_chains) ? i : -2;
}
/* Must be called with the graph lock held. */ staticstruct lock_chain *alloc_lock_chain(void)
{ int idx = find_first_zero_bit(lock_chains_in_use,
ARRAY_SIZE(lock_chains));
/* * Adds a dependency chain into chain hashtable. And must be called with * graph_lock held. * * Return 0 if fail, and graph_lock is released. * Return 1 if succeed, with graph_lock held.
*/ staticinlineint add_chain_cache(struct task_struct *curr, struct held_lock *hlock,
u64 chain_key)
{ struct hlist_head *hash_head = chainhashentry(chain_key); struct lock_chain *chain; int i, j;
/* * The caller must hold the graph lock, ensure we've got IRQs * disabled to make this an IRQ-safe lock.. for recursion reasons * lockdep won't complain about its own locking errors.
*/ if (lockdep_assert_locked()) return 0;
chain = alloc_lock_chain(); if (!chain) { if (!debug_locks_off_graph_unlock()) return 0;
/* * Look up a dependency chain. Must be called with either the graph lock or * the RCU read lock held.
*/ staticinlinestruct lock_chain *lookup_chain_cache(u64 chain_key)
{ struct hlist_head *hash_head = chainhashentry(chain_key); struct lock_chain *chain;
/* * If the key is not present yet in dependency chain cache then * add it and return 1 - in this case the new dependency chain is * validated. If the key is already hashed, return 0. * (On return with 1 graph_lock is held.)
*/ staticinlineint lookup_chain_cache_add(struct task_struct *curr, struct held_lock *hlock,
u64 chain_key)
{ struct lock_class *class = hlock_class(hlock); struct lock_chain *chain = lookup_chain_cache(chain_key);
if (chain) {
cache_hit: if (!check_no_collision(curr, hlock, chain)) return 0;
/* * We have to walk the chain again locked - to avoid duplicates:
*/
chain = lookup_chain_cache(chain_key); if (chain) {
graph_unlock(); goto cache_hit;
}
if (!add_chain_cache(curr, hlock, chain_key)) return 0;
return 1;
}
staticint validate_chain(struct task_struct *curr, struct held_lock *hlock, int chain_head, u64 chain_key)
{ /* * Trylock needs to maintain the stack of held locks, but it * does not add new dependencies, because trylock can be done * in any order. * * We look up the chain_key and do the O(N^2) check and update of * the dependencies only if this is a new dependency chain. * (If lookup_chain_cache_add() return with 1 it acquires * graph_lock for us)
*/ if (!hlock->trylock && hlock->check &&
lookup_chain_cache_add(curr, hlock, chain_key)) { /* * Check whether last held lock: * * - is irq-safe, if this lock is irq-unsafe * - is softirq-safe, if this lock is hardirq-unsafe * * And check whether the new lock's dependency graph * could lead back to the previous lock: * * - within the current held-lock stack * - across our accumulated lock dependency records * * any of these scenarios could lead to a deadlock.
*/ /* * The simple case: does the current hold the same lock * already?
*/ int ret = check_deadlock(curr, hlock);
if (!ret) return 0; /* * Add dependency only if this lock is not the head * of the chain, and if the new lock introduces no more * lock dependency (because we already hold a lock with the * same lock class) nor deadlock (because the nest_lock * serializes nesting locks), see the comments for * check_deadlock().
*/ if (!chain_head && ret != 2) { if (!check_prevs_add(curr, hlock)) return 0;
}
graph_unlock();
} else { /* after lookup_chain_cache_add(): */ if (unlikely(!debug_locks)) return 0;
}
/* * We are building curr_chain_key incrementally, so double-check * it from scratch, to make sure that it's done correctly:
*/ staticvoid check_chain_key(struct task_struct *curr)
{ #ifdef CONFIG_DEBUG_LOCKDEP struct held_lock *hlock, *prev_hlock = NULL; unsignedint i;
u64 chain_key = INITIAL_CHAIN_KEY;
for (i = 0; i < curr->lockdep_depth; i++) {
hlock = curr->held_locks + i; if (chain_key != hlock->prev_chain_key) {
debug_locks_off(); /* * We got mighty confused, our chain keys don't match * with what we expect, someone trample on our task state?
*/
WARN(1, "hm#1, depth: %u [%u], %016Lx != %016Lx\n",
curr->lockdep_depth, i,
(unsignedlonglong)chain_key,
(unsignedlonglong)hlock->prev_chain_key); return;
}
/* * hlock->class_idx can't go beyond MAX_LOCKDEP_KEYS, but is * it registered lock class index?
*/ if (DEBUG_LOCKS_WARN_ON(!test_bit(hlock->class_idx, lock_classes_in_use))) return;
if (prev_hlock && (prev_hlock->irq_context !=
hlock->irq_context))
chain_key = INITIAL_CHAIN_KEY;
chain_key = iterate_chain_key(chain_key, hlock_id(hlock));
prev_hlock = hlock;
} if (chain_key != curr->curr_chain_key) {
debug_locks_off(); /* * More smoking hash instead of calculating it, damn see these * numbers float.. I bet that a pink elephant stepped on my memory.
*/
WARN(1, "hm#2, depth: %u [%u], %016Lx != %016Lx\n",
curr->lockdep_depth, i,
(unsignedlonglong)chain_key,
(unsignedlonglong)curr->curr_chain_key);
} #endif
}
if (!debug_locks_off_graph_unlock() || debug_locks_silent) return;
nbcon_cpu_emergency_enter();
pr_warn("\n");
pr_warn("========================================================\n");
pr_warn("WARNING: possible irq lock inversion dependency detected\n");
print_kernel_ident();
pr_warn("--------------------------------------------------------\n");
pr_warn("%s/%d just changed the state of lock:\n",
curr->comm, task_pid_nr(curr));
print_lock(this); if (forwards)
pr_warn("but this lock took another, %s-unsafe lock in the past:\n", irqclass); else
pr_warn("but this lock was taken by another, %s-safe lock in the past:\n", irqclass);
print_lock_name(NULL, other->class);
pr_warn("\n\nand interrupts could create inverse lock ordering between them.\n\n");
pr_warn("\nother info that might help us debug this:\n");
/* Find a middle lock (if one exists) */
depth = get_lock_depth(other); do { if (depth == 0 && (entry != root)) {
pr_warn("lockdep:%s bad path found in chain graph\n", __func__); break;
}
middle = entry;
entry = get_lock_parent(entry);
depth--;
} while (entry && entry != root && (depth >= 0)); if (forwards)
print_irq_lock_scenario(root, other,
middle ? middle->class : root->class, other->class); else
print_irq_lock_scenario(other, root,
middle ? middle->class : other->class, root->class);
lockdep_print_held_locks(curr);
pr_warn("\nthe shortest dependencies between 2nd lock and 1st lock:\n");
root->trace = save_trace(); if (!root->trace) goto out;
print_shortest_lock_dependencies(other, root);
staticint
mark_lock_irq(struct task_struct *curr, struct held_lock *this, enum lock_usage_bit new_bit)
{ int excl_bit = exclusive_bit(new_bit); int read = new_bit & LOCK_USAGE_READ_MASK; int dir = new_bit & LOCK_USAGE_DIR_MASK;
/* * Validate that this particular lock does not have conflicting * usage states.
*/ if (!valid_state(curr, this, new_bit, excl_bit)) return 0;
/* * Check for read in write conflicts
*/ if (!read && !valid_state(curr, this, new_bit,
excl_bit + LOCK_USAGE_READ_MASK)) return 0;
/* * Validate that the lock dependencies don't have conflicting usage * states.
*/ if (dir) { /* * mark ENABLED has to look backwards -- to ensure no dependee * has USED_IN state, which, again, would allow recursion deadlocks.
*/ if (!check_usage_backwards(curr, this, excl_bit)) return 0;
} else { /* * mark USED_IN has to look forwards -- to ensure no dependency * has ENABLED state, which would allow recursion deadlocks.
*/ if (!check_usage_forwards(curr, this, excl_bit)) return 0;
}
if (state_verbose(new_bit, hlock_class(this))) return 2;
return 1;
}
/* * Mark all held locks with a usage bit:
*/ staticint
mark_held_locks(struct task_struct *curr, enum lock_usage_bit base_bit)
{ struct held_lock *hlock; int i;
for (i = 0; i < curr->lockdep_depth; i++) { enum lock_usage_bit hlock_bit = base_bit;
hlock = curr->held_locks + i;
if (hlock->read)
hlock_bit += LOCK_USAGE_READ_MASK;
BUG_ON(hlock_bit >= LOCK_USAGE_STATES);
if (!hlock->check) continue;
if (!mark_lock(curr, hlock, hlock_bit)) return 0;
}
return 1;
}
/* * Hardirqs will be enabled:
*/ staticvoid __trace_hardirqs_on_caller(void)
{ struct task_struct *curr = current;
/* * We are going to turn hardirqs on, so set the * usage bit for all held locks:
*/ if (!mark_held_locks(curr, LOCK_ENABLED_HARDIRQ)) return; /* * If we have softirqs enabled, then set the usage * bit for all held locks. (disabled hardirqs prevented * this bit from being set before)
*/ if (curr->softirqs_enabled)
mark_held_locks(curr, LOCK_ENABLED_SOFTIRQ);
}
/** * lockdep_hardirqs_on_prepare - Prepare for enabling interrupts * * Invoked before a possible transition to RCU idle from exit to user or * guest mode. This ensures that all RCU operations are done before RCU * stops watching. After the RCU transition lockdep_hardirqs_on() has to be * invoked to set the final state.
*/ void lockdep_hardirqs_on_prepare(void)
{ if (unlikely(!debug_locks)) return;
/* * NMIs do not (and cannot) track lock dependencies, nothing to do.
*/ if (unlikely(in_nmi())) return;
if (unlikely(this_cpu_read(lockdep_recursion))) return;
if (unlikely(lockdep_hardirqs_enabled())) { /* * Neither irq nor preemption are disabled here * so this is racy by nature but losing one hit * in a stat is not a big deal.
*/
__debug_atomic_inc(redundant_hardirqs_on); return;
}
/* * We're enabling irqs and according to our state above irqs weren't * already enabled, yet we find the hardware thinks they are in fact * enabled.. someone messed up their IRQ state tracing.
*/ if (DEBUG_LOCKS_WARN_ON(!irqs_disabled())) return;
/* * See the fine text that goes along with this variable definition.
*/ if (DEBUG_LOCKS_WARN_ON(early_boot_irqs_disabled)) return;
/* * Can't allow enabling interrupts while in an interrupt handler, * that's general bad form and such. Recursion, limited stack etc..
*/ if (DEBUG_LOCKS_WARN_ON(lockdep_hardirq_context())) return;
/* * NMIs can happen in the middle of local_irq_{en,dis}able() where the * tracking state and hardware state are out of sync. * * NMIs must save lockdep_hardirqs_enabled() to restore IRQ state from, * and not rely on hardware state like normal interrupts.
*/ if (unlikely(in_nmi())) { if (!IS_ENABLED(CONFIG_TRACE_IRQFLAGS_NMI)) return;
/* * Skip: * - recursion check, because NMI can hit lockdep; * - hardware state check, because above; * - chain_key check, see lockdep_hardirqs_on_prepare().
*/ goto skip_checks;
}
if (unlikely(this_cpu_read(lockdep_recursion))) return;
if (lockdep_hardirqs_enabled()) { /* * Neither irq nor preemption are disabled here * so this is racy by nature but losing one hit * in a stat is not a big deal.
*/
__debug_atomic_inc(redundant_hardirqs_on); return;
}
/* * We're enabling irqs and according to our state above irqs weren't * already enabled, yet we find the hardware thinks they are in fact * enabled.. someone messed up their IRQ state tracing.
*/ if (DEBUG_LOCKS_WARN_ON(!irqs_disabled())) return;
/* * Ensure the lock stack remained unchanged between * lockdep_hardirqs_on_prepare() and lockdep_hardirqs_on().
*/
DEBUG_LOCKS_WARN_ON(current->hardirq_chain_key !=
current->curr_chain_key);
skip_checks: /* we'll do an OFF -> ON transition: */
__this_cpu_write(hardirqs_enabled, 1);
trace->hardirq_enable_ip = ip;
trace->hardirq_enable_event = ++trace->irq_events;
debug_atomic_inc(hardirqs_on_events);
}
EXPORT_SYMBOL_GPL(lockdep_hardirqs_on);
/* * Hardirqs were disabled:
*/ void noinstr lockdep_hardirqs_off(unsignedlong ip)
{ if (unlikely(!debug_locks)) return;
/* * Matching lockdep_hardirqs_on(), allow NMIs in the middle of lockdep; * they will restore the software state. This ensures the software * state is consistent inside NMIs as well.
*/ if (in_nmi()) { if (!IS_ENABLED(CONFIG_TRACE_IRQFLAGS_NMI)) return;
} elseif (__this_cpu_read(lockdep_recursion)) return;
/* * So we're supposed to get called after you mask local IRQs, but for * some reason the hardware doesn't quite think you did a proper job.
*/ if (DEBUG_LOCKS_WARN_ON(!irqs_disabled())) return;
if (lockdep_hardirqs_enabled()) { struct irqtrace_events *trace = ¤t->irqtrace;
/* * We have done an ON -> OFF transition:
*/
__this_cpu_write(hardirqs_enabled, 0);
trace->hardirq_disable_ip = ip;
trace->hardirq_disable_event = ++trace->irq_events;
debug_atomic_inc(hardirqs_off_events);
} else {
debug_atomic_inc(redundant_hardirqs_off);
}
}
EXPORT_SYMBOL_GPL(lockdep_hardirqs_off);
/* * Softirqs will be enabled:
*/ void lockdep_softirqs_on(unsignedlong ip)
{ struct irqtrace_events *trace = ¤t->irqtrace;
if (unlikely(!lockdep_enabled())) return;
/* * We fancy IRQs being disabled here, see softirq.c, avoids * funny state and nesting things.
*/ if (DEBUG_LOCKS_WARN_ON(!irqs_disabled())) return;
if (current->softirqs_enabled) {
debug_atomic_inc(redundant_softirqs_on); return;
}
lockdep_recursion_inc(); /* * We'll do an OFF -> ON transition:
*/
current->softirqs_enabled = 1;
trace->softirq_enable_ip = ip;
trace->softirq_enable_event = ++trace->irq_events;
debug_atomic_inc(softirqs_on_events); /* * We are going to turn softirqs on, so set the * usage bit for all held locks, if hardirqs are * enabled too:
*/ if (lockdep_hardirqs_enabled())
mark_held_locks(current, LOCK_ENABLED_SOFTIRQ);
lockdep_recursion_finish();
}
/* * Softirqs were disabled:
*/ void lockdep_softirqs_off(unsignedlong ip)
{ if (unlikely(!lockdep_enabled())) return;
/* * We fancy IRQs being disabled here, see softirq.c
*/ if (DEBUG_LOCKS_WARN_ON(!irqs_disabled())) return;
if (current->softirqs_enabled) { struct irqtrace_events *trace = ¤t->irqtrace;
/* * We have done an ON -> OFF transition:
*/
current->softirqs_enabled = 0;
trace->softirq_disable_ip = ip;
trace->softirq_disable_event = ++trace->irq_events;
debug_atomic_inc(softirqs_off_events); /* * Whoops, we wanted softirqs off, so why aren't they?
*/
DEBUG_LOCKS_WARN_ON(!softirq_count());
} else
debug_atomic_inc(redundant_softirqs_off);
}
/** * lockdep_cleanup_dead_cpu - Ensure CPU lockdep state is cleanly stopped * * @cpu: index of offlined CPU * @idle: task pointer for offlined CPU's idle thread * * Invoked after the CPU is dead. Ensures that the tracing infrastructure * is left in a suitable state for the CPU to be subsequently brought * online again.
*/ void lockdep_cleanup_dead_cpu(unsignedint cpu, struct task_struct *idle)
{ if (unlikely(!debug_locks)) return;
if (unlikely(per_cpu(hardirqs_enabled, cpu))) {
pr_warn("CPU %u left hardirqs enabled!", cpu); if (idle)
print_irqtrace_events(idle); /* Clean it up for when the CPU comes online again. */
per_cpu(hardirqs_enabled, cpu) = 0;
}
}
staticint
mark_usage(struct task_struct *curr, struct held_lock *hlock, int check)
{ if (!check) goto lock_used;
/* * If non-trylock use in a hardirq or softirq context, then * mark the lock as used in these contexts:
*/ if (!hlock->trylock) { if (hlock->read) { if (lockdep_hardirq_context()) if (!mark_lock(curr, hlock,
LOCK_USED_IN_HARDIRQ_READ)) return 0; if (curr->softirq_context) if (!mark_lock(curr, hlock,
LOCK_USED_IN_SOFTIRQ_READ)) return 0;
} else { if (lockdep_hardirq_context()) if (!mark_lock(curr, hlock, LOCK_USED_IN_HARDIRQ)) return 0; if (curr->softirq_context) if (!mark_lock(curr, hlock, LOCK_USED_IN_SOFTIRQ)) return 0;
}
}
/* * For lock_sync(), don't mark the ENABLED usage, since lock_sync() * creates no critical section and no extra dependency can be introduced * by interrupts
*/ if (!hlock->hardirqs_off && !hlock->sync) { if (hlock->read) { if (!mark_lock(curr, hlock,
LOCK_ENABLED_HARDIRQ_READ)) return 0; if (curr->softirqs_enabled) if (!mark_lock(curr, hlock,
LOCK_ENABLED_SOFTIRQ_READ)) return 0;
} else { if (!mark_lock(curr, hlock,
LOCK_ENABLED_HARDIRQ)) return 0; if (curr->softirqs_enabled) if (!mark_lock(curr, hlock,
LOCK_ENABLED_SOFTIRQ)) return 0;
}
}
lock_used: /* mark it as used: */ if (!mark_lock(curr, hlock, LOCK_USED)) return 0;
/* * Keep track of points where we cross into an interrupt context:
*/ if (depth) { struct held_lock *prev_hlock;
prev_hlock = curr->held_locks + depth-1; /* * If we cross into another context, reset the * hash key (this also prevents the checking and the * adding of the dependency to 'prev'):
*/ if (prev_hlock->irq_context != hlock->irq_context) return 1;
} return 0;
}
/* * Mark a lock with a usage bit, and validate the state transition:
*/ staticint mark_lock(struct task_struct *curr, struct held_lock *this, enum lock_usage_bit new_bit)
{ unsignedint new_mask, ret = 1;
if (new_bit >= LOCK_USAGE_STATES) {
DEBUG_LOCKS_WARN_ON(1); return 0;
}
if (new_bit == LOCK_USED && this->read)
new_bit = LOCK_USED_READ;
new_mask = 1 << new_bit;
/* * If already set then do not dirty the cacheline, * nor do any checks:
*/ if (likely(hlock_class(this)->usage_mask & new_mask)) return 1;
if (!graph_lock()) return 0; /* * Make sure we didn't race:
*/ if (unlikely(hlock_class(this)->usage_mask & new_mask)) goto unlock;
if (!hlock_class(this)->usage_mask)
debug_atomic_dec(nr_unused_locks);
hlock_class(this)->usage_mask |= new_mask;
if (new_bit < LOCK_TRACE_STATES) { if (!(hlock_class(this)->usage_traces[new_bit] = save_trace())) return 0;
}
if (new_bit < LOCK_USED) {
ret = mark_lock_irq(curr, this, new_bit); if (!ret) return 0;
}
unlock:
graph_unlock();
/* * We must printk outside of the graph_lock:
*/ if (ret == 2) {
nbcon_cpu_emergency_enter();
printk("\nmarked lock as {%s}:\n", usage_str[new_bit]);
print_lock(this);
print_irqtrace_events(curr);
dump_stack();
nbcon_cpu_emergency_exit();
}
return ret;
}
staticinlineshort task_wait_context(struct task_struct *curr)
{ /* * Set appropriate wait type for the context; for IRQs we have to take * into account force_irqthread as that is implied by PREEMPT_RT.
*/ if (lockdep_hardirq_context()) { /* * Check if force_irqthreads will run us threaded.
*/ if (curr->hardirq_threaded || curr->irq_config) return LD_WAIT_CONFIG;
/* * Verify the wait_type context. * * This check validates we take locks in the right wait-type order; that is it * ensures that we do not take mutexes inside spinlocks and do not attempt to * acquire spinlocks inside raw_spinlocks and the sort. * * The entire thing is slightly more complex because of RCU, RCU is a lock that * can be taken from (pretty much) any context but also has constraints. * However when taken in a stricter environment the RCU lock does not loosen * the constraints. * * Therefore we must look for the strictest environment in the lock stack and * compare that to the lock we're trying to acquire.
*/ staticint check_wait_context(struct task_struct *curr, struct held_lock *next)
{
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) return 0;
if (!next_outer)
next_outer = next_inner;
/* * Find start of current irq_context..
*/ for (depth = curr->lockdep_depth - 1; depth >= 0; depth--) { struct held_lock *prev = curr->held_locks + depth; if (prev->irq_context != next->irq_context) break;
}
depth++;
if (prev_inner) { /* * We can have a bigger inner than a previous one * when outer is smaller than inner, as with RCU. * * Also due to trylocks.
*/
curr_inner = min(curr_inner, prev_inner);
/* * Allow override for annotations -- this is typically * only valid/needed for code that only exists when * CONFIG_PREEMPT_RT=n.
*/ if (unlikely(class->lock_type == LD_LOCK_WAIT_OVERRIDE))
curr_inner = prev_inner;
}
}
if (next_outer > curr_inner) return print_lock_invalid_wait_context(curr, next);
/* * No key, no joy, we need to hash something.
*/ if (DEBUG_LOCKS_WARN_ON(!key)) return; /* * Sanity check, the lock-class key must either have been allocated * statically or must have been registered as a dynamic key.
*/ if (!static_obj(key) && !is_dynamic_key(key)) { if (debug_locks)
printk(KERN_ERR "BUG: key %px has not been registered!\n", key);
DEBUG_LOCKS_WARN_ON(1); return;
}
lock->key = key;
if (unlikely(!debug_locks)) return;
if (subclass) { unsignedlong flags;
if (DEBUG_LOCKS_WARN_ON(!lockdep_enabled())) return;
staticvoid
print_lock_nested_lock_not_held(struct task_struct *curr, struct held_lock *hlock)
{ if (!debug_locks_off()) return; if (debug_locks_silent) return;
nbcon_cpu_emergency_enter();
pr_warn("\n");
pr_warn("==================================\n");
pr_warn("WARNING: Nested lock was not taken\n");
print_kernel_ident();
pr_warn("----------------------------------\n");
pr_warn("%s/%d is trying to lock:\n", curr->comm, task_pid_nr(curr));
print_lock(hlock);
pr_warn("\nbut this task is not holding:\n");
pr_warn("%s\n", hlock->nest_lock->name);
pr_warn("\nstack backtrace:\n");
dump_stack();
pr_warn("\nother info that might help us debug this:\n");
lockdep_print_held_locks(curr);
pr_warn("\nstack backtrace:\n");
dump_stack();
nbcon_cpu_emergency_exit();
}
staticint __lock_is_held(conststruct lockdep_map *lock, int read);
/* * This gets called for every mutex_lock*()/spin_lock*() operation. * We maintain the dependency maps and validate the locking attempt: * * The callers must make sure that IRQs are disabled before calling it, * otherwise we could get an interrupt which would want to take locks, * which would end up in lockdep again.
*/ staticint __lock_acquire(struct lockdep_map *lock, unsignedint subclass, int trylock, int read, int check, int hardirqs_off, struct lockdep_map *nest_lock, unsignedlong ip, int references, int pin_count, int sync)
{ struct task_struct *curr = current; struct lock_class *class = NULL; struct held_lock *hlock; unsignedint depth; int chain_head = 0; int class_idx;
u64 chain_key;
if (unlikely(!debug_locks)) return 0;
if (unlikely(lock->key == &__lockdep_no_track__)) return 0;
if (DEBUG_LOCKS_WARN_ON(subclass >= MAX_LOCKDEP_SUBCLASSES)) return 0;
if (subclass < NR_LOCKDEP_CACHING_CLASSES) class = lock->class_cache[subclass]; /* * Not cached?
*/ if (unlikely(!class)) { class = register_lock_class(lock, subclass, 0); if (!class) return 0;
}
debug_class_ops_inc(class);
if (very_verbose(class)) {
nbcon_cpu_emergency_enter();
printk("\nacquire class [%px] %s", class->key, class->name); if (class->name_version > 1)
printk(KERN_CONT "#%d", class->name_version);
printk(KERN_CONT "\n");
dump_stack();
nbcon_cpu_emergency_exit();
}
/* * Add the lock to the list of currently held locks. * (we dont increase the depth just yet, up until the * dependency checks are done)
*/
depth = curr->lockdep_depth; /* * Ran out of static storage for our per-task lock stack again have we?
*/ if (DEBUG_LOCKS_WARN_ON(depth >= MAX_LOCK_DEPTH)) return 0;
class_idx = class - lock_classes;
if (depth && !sync) { /* we're holding locks and the new held lock is not a sync */
hlock = curr->held_locks + depth - 1; if (hlock->class_idx == class_idx && nest_lock) { if (!references)
references++;
if (!hlock->references)
hlock->references++;
hlock->references += references;
/* Overflow */ if (DEBUG_LOCKS_WARN_ON(hlock->references < references)) return 0;
return 2;
}
}
hlock = curr->held_locks + depth; /* * Plain impossible, we just registered it and checked it weren't no * NULL like.. I bet this mushroom I ate was good!
*/ if (DEBUG_LOCKS_WARN_ON(!class)) return 0;
hlock->class_idx = class_idx;
hlock->acquire_ip = ip;
hlock->instance = lock;
hlock->nest_lock = nest_lock;
hlock->irq_context = task_irq_context(curr);
hlock->trylock = trylock;
hlock->read = read;
hlock->check = check;
hlock->sync = !!sync;
hlock->hardirqs_off = !!hardirqs_off;
hlock->references = references; #ifdef CONFIG_LOCK_STAT
hlock->waittime_stamp = 0;
hlock->holdtime_stamp = lockstat_clock(); #endif
hlock->pin_count = pin_count;
if (check_wait_context(curr, hlock)) return 0;
/* Initialize the lock usage bit */ if (!mark_usage(curr, hlock, check)) return 0;
/* * Calculate the chain hash: it's the combined hash of all the * lock keys along the dependency chain. We save the hash value * at every step so that we can get the current hash easily * after unlock. The chain hash is then used to cache dependency * results. * * The 'key ID' is what is the most compact key value to drive * the hash, not class->key.
*/ /* * Whoops, we did it again.. class_idx is invalid.
*/ if (DEBUG_LOCKS_WARN_ON(!test_bit(class_idx, lock_classes_in_use))) return 0;
chain_key = curr->curr_chain_key; if (!depth) { /* * How can we have a chain hash when we ain't got no keys?!
*/ if (DEBUG_LOCKS_WARN_ON(chain_key != INITIAL_CHAIN_KEY)) return 0;
chain_head = 1;
}
if (unlikely(curr->lockdep_depth > max_lockdep_depth))
max_lockdep_depth = curr->lockdep_depth;
return 1;
}
staticvoid print_unlock_imbalance_bug(struct task_struct *curr, struct lockdep_map *lock, unsignedlong ip)
{ if (!debug_locks_off()) return; if (debug_locks_silent) return;
nbcon_cpu_emergency_enter();
pr_warn("\n");
pr_warn("=====================================\n");
pr_warn("WARNING: bad unlock balance detected!\n");
print_kernel_ident();
pr_warn("-------------------------------------\n");
pr_warn("%s/%d is trying to release lock (",
curr->comm, task_pid_nr(curr));
print_lockdep_cache(lock);
pr_cont(") at:\n");
print_ip_sym(KERN_WARNING, ip);
pr_warn("but there are no more locks to release!\n");
pr_warn("\nother info that might help us debug this:\n");
lockdep_print_held_locks(curr);
pr_warn("\nstack backtrace:\n");
dump_stack();
nbcon_cpu_emergency_exit();
}
static noinstr int match_held_lock(conststruct held_lock *hlock, conststruct lockdep_map *lock)
{ if (hlock->instance == lock) return 1;
if (hlock->references) { conststruct lock_class *class = lock->class_cache[0];
if (!class) class = look_up_lock_class(lock, 0);
/* * If look_up_lock_class() failed to find a class, we're trying * to test if we hold a lock that has never yet been acquired. * Clearly if the lock hasn't been acquired _ever_, we're not * holding it either, so report failure.
*/ if (!class) return 0;
/* * References, but not a lock we're actually ref-counting? * State got messed up, follow the sites that change ->references * and try to make sense of it.
*/ if (DEBUG_LOCKS_WARN_ON(!hlock->nest_lock)) return 0;
if (hlock->class_idx == class - lock_classes) return 1;
}
return 0;
}
/* @depth must not be zero */ staticstruct held_lock *find_held_lock(struct task_struct *curr, struct lockdep_map *lock, unsignedint depth, int *idx)
{ struct held_lock *ret, *hlock, *prev_hlock; int i;
i = depth - 1;
hlock = curr->held_locks + i;
ret = hlock; if (match_held_lock(hlock, lock)) goto out;
ret = NULL; for (i--, prev_hlock = hlock--;
i >= 0;
i--, prev_hlock = hlock--) { /* * We must not cross into another context:
*/ if (prev_hlock->irq_context != hlock->irq_context) {
ret = NULL; break;
} if (match_held_lock(hlock, lock)) {
ret = hlock; break;
}
}
out:
*idx = i; return ret;
}
staticint reacquire_held_locks(struct task_struct *curr, unsignedint depth, int idx, unsignedint *merged)
{ struct held_lock *hlock; int first_idx = idx;
if (DEBUG_LOCKS_WARN_ON(!irqs_disabled())) return 0;
depth = curr->lockdep_depth; /* * This function is about (re)setting the class of a held lock, * yet we're not actually holding any locks. Naughty user!
*/ if (DEBUG_LOCKS_WARN_ON(!depth)) return 0;
if (reacquire_held_locks(curr, depth, i, &merged)) return 0;
/* * I took it apart and put it back together again, except now I have * these 'spare' parts.. where shall I put them.
*/ if (DEBUG_LOCKS_WARN_ON(curr->lockdep_depth != depth - merged)) return 0; return 1;
}
depth = curr->lockdep_depth; /* * This function is about (re)setting the class of a held lock, * yet we're not actually holding any locks. Naughty user!
*/ if (DEBUG_LOCKS_WARN_ON(!depth)) return 0;
if (reacquire_held_locks(curr, depth, i, &merged)) return 0;
/* Merging can't happen with unchanged classes.. */ if (DEBUG_LOCKS_WARN_ON(merged)) return 0;
/* * I took it apart and put it back together again, except now I have * these 'spare' parts.. where shall I put them.
*/ if (DEBUG_LOCKS_WARN_ON(curr->lockdep_depth != depth)) return 0;
return 1;
}
/* * Remove the lock from the list of currently held locks - this gets * called on mutex_unlock()/spin_unlock*() (or on a failed * mutex_lock_interruptible()).
*/ staticint
__lock_release(struct lockdep_map *lock, unsignedlong ip)
{ struct task_struct *curr = current; unsignedint depth, merged = 1; struct held_lock *hlock; int i;
if (unlikely(!debug_locks)) return 0;
depth = curr->lockdep_depth; /* * So we're all set to release this lock.. wait what lock? We don't * own any locks, you've been drinking again?
*/ if (depth <= 0) {
print_unlock_imbalance_bug(curr, lock, ip); return 0;
}
/* * Check whether the lock exists in the current stack * of held locks:
*/
hlock = find_held_lock(curr, lock, depth, &i); if (!hlock) {
print_unlock_imbalance_bug(curr, lock, ip); return 0;
}
if (hlock->instance == lock)
lock_release_holdtime(hlock);
WARN(hlock->pin_count, "releasing a pinned lock\n");
if (hlock->references) {
hlock->references--; if (hlock->references) { /* * We had, and after removing one, still have * references, the current lock stack is still * valid. We're done!
*/ return 1;
}
}
/* * We have the right lock to unlock, 'hlock' points to it. * Now we remove it from the stack, and add back the other * entries (if any), recalculating the hash along the way:
*/
/* * The most likely case is when the unlock is on the innermost * lock. In this case, we are done!
*/ if (i == depth-1) return 1;
if (reacquire_held_locks(curr, depth, i + 1, &merged)) return 0;
/* * We had N bottles of beer on the wall, we drank one, but now * there's not N-1 bottles of beer left on the wall... * Pouring two of the bottles together is acceptable.
*/
DEBUG_LOCKS_WARN_ON(curr->lockdep_depth != depth - merged);
/* * Since reacquire_held_locks() would have called check_chain_key() * indirectly via __lock_acquire(), we don't need to do it again * on return.
*/ return 0;
}
static __always_inline int __lock_is_held(conststruct lockdep_map *lock, int read)
{ struct task_struct *curr = current; int i;
for (i = 0; i < curr->lockdep_depth; i++) { struct held_lock *hlock = curr->held_locks + i;
if (match_held_lock(hlock, lock)) { if (read == -1 || !!hlock->read == read) return LOCK_STATE_HELD;
for (i = 0; i < curr->lockdep_depth; i++) { struct held_lock *hlock = curr->held_locks + i;
if (match_held_lock(hlock, lock)) { /* * Grab 16bits of randomness; this is sufficient to not * be guessable and still allows some pin nesting in * our u32 pin_count.
*/
cookie.val = 1 + (sched_clock() & 0xffff);
hlock->pin_count += cookie.val; return cookie;
}
}
WARN(1, "pinning an unheld lock\n"); return cookie;
}
for (i = 0; i < curr->lockdep_depth; i++) { struct held_lock *hlock = curr->held_locks + i;
if (match_held_lock(hlock, lock)) { if (WARN(!hlock->pin_count, "unpinning an unpinned lock\n")) return;
hlock->pin_count -= cookie.val;
if (WARN((int)hlock->pin_count < 0, "pin count corrupted\n"))
hlock->pin_count = 0;
return;
}
}
WARN(1, "unpinning an unheld lock\n");
}
/* * Check whether we follow the irq-flags state precisely:
*/ static noinstr void check_flags(unsignedlong flags)
{ #ifdefined(CONFIG_PROVE_LOCKING) && defined(CONFIG_DEBUG_LOCKDEP) if (!debug_locks) return;
/* Get the warning out.. */
instrumentation_begin();
if (irqs_disabled_flags(flags)) { if (DEBUG_LOCKS_WARN_ON(lockdep_hardirqs_enabled())) {
printk("possible reason: unannotated irqs-off.\n");
}
} else { if (DEBUG_LOCKS_WARN_ON(!lockdep_hardirqs_enabled())) {
printk("possible reason: unannotated irqs-on.\n");
}
}
#ifndef CONFIG_PREEMPT_RT /* * We dont accurately track softirq state in e.g. * hardirq contexts (such as on 4KSTACKS), so only * check if not in hardirq contexts:
*/ if (!hardirq_count()) { if (softirq_count()) { /* like the above, but with softirqs */
DEBUG_LOCKS_WARN_ON(current->softirqs_enabled);
} else { /* lick the above, does it taste good? */
DEBUG_LOCKS_WARN_ON(!current->softirqs_enabled);
}
} #endif
/* if it doesn't have a class (yet), it certainly hasn't been used yet */ if (!class) return;
/* * READ locks only conflict with USED, such that if we only ever use * READ locks, there is no deadlock possible -- RCU.
*/ if (!hlock->read)
mask |= LOCKF_USED_READ;
staticbool lockdep_nmi(void)
{ if (raw_cpu_read(lockdep_recursion)) returnfalse;
if (!in_nmi()) returnfalse;
returntrue;
}
/* * read_lock() is recursive if: * 1. We force lockdep think this way in selftests or * 2. The implementation is not queued read/write lock or * 3. The locker is at an in_interrupt() context.
*/ bool read_lock_is_recursive(void)
{ return force_read_lock_recursive ||
!IS_ENABLED(CONFIG_QUEUED_RWLOCKS) ||
in_interrupt();
}
EXPORT_SYMBOL_GPL(read_lock_is_recursive);
/* * We are not always called with irqs disabled - do that here, * and also avoid lockdep recursion:
*/ void lock_acquire(struct lockdep_map *lock, unsignedint subclass, int trylock, int read, int check, struct lockdep_map *nest_lock, unsignedlong ip)
{ unsignedlong flags;
/* * As KASAN instrumentation is disabled and lock_acquire() is usually * the first lockdep call when a task tries to acquire a lock, add * kasan_check_byte() here to check for use-after-free and other * memory errors.
*/
kasan_check_byte(lock);
if (unlikely(!lockdep_enabled())) { /* XXX allow trylock from NMI ?!? */ if (lockdep_nmi() && !trylock) { struct held_lock hlock;
if (unlikely(!lockdep_enabled() ||
lock->key == &__lockdep_no_track__)) return;
raw_local_irq_save(flags);
check_flags(flags);
lockdep_recursion_inc(); if (__lock_release(lock, ip))
check_chain_key(current);
lockdep_recursion_finish();
raw_local_irq_restore(flags);
}
EXPORT_SYMBOL_GPL(lock_release);
/* * lock_sync() - A special annotation for synchronize_{s,}rcu()-like API. * * No actual critical section is created by the APIs annotated with this: these * APIs are used to wait for one or multiple critical sections (on other CPUs * or threads), and it means that calling these APIs inside these critical * sections is potential deadlock.
*/ void lock_sync(struct lockdep_map *lock, unsigned subclass, int read, int check, struct lockdep_map *nest_lock, unsignedlong ip)
{ unsignedlong flags;
#ifdef CONFIG_LOCK_STAT staticvoid print_lock_contention_bug(struct task_struct *curr, struct lockdep_map *lock, unsignedlong ip)
{ if (!debug_locks_off()) return; if (debug_locks_silent) return;
nbcon_cpu_emergency_enter();
pr_warn("\n");
pr_warn("=================================\n");
pr_warn("WARNING: bad contention detected!\n");
print_kernel_ident();
pr_warn("---------------------------------\n");
pr_warn("%s/%d is trying to contend lock (",
curr->comm, task_pid_nr(curr));
print_lockdep_cache(lock);
pr_cont(") at:\n");
print_ip_sym(KERN_WARNING, ip);
pr_warn("but there are no locks held!\n");
pr_warn("\nother info that might help us debug this:\n");
lockdep_print_held_locks(curr);
depth = curr->lockdep_depth; /* * Whee, we contended on this lock, except it seems we're not * actually trying to acquire anything much at all..
*/ if (DEBUG_LOCKS_WARN_ON(!depth)) return;
if (unlikely(lock->key == &__lockdep_no_track__)) return;
depth = curr->lockdep_depth; /* * Yay, we acquired ownership of this lock we didn't try to * acquire, how the heck did that happen?
*/ if (DEBUG_LOCKS_WARN_ON(!depth)) return;
if (unlikely(lock->key == &__lockdep_no_track__)) return;
/* Remove a class from a lock chain. Must be called with the graph lock held. */ staticvoid remove_class_from_lock_chain(struct pending_free *pf, struct lock_chain *chain, struct lock_class *class)
{ #ifdef CONFIG_PROVE_LOCKING int i;
for (i = chain->base; i < chain->base + chain->depth; i++) { if (chain_hlock_class_idx(chain_hlocks[i]) != class - lock_classes) continue; /* * Each lock class occurs at most once in a lock chain so once * we found a match we can break out of this loop.
*/ goto free_lock_chain;
} /* Since the chain has not been modified, return. */ return;
free_lock_chain:
free_chain_hlocks(chain->base, chain->depth); /* Overwrite the chain key for concurrent RCU readers. */
WRITE_ONCE(chain->chain_key, INITIAL_CHAIN_KEY);
dec_chains(chain->irq_context);
/* * Note: calling hlist_del_rcu() from inside a * hlist_for_each_entry_rcu() loop is safe.
*/
hlist_del_rcu(&chain->entry);
__set_bit(chain - lock_chains, pf->lock_chains_being_freed);
nr_zapped_lock_chains++; #endif
}
/* Must be called with the graph lock held. */ staticvoid remove_class_from_lock_chains(struct pending_free *pf, struct lock_class *class)
{ struct lock_chain *chain; struct hlist_head *head; int i;
for (i = 0; i < ARRAY_SIZE(chainhash_table); i++) {
head = chainhash_table + i;
hlist_for_each_entry_rcu(chain, head, entry) {
remove_class_from_lock_chain(pf, chain, class);
}
}
}
/* * Remove all references to a lock class. The caller must hold the graph lock.
*/ staticvoid zap_class(struct pending_free *pf, struct lock_class *class)
{ struct lock_list *entry; int i;
WARN_ON_ONCE(!class->key);
/* * Remove all dependencies this lock is * involved in:
*/
for_each_set_bit(i, list_entries_in_use, ARRAY_SIZE(list_entries)) {
entry = list_entries + i; if (entry->class != class && entry->links_to != class) continue;
__clear_bit(i, list_entries_in_use);
nr_list_entries--;
list_del_rcu(&entry->entry);
} if (list_empty(&class->locks_after) &&
list_empty(&class->locks_before)) {
list_move_tail(&class->lock_entry, &pf->zapped);
hlist_del_rcu(&class->hash_entry);
WRITE_ONCE(class->key, NULL);
WRITE_ONCE(class->name, NULL); /* Class allocated but not used, -1 in nr_unused_locks */ if (class->usage_mask == 0)
debug_atomic_dec(nr_unused_locks);
nr_lock_classes--;
__clear_bit(class - lock_classes, lock_classes_in_use); if (class - lock_classes == max_lock_class_idx)
max_lock_class_idx--;
} else {
WARN_ONCE(true, "%s() failed for class %s\n", __func__,
class->name);
}
staticbool inside_selftest(void)
{ return current == lockdep_selftest_task_struct;
}
/* The caller must hold the graph lock. */ staticstruct pending_free *get_pending_free(void)
{ return delayed_free.pf + delayed_free.index;
}
staticvoid free_zapped_rcu(struct rcu_head *cb);
/* * See if we need to queue an RCU callback, must called with * the lockdep lock held, returns false if either we don't have * any pending free or the callback is already scheduled. * Otherwise, a call_rcu() must follow this function call.
*/ staticbool prepare_call_rcu_zapped(struct pending_free *pf)
{
WARN_ON_ONCE(inside_selftest());
/* The caller must hold the graph lock. May be called from RCU context. */ staticvoid __free_zapped_classes(struct pending_free *pf)
{ struct lock_class *class;
/* * If there's pending free and its callback has not been scheduled, * queue an RCU callback.
*/ if (need_callback)
call_rcu(&delayed_free.rcu_head, free_zapped_rcu);
}
/* * Remove all lock classes from the class hash table and from the * all_lock_classes list whose key or name is in the address range [start, * start + size). Move these lock classes to the zapped_classes list. Must * be called with the graph lock held.
*/ staticvoid __lockdep_free_key_range(struct pending_free *pf, void *start, unsignedlong size)
{ struct lock_class *class; struct hlist_head *head; int i;
/* Unhash all classes that were created by a module. */ for (i = 0; i < CLASSHASH_SIZE; i++) {
head = classhash_table + i;
hlist_for_each_entry_rcu(class, head, hash_entry) { if (!within(class->key, start, size) &&
!within(class->name, start, size)) continue;
zap_class(pf, class);
}
}
}
/* * Used in module.c to remove lock classes from memory that is going to be * freed; and possibly re-used by other modules. * * We will have had one synchronize_rcu() before getting here, so we're * guaranteed nobody will look up these exact classes -- they're properly dead * but still allocated.
*/ staticvoid lockdep_free_key_range_reg(void *start, unsignedlong size)
{ struct pending_free *pf; unsignedlong flags; bool need_callback;
init_data_structures_once();
raw_local_irq_save(flags);
lockdep_lock();
pf = get_pending_free();
__lockdep_free_key_range(pf, start, size);
need_callback = prepare_call_rcu_zapped(pf);
lockdep_unlock();
raw_local_irq_restore(flags); if (need_callback)
call_rcu(&delayed_free.rcu_head, free_zapped_rcu); /* * Wait for any possible iterators from look_up_lock_class() to pass * before continuing to free the memory they refer to.
*/
synchronize_rcu();
}
/* * Free all lockdep keys in the range [start, start+size). Does not sleep. * Ignores debug_locks. Must only be used by the lockdep selftests.
*/ staticvoid lockdep_free_key_range_imm(void *start, unsignedlong size)
{ struct pending_free *pf = delayed_free.pf; unsignedlong flags;
if (inside_selftest())
lockdep_free_key_range_imm(start, size); else
lockdep_free_key_range_reg(start, size);
}
/* * Check whether any element of the @lock->class_cache[] array refers to a * registered lock class. The caller must hold either the graph lock or the * RCU read lock.
*/ staticbool lock_class_cache_is_registered(struct lockdep_map *lock)
{ struct lock_class *class; struct hlist_head *head; int i, j;
for (i = 0; i < CLASSHASH_SIZE; i++) {
head = classhash_table + i;
hlist_for_each_entry_rcu(class, head, hash_entry) { for (j = 0; j < NR_LOCKDEP_CACHING_CLASSES; j++) if (lock->class_cache[j] == class) returntrue;
}
} returnfalse;
}
/* The caller must hold the graph lock. Does not sleep. */ staticvoid __lockdep_reset_lock(struct pending_free *pf, struct lockdep_map *lock)
{ struct lock_class *class; int j;
/* * Remove all classes this lock might have:
*/ for (j = 0; j < MAX_LOCKDEP_SUBCLASSES; j++) { /* * If the class exists we look it up and zap it:
*/ class = look_up_lock_class(lock, j); if (class)
zap_class(pf, class);
} /* * Debug check: in the end all mapped classes should * be gone.
*/ if (WARN_ON_ONCE(lock_class_cache_is_registered(lock)))
debug_locks_off();
}
/* * Remove all information lockdep has about a lock if debug_locks == 1. Free * released data structures from RCU context.
*/ staticvoid lockdep_reset_lock_reg(struct lockdep_map *lock)
{ struct pending_free *pf; unsignedlong flags; int locked; bool need_callback = false;
raw_local_irq_save(flags);
locked = graph_lock(); if (!locked) goto out_irq;
graph_unlock();
out_irq:
raw_local_irq_restore(flags); if (need_callback)
call_rcu(&delayed_free.rcu_head, free_zapped_rcu);
}
/* * Reset a lock. Does not sleep. Ignores debug_locks. Must only be used by the * lockdep selftests.
*/ staticvoid lockdep_reset_lock_imm(struct lockdep_map *lock)
{ struct pending_free *pf = delayed_free.pf; unsignedlong flags;
if (need_callback)
call_rcu(&delayed_free.rcu_head, free_zapped_rcu);
/* * Wait until is_dynamic_key() has finished accessing k->hash_entry. * * Some operations like __qdisc_destroy() will call this in a debug * kernel, and the network traffic is disabled while waiting, hence * the delay of the wait matters in debugging cases. Currently use a * synchronize_rcu_expedited() to speed up the wait at the cost of * system IPIs. TODO: Replace RCU with hazptr for this.
*/
synchronize_rcu_expedited();
}
EXPORT_SYMBOL_GPL(lockdep_unregister_key);
void __init lockdep_init(void)
{
pr_info("Lock dependency validator: Copyright (c) 2006 Red Hat, Inc., Ingo Molnar\n");
staticvoid
print_freed_lock_bug(struct task_struct *curr, constvoid *mem_from, constvoid *mem_to, struct held_lock *hlock)
{ if (!debug_locks_off()) return; if (debug_locks_silent) return;
nbcon_cpu_emergency_enter();
pr_warn("\n");
pr_warn("=========================\n");
pr_warn("WARNING: held lock freed!\n");
print_kernel_ident();
pr_warn("-------------------------\n");
pr_warn("%s/%d is freeing memory %px-%px, with a lock still held there!\n",
curr->comm, task_pid_nr(curr), mem_from, mem_to-1);
print_lock(hlock);
lockdep_print_held_locks(curr);
/* * Called when kernel memory is freed (or unmapped), or if a lock * is destroyed or reinitialized - this code checks whether there is * any held lock in the memory range of <from> to <to>:
*/ void debug_check_no_locks_freed(constvoid *mem_from, unsignedlong mem_len)
{ struct task_struct *curr = current; struct held_lock *hlock; unsignedlong flags; int i;
if (unlikely(!debug_locks)) return;
raw_local_irq_save(flags); for (i = 0; i < curr->lockdep_depth; i++) {
hlock = curr->held_locks + i;
if (not_in_range(mem_from, mem_len, hlock->instance, sizeof(*hlock->instance))) continue;
/* * Careful: only use this function if you are sure that * the task cannot run in parallel!
*/ void debug_show_held_locks(struct task_struct *task)
{ if (unlikely(!debug_locks)) {
printk("INFO: lockdep is turned off.\n"); return;
}
lockdep_print_held_locks(task);
}
EXPORT_SYMBOL_GPL(debug_show_held_locks);
if (unlikely(curr->lockdep_depth)) { if (!debug_locks_off()) return;
nbcon_cpu_emergency_enter();
pr_warn("\n");
pr_warn("================================================\n");
pr_warn("WARNING: lock held when returning to user space!\n");
print_kernel_ident();
pr_warn("------------------------------------------------\n");
pr_warn("%s/%d is leaving the kernel with locks still held!\n",
curr->comm, curr->pid);
lockdep_print_held_locks(curr);
nbcon_cpu_emergency_exit();
}
/* * The lock history for each syscall should be independent. So wipe the * slate clean on return to userspace.
*/
lockdep_invariant_state(false);
}
/* Note: the following can be executed concurrently, so be careful. */
nbcon_cpu_emergency_enter();
pr_warn("\n");
pr_warn("=============================\n");
pr_warn("WARNING: suspicious RCU usage\n");
print_kernel_ident();
pr_warn("-----------------------------\n");
pr_warn("%s:%d %s!\n", file, line, s);
pr_warn("\nother info that might help us debug this:\n\n");
pr_warn("\n%srcu_scheduler_active = %d, debug_locks = %d\n%s",
!rcu_lockdep_current_cpu_online()
? "RCU used illegally from offline CPU!\n"
: "",
rcu_scheduler_active, dl,
dl ? "" : "Possible false positive due to lockdep disabling via debug_locks = 0\n");
/* * If a CPU is in the RCU-free window in idle (ie: in the section * between ct_idle_enter() and ct_idle_exit(), then RCU * considers that CPU to be in an "extended quiescent state", * which means that RCU will be completely ignoring that CPU. * Therefore, rcu_read_lock() and friends have absolutely no * effect on a CPU running in that state. In other words, even if * such an RCU-idle CPU has called rcu_read_lock(), RCU might well * delete data structures out from under it. RCU really has no * choice here: we need to keep an RCU-free window in idle where * the CPU may possibly enter into low power mode. This way we can * notice an extended quiescent state to other CPUs that started a grace * period. Otherwise we would delay any grace period as long as we run * in the idle task. * * So complain bitterly if someone does call rcu_read_lock(), * rcu_read_lock_bh() and so on from extended quiescent states.
*/ if (!rcu_is_watching())
pr_warn("RCU used illegally from extended quiescent state!\n");
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.140Bemerkung:
(vorverarbeitet am 2026-04-29)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.