1457c8996SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only 28eddac3fSPeter Zijlstra /* 38eddac3fSPeter Zijlstra * kernel/lockdep.c 48eddac3fSPeter Zijlstra * 58eddac3fSPeter Zijlstra * Runtime locking correctness validator 68eddac3fSPeter Zijlstra * 78eddac3fSPeter Zijlstra * Started by Ingo Molnar: 88eddac3fSPeter Zijlstra * 98eddac3fSPeter Zijlstra * Copyright (C) 2006,2007 Red Hat, Inc., Ingo Molnar <[email protected]> 1090eec103SPeter Zijlstra * Copyright (C) 2007 Red Hat, Inc., Peter Zijlstra 118eddac3fSPeter Zijlstra * 128eddac3fSPeter Zijlstra * this code maps all the lock dependencies as they occur in a live kernel 138eddac3fSPeter Zijlstra * and will warn about the following classes of locking bugs: 148eddac3fSPeter Zijlstra * 158eddac3fSPeter Zijlstra * - lock inversion scenarios 168eddac3fSPeter Zijlstra * - circular lock dependencies 178eddac3fSPeter Zijlstra * - hardirq/softirq safe/unsafe locking bugs 188eddac3fSPeter Zijlstra * 198eddac3fSPeter Zijlstra * Bugs are reported even if the current locking scenario does not cause 208eddac3fSPeter Zijlstra * any deadlock at this point. 218eddac3fSPeter Zijlstra * 228eddac3fSPeter Zijlstra * I.e. if anytime in the past two locks were taken in a different order, 238eddac3fSPeter Zijlstra * even if it happened for another task, even if those were different 248eddac3fSPeter Zijlstra * locks (but of the same class as this lock), this code will detect it. 258eddac3fSPeter Zijlstra * 268eddac3fSPeter Zijlstra * Thanks to Arjan van de Ven for coming up with the initial idea of 278eddac3fSPeter Zijlstra * mapping lock dependencies runtime. 288eddac3fSPeter Zijlstra */ 298eddac3fSPeter Zijlstra #define DISABLE_BRANCH_PROFILING 308eddac3fSPeter Zijlstra #include <linux/mutex.h> 318eddac3fSPeter Zijlstra #include <linux/sched.h> 32e6017571SIngo Molnar #include <linux/sched/clock.h> 3329930025SIngo Molnar #include <linux/sched/task.h> 346d7225f0SNikolay Borisov #include <linux/sched/mm.h> 358eddac3fSPeter Zijlstra #include <linux/delay.h> 368eddac3fSPeter Zijlstra #include <linux/module.h> 378eddac3fSPeter Zijlstra #include <linux/proc_fs.h> 388eddac3fSPeter Zijlstra #include <linux/seq_file.h> 398eddac3fSPeter Zijlstra #include <linux/spinlock.h> 408eddac3fSPeter Zijlstra #include <linux/kallsyms.h> 418eddac3fSPeter Zijlstra #include <linux/interrupt.h> 428eddac3fSPeter Zijlstra #include <linux/stacktrace.h> 438eddac3fSPeter Zijlstra #include <linux/debug_locks.h> 448eddac3fSPeter Zijlstra #include <linux/irqflags.h> 458eddac3fSPeter Zijlstra #include <linux/utsname.h> 468eddac3fSPeter Zijlstra #include <linux/hash.h> 478eddac3fSPeter Zijlstra #include <linux/ftrace.h> 488eddac3fSPeter Zijlstra #include <linux/stringify.h> 49ace35a7aSBart Van Assche #include <linux/bitmap.h> 508eddac3fSPeter Zijlstra #include <linux/bitops.h> 518eddac3fSPeter Zijlstra #include <linux/gfp.h> 52e7904a28SPeter Zijlstra #include <linux/random.h> 53dfaaf3faSPeter Zijlstra #include <linux/jhash.h> 5488f1c87dSTejun Heo #include <linux/nmi.h> 55a0b0fd53SBart Van Assche #include <linux/rcupdate.h> 562f43c602SMasami Hiramatsu #include <linux/kprobes.h> 57f8cfa466SShuah Khan #include <linux/lockdep.h> 585a5d7e9bSPeter Zijlstra #include <linux/context_tracking.h> 59*59cd94efSJohn Ogness #include <linux/console.h> 608eddac3fSPeter Zijlstra 618eddac3fSPeter Zijlstra #include <asm/sections.h> 628eddac3fSPeter Zijlstra 638eddac3fSPeter Zijlstra #include "lockdep_internals.h" 648eddac3fSPeter Zijlstra 658eddac3fSPeter Zijlstra #include <trace/events/lock.h> 668eddac3fSPeter Zijlstra 678eddac3fSPeter Zijlstra #ifdef CONFIG_PROVE_LOCKING 68f79c9b8aStangmeng static int prove_locking = 1; 698eddac3fSPeter Zijlstra module_param(prove_locking, int, 0644); 708eddac3fSPeter Zijlstra #else 718eddac3fSPeter Zijlstra #define prove_locking 0 728eddac3fSPeter Zijlstra #endif 738eddac3fSPeter Zijlstra 748eddac3fSPeter Zijlstra #ifdef CONFIG_LOCK_STAT 75f79c9b8aStangmeng static int lock_stat = 1; 768eddac3fSPeter Zijlstra module_param(lock_stat, int, 0644); 778eddac3fSPeter Zijlstra #else 788eddac3fSPeter Zijlstra #define lock_stat 0 798eddac3fSPeter Zijlstra #endif 808eddac3fSPeter Zijlstra 81f79c9b8aStangmeng #ifdef CONFIG_SYSCTL 82f79c9b8aStangmeng static struct ctl_table kern_lockdep_table[] = { 83f79c9b8aStangmeng #ifdef CONFIG_PROVE_LOCKING 84f79c9b8aStangmeng { 85f79c9b8aStangmeng .procname = "prove_locking", 86f79c9b8aStangmeng .data = &prove_locking, 87f79c9b8aStangmeng .maxlen = sizeof(int), 88f79c9b8aStangmeng .mode = 0644, 89f79c9b8aStangmeng .proc_handler = proc_dointvec, 90f79c9b8aStangmeng }, 91f79c9b8aStangmeng #endif /* CONFIG_PROVE_LOCKING */ 92f79c9b8aStangmeng #ifdef CONFIG_LOCK_STAT 93f79c9b8aStangmeng { 94f79c9b8aStangmeng .procname = "lock_stat", 95f79c9b8aStangmeng .data = &lock_stat, 96f79c9b8aStangmeng .maxlen = sizeof(int), 97f79c9b8aStangmeng .mode = 0644, 98f79c9b8aStangmeng .proc_handler = proc_dointvec, 99f79c9b8aStangmeng }, 100f79c9b8aStangmeng #endif /* CONFIG_LOCK_STAT */ 101f79c9b8aStangmeng }; 102f79c9b8aStangmeng 103f79c9b8aStangmeng static __init int kernel_lockdep_sysctls_init(void) 104f79c9b8aStangmeng { 105f79c9b8aStangmeng register_sysctl_init("kernel", kern_lockdep_table); 106f79c9b8aStangmeng return 0; 107f79c9b8aStangmeng } 108f79c9b8aStangmeng late_initcall(kernel_lockdep_sysctls_init); 109f79c9b8aStangmeng #endif /* CONFIG_SYSCTL */ 110f79c9b8aStangmeng 1114d004099SPeter Zijlstra DEFINE_PER_CPU(unsigned int, lockdep_recursion); 1124d004099SPeter Zijlstra EXPORT_PER_CPU_SYMBOL_GPL(lockdep_recursion); 1134d004099SPeter Zijlstra 1140afda3a8SPeter Zijlstra static __always_inline bool lockdep_enabled(void) 1154d004099SPeter Zijlstra { 1164d004099SPeter Zijlstra if (!debug_locks) 1174d004099SPeter Zijlstra return false; 1184d004099SPeter Zijlstra 119d48e3850SPeter Zijlstra if (this_cpu_read(lockdep_recursion)) 1204d004099SPeter Zijlstra return false; 1214d004099SPeter Zijlstra 1224d004099SPeter Zijlstra if (current->lockdep_recursion) 1234d004099SPeter Zijlstra return false; 1244d004099SPeter Zijlstra 1254d004099SPeter Zijlstra return true; 1264d004099SPeter Zijlstra } 1274d004099SPeter Zijlstra 1288eddac3fSPeter Zijlstra /* 1298eddac3fSPeter Zijlstra * lockdep_lock: protects the lockdep graph, the hashes and the 1308eddac3fSPeter Zijlstra * class/list/hash allocators. 1318eddac3fSPeter Zijlstra * 1328eddac3fSPeter Zijlstra * This is one of the rare exceptions where it's justified 1338eddac3fSPeter Zijlstra * to use a raw spinlock - we really dont want the spinlock 1348eddac3fSPeter Zijlstra * code to recurse back into the lockdep code... 1358eddac3fSPeter Zijlstra */ 136248efb21SPeter Zijlstra static arch_spinlock_t __lock = (arch_spinlock_t)__ARCH_SPIN_LOCK_UNLOCKED; 137248efb21SPeter Zijlstra static struct task_struct *__owner; 138248efb21SPeter Zijlstra 139248efb21SPeter Zijlstra static inline void lockdep_lock(void) 140248efb21SPeter Zijlstra { 141248efb21SPeter Zijlstra DEBUG_LOCKS_WARN_ON(!irqs_disabled()); 142248efb21SPeter Zijlstra 14343be4388SBoqun Feng __this_cpu_inc(lockdep_recursion); 144248efb21SPeter Zijlstra arch_spin_lock(&__lock); 145248efb21SPeter Zijlstra __owner = current; 146248efb21SPeter Zijlstra } 147248efb21SPeter Zijlstra 148248efb21SPeter Zijlstra static inline void lockdep_unlock(void) 149248efb21SPeter Zijlstra { 15043be4388SBoqun Feng DEBUG_LOCKS_WARN_ON(!irqs_disabled()); 15143be4388SBoqun Feng 152248efb21SPeter Zijlstra if (debug_locks && DEBUG_LOCKS_WARN_ON(__owner != current)) 153248efb21SPeter Zijlstra return; 154248efb21SPeter Zijlstra 155248efb21SPeter Zijlstra __owner = NULL; 156248efb21SPeter Zijlstra arch_spin_unlock(&__lock); 15743be4388SBoqun Feng __this_cpu_dec(lockdep_recursion); 158248efb21SPeter Zijlstra } 159248efb21SPeter Zijlstra 160248efb21SPeter Zijlstra static inline bool lockdep_assert_locked(void) 161248efb21SPeter Zijlstra { 162248efb21SPeter Zijlstra return DEBUG_LOCKS_WARN_ON(__owner != current); 163248efb21SPeter Zijlstra } 164248efb21SPeter Zijlstra 165cdc84d79SBart Van Assche static struct task_struct *lockdep_selftest_task_struct; 1668eddac3fSPeter Zijlstra 167248efb21SPeter Zijlstra 1688eddac3fSPeter Zijlstra static int graph_lock(void) 1698eddac3fSPeter Zijlstra { 170248efb21SPeter Zijlstra lockdep_lock(); 1718eddac3fSPeter Zijlstra /* 1728eddac3fSPeter Zijlstra * Make sure that if another CPU detected a bug while 1738eddac3fSPeter Zijlstra * walking the graph we dont change it (while the other 1748eddac3fSPeter Zijlstra * CPU is busy printing out stuff with the graph lock 1758eddac3fSPeter Zijlstra * dropped already) 1768eddac3fSPeter Zijlstra */ 1778eddac3fSPeter Zijlstra if (!debug_locks) { 178248efb21SPeter Zijlstra lockdep_unlock(); 1798eddac3fSPeter Zijlstra return 0; 1808eddac3fSPeter Zijlstra } 1818eddac3fSPeter Zijlstra return 1; 1828eddac3fSPeter Zijlstra } 1838eddac3fSPeter Zijlstra 184248efb21SPeter Zijlstra static inline void graph_unlock(void) 1858eddac3fSPeter Zijlstra { 186248efb21SPeter Zijlstra lockdep_unlock(); 1878eddac3fSPeter Zijlstra } 1888eddac3fSPeter Zijlstra 1898eddac3fSPeter Zijlstra /* 1908eddac3fSPeter Zijlstra * Turn lock debugging off and return with 0 if it was off already, 1918eddac3fSPeter Zijlstra * and also release the graph lock: 1928eddac3fSPeter Zijlstra */ 1938eddac3fSPeter Zijlstra static inline int debug_locks_off_graph_unlock(void) 1948eddac3fSPeter Zijlstra { 1958eddac3fSPeter Zijlstra int ret = debug_locks_off(); 1968eddac3fSPeter Zijlstra 197248efb21SPeter Zijlstra lockdep_unlock(); 1988eddac3fSPeter Zijlstra 1998eddac3fSPeter Zijlstra return ret; 2008eddac3fSPeter Zijlstra } 2018eddac3fSPeter Zijlstra 2028eddac3fSPeter Zijlstra unsigned long nr_list_entries; 2038eddac3fSPeter Zijlstra static struct lock_list list_entries[MAX_LOCKDEP_ENTRIES]; 204ace35a7aSBart Van Assche static DECLARE_BITMAP(list_entries_in_use, MAX_LOCKDEP_ENTRIES); 2058eddac3fSPeter Zijlstra 2068eddac3fSPeter Zijlstra /* 2078eddac3fSPeter Zijlstra * All data structures here are protected by the global debug_lock. 2088eddac3fSPeter Zijlstra * 209a0b0fd53SBart Van Assche * nr_lock_classes is the number of elements of lock_classes[] that is 210a0b0fd53SBart Van Assche * in use. 2118eddac3fSPeter Zijlstra */ 212108c1485SBart Van Assche #define KEYHASH_BITS (MAX_LOCKDEP_KEYS_BITS - 1) 213108c1485SBart Van Assche #define KEYHASH_SIZE (1UL << KEYHASH_BITS) 214108c1485SBart Van Assche static struct hlist_head lock_keys_hash[KEYHASH_SIZE]; 2158eddac3fSPeter Zijlstra unsigned long nr_lock_classes; 2161d44bcb4SWaiman Long unsigned long nr_zapped_classes; 217fb7275acSWaiman Long unsigned long max_lock_class_idx; 2188ca2b56cSWaiman Long struct lock_class lock_classes[MAX_LOCKDEP_KEYS]; 219fb7275acSWaiman Long DECLARE_BITMAP(lock_classes_in_use, MAX_LOCKDEP_KEYS); 2208eddac3fSPeter Zijlstra 2218eddac3fSPeter Zijlstra static inline struct lock_class *hlock_class(struct held_lock *hlock) 2228eddac3fSPeter Zijlstra { 22301bb6f0aSYuyang Du unsigned int class_idx = hlock->class_idx; 22401bb6f0aSYuyang Du 22501bb6f0aSYuyang Du /* Don't re-read hlock->class_idx, can't use READ_ONCE() on bitfield */ 22601bb6f0aSYuyang Du barrier(); 22701bb6f0aSYuyang Du 22801bb6f0aSYuyang Du if (!test_bit(class_idx, lock_classes_in_use)) { 2298eddac3fSPeter Zijlstra /* 2308eddac3fSPeter Zijlstra * Someone passed in garbage, we give up. 2318eddac3fSPeter Zijlstra */ 2328eddac3fSPeter Zijlstra DEBUG_LOCKS_WARN_ON(1); 2338eddac3fSPeter Zijlstra return NULL; 2348eddac3fSPeter Zijlstra } 23501bb6f0aSYuyang Du 23601bb6f0aSYuyang Du /* 23701bb6f0aSYuyang Du * At this point, if the passed hlock->class_idx is still garbage, 23801bb6f0aSYuyang Du * we just have to live with it 23901bb6f0aSYuyang Du */ 24001bb6f0aSYuyang Du return lock_classes + class_idx; 2418eddac3fSPeter Zijlstra } 2428eddac3fSPeter Zijlstra 2438eddac3fSPeter Zijlstra #ifdef CONFIG_LOCK_STAT 24425528213SPeter Zijlstra static DEFINE_PER_CPU(struct lock_class_stats[MAX_LOCKDEP_KEYS], cpu_lock_stats); 2458eddac3fSPeter Zijlstra 2468eddac3fSPeter Zijlstra static inline u64 lockstat_clock(void) 2478eddac3fSPeter Zijlstra { 2488eddac3fSPeter Zijlstra return local_clock(); 2498eddac3fSPeter Zijlstra } 2508eddac3fSPeter Zijlstra 2518eddac3fSPeter Zijlstra static int lock_point(unsigned long points[], unsigned long ip) 2528eddac3fSPeter Zijlstra { 2538eddac3fSPeter Zijlstra int i; 2548eddac3fSPeter Zijlstra 2558eddac3fSPeter Zijlstra for (i = 0; i < LOCKSTAT_POINTS; i++) { 2568eddac3fSPeter Zijlstra if (points[i] == 0) { 2578eddac3fSPeter Zijlstra points[i] = ip; 2588eddac3fSPeter Zijlstra break; 2598eddac3fSPeter Zijlstra } 2608eddac3fSPeter Zijlstra if (points[i] == ip) 2618eddac3fSPeter Zijlstra break; 2628eddac3fSPeter Zijlstra } 2638eddac3fSPeter Zijlstra 2648eddac3fSPeter Zijlstra return i; 2658eddac3fSPeter Zijlstra } 2668eddac3fSPeter Zijlstra 2678eddac3fSPeter Zijlstra static void lock_time_inc(struct lock_time *lt, u64 time) 2688eddac3fSPeter Zijlstra { 2698eddac3fSPeter Zijlstra if (time > lt->max) 2708eddac3fSPeter Zijlstra lt->max = time; 2718eddac3fSPeter Zijlstra 2728eddac3fSPeter Zijlstra if (time < lt->min || !lt->nr) 2738eddac3fSPeter Zijlstra lt->min = time; 2748eddac3fSPeter Zijlstra 2758eddac3fSPeter Zijlstra lt->total += time; 2768eddac3fSPeter Zijlstra lt->nr++; 2778eddac3fSPeter Zijlstra } 2788eddac3fSPeter Zijlstra 2798eddac3fSPeter Zijlstra static inline void lock_time_add(struct lock_time *src, struct lock_time *dst) 2808eddac3fSPeter Zijlstra { 2818eddac3fSPeter Zijlstra if (!src->nr) 2828eddac3fSPeter Zijlstra return; 2838eddac3fSPeter Zijlstra 2848eddac3fSPeter Zijlstra if (src->max > dst->max) 2858eddac3fSPeter Zijlstra dst->max = src->max; 2868eddac3fSPeter Zijlstra 2878eddac3fSPeter Zijlstra if (src->min < dst->min || !dst->nr) 2888eddac3fSPeter Zijlstra dst->min = src->min; 2898eddac3fSPeter Zijlstra 2908eddac3fSPeter Zijlstra dst->total += src->total; 2918eddac3fSPeter Zijlstra dst->nr += src->nr; 2928eddac3fSPeter Zijlstra } 2938eddac3fSPeter Zijlstra 2948eddac3fSPeter Zijlstra struct lock_class_stats lock_stats(struct lock_class *class) 2958eddac3fSPeter Zijlstra { 2968eddac3fSPeter Zijlstra struct lock_class_stats stats; 2978eddac3fSPeter Zijlstra int cpu, i; 2988eddac3fSPeter Zijlstra 2998eddac3fSPeter Zijlstra memset(&stats, 0, sizeof(struct lock_class_stats)); 3008eddac3fSPeter Zijlstra for_each_possible_cpu(cpu) { 3018eddac3fSPeter Zijlstra struct lock_class_stats *pcs = 3028eddac3fSPeter Zijlstra &per_cpu(cpu_lock_stats, cpu)[class - lock_classes]; 3038eddac3fSPeter Zijlstra 3048eddac3fSPeter Zijlstra for (i = 0; i < ARRAY_SIZE(stats.contention_point); i++) 3058eddac3fSPeter Zijlstra stats.contention_point[i] += pcs->contention_point[i]; 3068eddac3fSPeter Zijlstra 3078eddac3fSPeter Zijlstra for (i = 0; i < ARRAY_SIZE(stats.contending_point); i++) 3088eddac3fSPeter Zijlstra stats.contending_point[i] += pcs->contending_point[i]; 3098eddac3fSPeter Zijlstra 3108eddac3fSPeter Zijlstra lock_time_add(&pcs->read_waittime, &stats.read_waittime); 3118eddac3fSPeter Zijlstra lock_time_add(&pcs->write_waittime, &stats.write_waittime); 3128eddac3fSPeter Zijlstra 3138eddac3fSPeter Zijlstra lock_time_add(&pcs->read_holdtime, &stats.read_holdtime); 3148eddac3fSPeter Zijlstra lock_time_add(&pcs->write_holdtime, &stats.write_holdtime); 3158eddac3fSPeter Zijlstra 3168eddac3fSPeter Zijlstra for (i = 0; i < ARRAY_SIZE(stats.bounces); i++) 3178eddac3fSPeter Zijlstra stats.bounces[i] += pcs->bounces[i]; 3188eddac3fSPeter Zijlstra } 3198eddac3fSPeter Zijlstra 3208eddac3fSPeter Zijlstra return stats; 3218eddac3fSPeter Zijlstra } 3228eddac3fSPeter Zijlstra 3238eddac3fSPeter Zijlstra void clear_lock_stats(struct lock_class *class) 3248eddac3fSPeter Zijlstra { 3258eddac3fSPeter Zijlstra int cpu; 3268eddac3fSPeter Zijlstra 3278eddac3fSPeter Zijlstra for_each_possible_cpu(cpu) { 3288eddac3fSPeter Zijlstra struct lock_class_stats *cpu_stats = 3298eddac3fSPeter Zijlstra &per_cpu(cpu_lock_stats, cpu)[class - lock_classes]; 3308eddac3fSPeter Zijlstra 3318eddac3fSPeter Zijlstra memset(cpu_stats, 0, sizeof(struct lock_class_stats)); 3328eddac3fSPeter Zijlstra } 3338eddac3fSPeter Zijlstra memset(class->contention_point, 0, sizeof(class->contention_point)); 3348eddac3fSPeter Zijlstra memset(class->contending_point, 0, sizeof(class->contending_point)); 3358eddac3fSPeter Zijlstra } 3368eddac3fSPeter Zijlstra 3378eddac3fSPeter Zijlstra static struct lock_class_stats *get_lock_stats(struct lock_class *class) 3388eddac3fSPeter Zijlstra { 33901f38497SJoel Fernandes (Google) return &this_cpu_ptr(cpu_lock_stats)[class - lock_classes]; 3408eddac3fSPeter Zijlstra } 3418eddac3fSPeter Zijlstra 3428eddac3fSPeter Zijlstra static void lock_release_holdtime(struct held_lock *hlock) 3438eddac3fSPeter Zijlstra { 3448eddac3fSPeter Zijlstra struct lock_class_stats *stats; 3458eddac3fSPeter Zijlstra u64 holdtime; 3468eddac3fSPeter Zijlstra 3478eddac3fSPeter Zijlstra if (!lock_stat) 3488eddac3fSPeter Zijlstra return; 3498eddac3fSPeter Zijlstra 3508eddac3fSPeter Zijlstra holdtime = lockstat_clock() - hlock->holdtime_stamp; 3518eddac3fSPeter Zijlstra 3528eddac3fSPeter Zijlstra stats = get_lock_stats(hlock_class(hlock)); 3538eddac3fSPeter Zijlstra if (hlock->read) 3548eddac3fSPeter Zijlstra lock_time_inc(&stats->read_holdtime, holdtime); 3558eddac3fSPeter Zijlstra else 3568eddac3fSPeter Zijlstra lock_time_inc(&stats->write_holdtime, holdtime); 3578eddac3fSPeter Zijlstra } 3588eddac3fSPeter Zijlstra #else 3598eddac3fSPeter Zijlstra static inline void lock_release_holdtime(struct held_lock *hlock) 3608eddac3fSPeter Zijlstra { 3618eddac3fSPeter Zijlstra } 3628eddac3fSPeter Zijlstra #endif 3638eddac3fSPeter Zijlstra 3648eddac3fSPeter Zijlstra /* 365a0b0fd53SBart Van Assche * We keep a global list of all lock classes. The list is only accessed with 366a0b0fd53SBart Van Assche * the lockdep spinlock lock held. free_lock_classes is a list with free 367a0b0fd53SBart Van Assche * elements. These elements are linked together by the lock_entry member in 368a0b0fd53SBart Van Assche * struct lock_class. 3698eddac3fSPeter Zijlstra */ 370fb7275acSWaiman Long static LIST_HEAD(all_lock_classes); 371a0b0fd53SBart Van Assche static LIST_HEAD(free_lock_classes); 372a0b0fd53SBart Van Assche 373a0b0fd53SBart Van Assche /** 374a0b0fd53SBart Van Assche * struct pending_free - information about data structures about to be freed 375a0b0fd53SBart Van Assche * @zapped: Head of a list with struct lock_class elements. 376de4643a7SBart Van Assche * @lock_chains_being_freed: Bitmap that indicates which lock_chains[] elements 377de4643a7SBart Van Assche * are about to be freed. 378a0b0fd53SBart Van Assche */ 379a0b0fd53SBart Van Assche struct pending_free { 380a0b0fd53SBart Van Assche struct list_head zapped; 381de4643a7SBart Van Assche DECLARE_BITMAP(lock_chains_being_freed, MAX_LOCKDEP_CHAINS); 382a0b0fd53SBart Van Assche }; 383a0b0fd53SBart Van Assche 384a0b0fd53SBart Van Assche /** 385a0b0fd53SBart Van Assche * struct delayed_free - data structures used for delayed freeing 386a0b0fd53SBart Van Assche * 387a0b0fd53SBart Van Assche * A data structure for delayed freeing of data structures that may be 388a0b0fd53SBart Van Assche * accessed by RCU readers at the time these were freed. 389a0b0fd53SBart Van Assche * 390a0b0fd53SBart Van Assche * @rcu_head: Used to schedule an RCU callback for freeing data structures. 391a0b0fd53SBart Van Assche * @index: Index of @pf to which freed data structures are added. 392a0b0fd53SBart Van Assche * @scheduled: Whether or not an RCU callback has been scheduled. 393a0b0fd53SBart Van Assche * @pf: Array with information about data structures about to be freed. 394a0b0fd53SBart Van Assche */ 395a0b0fd53SBart Van Assche static struct delayed_free { 396a0b0fd53SBart Van Assche struct rcu_head rcu_head; 397a0b0fd53SBart Van Assche int index; 398a0b0fd53SBart Van Assche int scheduled; 399a0b0fd53SBart Van Assche struct pending_free pf[2]; 400a0b0fd53SBart Van Assche } delayed_free; 4018eddac3fSPeter Zijlstra 4028eddac3fSPeter Zijlstra /* 4038eddac3fSPeter Zijlstra * The lockdep classes are in a hash-table as well, for fast lookup: 4048eddac3fSPeter Zijlstra */ 4058eddac3fSPeter Zijlstra #define CLASSHASH_BITS (MAX_LOCKDEP_KEYS_BITS - 1) 4068eddac3fSPeter Zijlstra #define CLASSHASH_SIZE (1UL << CLASSHASH_BITS) 4078eddac3fSPeter Zijlstra #define __classhashfn(key) hash_long((unsigned long)key, CLASSHASH_BITS) 4088eddac3fSPeter Zijlstra #define classhashentry(key) (classhash_table + __classhashfn((key))) 4098eddac3fSPeter Zijlstra 410a63f38ccSAndrew Morton static struct hlist_head classhash_table[CLASSHASH_SIZE]; 4118eddac3fSPeter Zijlstra 4128eddac3fSPeter Zijlstra /* 4138eddac3fSPeter Zijlstra * We put the lock dependency chains into a hash-table as well, to cache 4148eddac3fSPeter Zijlstra * their existence: 4158eddac3fSPeter Zijlstra */ 4168eddac3fSPeter Zijlstra #define CHAINHASH_BITS (MAX_LOCKDEP_CHAINS_BITS-1) 4178eddac3fSPeter Zijlstra #define CHAINHASH_SIZE (1UL << CHAINHASH_BITS) 4188eddac3fSPeter Zijlstra #define __chainhashfn(chain) hash_long(chain, CHAINHASH_BITS) 4198eddac3fSPeter Zijlstra #define chainhashentry(chain) (chainhash_table + __chainhashfn((chain))) 4208eddac3fSPeter Zijlstra 421a63f38ccSAndrew Morton static struct hlist_head chainhash_table[CHAINHASH_SIZE]; 4228eddac3fSPeter Zijlstra 4238eddac3fSPeter Zijlstra /* 424f611e8cfSBoqun Feng * the id of held_lock 425f611e8cfSBoqun Feng */ 426f611e8cfSBoqun Feng static inline u16 hlock_id(struct held_lock *hlock) 427f611e8cfSBoqun Feng { 428f611e8cfSBoqun Feng BUILD_BUG_ON(MAX_LOCKDEP_KEYS_BITS + 2 > 16); 429f611e8cfSBoqun Feng 430f611e8cfSBoqun Feng return (hlock->class_idx | (hlock->read << MAX_LOCKDEP_KEYS_BITS)); 431f611e8cfSBoqun Feng } 432f611e8cfSBoqun Feng 433f611e8cfSBoqun Feng static inline unsigned int chain_hlock_class_idx(u16 hlock_id) 434f611e8cfSBoqun Feng { 435f611e8cfSBoqun Feng return hlock_id & (MAX_LOCKDEP_KEYS - 1); 436f611e8cfSBoqun Feng } 437f611e8cfSBoqun Feng 438f611e8cfSBoqun Feng /* 4398eddac3fSPeter Zijlstra * The hash key of the lock dependency chains is a hash itself too: 4408eddac3fSPeter Zijlstra * it's a hash of all locks taken up to that lock, including that lock. 4418eddac3fSPeter Zijlstra * It's a 64-bit hash, because it's important for the keys to be 4428eddac3fSPeter Zijlstra * unique. 4438eddac3fSPeter Zijlstra */ 444dfaaf3faSPeter Zijlstra static inline u64 iterate_chain_key(u64 key, u32 idx) 445dfaaf3faSPeter Zijlstra { 446dfaaf3faSPeter Zijlstra u32 k0 = key, k1 = key >> 32; 447dfaaf3faSPeter Zijlstra 448dfaaf3faSPeter Zijlstra __jhash_mix(idx, k0, k1); /* Macro that modifies arguments! */ 449dfaaf3faSPeter Zijlstra 450dfaaf3faSPeter Zijlstra return k0 | (u64)k1 << 32; 451dfaaf3faSPeter Zijlstra } 4528eddac3fSPeter Zijlstra 453e196e479SYuyang Du void lockdep_init_task(struct task_struct *task) 454e196e479SYuyang Du { 455e196e479SYuyang Du task->lockdep_depth = 0; /* no locks held yet */ 456f6ec8829SYuyang Du task->curr_chain_key = INITIAL_CHAIN_KEY; 457e196e479SYuyang Du task->lockdep_recursion = 0; 458e196e479SYuyang Du } 459e196e479SYuyang Du 4604d004099SPeter Zijlstra static __always_inline void lockdep_recursion_inc(void) 4614d004099SPeter Zijlstra { 4624d004099SPeter Zijlstra __this_cpu_inc(lockdep_recursion); 4634d004099SPeter Zijlstra } 4644d004099SPeter Zijlstra 4656eebad1aSPeter Zijlstra static __always_inline void lockdep_recursion_finish(void) 46610476e63SPeter Zijlstra { 4674d004099SPeter Zijlstra if (WARN_ON_ONCE(__this_cpu_dec_return(lockdep_recursion))) 4684d004099SPeter Zijlstra __this_cpu_write(lockdep_recursion, 0); 46910476e63SPeter Zijlstra } 47010476e63SPeter Zijlstra 471cdc84d79SBart Van Assche void lockdep_set_selftest_task(struct task_struct *task) 472cdc84d79SBart Van Assche { 473cdc84d79SBart Van Assche lockdep_selftest_task_struct = task; 474cdc84d79SBart Van Assche } 475cdc84d79SBart Van Assche 4768eddac3fSPeter Zijlstra /* 4778eddac3fSPeter Zijlstra * Debugging switches: 4788eddac3fSPeter Zijlstra */ 4798eddac3fSPeter Zijlstra 4808eddac3fSPeter Zijlstra #define VERBOSE 0 4818eddac3fSPeter Zijlstra #define VERY_VERBOSE 0 4828eddac3fSPeter Zijlstra 4838eddac3fSPeter Zijlstra #if VERBOSE 4848eddac3fSPeter Zijlstra # define HARDIRQ_VERBOSE 1 4858eddac3fSPeter Zijlstra # define SOFTIRQ_VERBOSE 1 4868eddac3fSPeter Zijlstra #else 4878eddac3fSPeter Zijlstra # define HARDIRQ_VERBOSE 0 4888eddac3fSPeter Zijlstra # define SOFTIRQ_VERBOSE 0 4898eddac3fSPeter Zijlstra #endif 4908eddac3fSPeter Zijlstra 491d92a8cfcSPeter Zijlstra #if VERBOSE || HARDIRQ_VERBOSE || SOFTIRQ_VERBOSE 4928eddac3fSPeter Zijlstra /* 4938eddac3fSPeter Zijlstra * Quick filtering for interesting events: 4948eddac3fSPeter Zijlstra */ 4958eddac3fSPeter Zijlstra static int class_filter(struct lock_class *class) 4968eddac3fSPeter Zijlstra { 4978eddac3fSPeter Zijlstra #if 0 4988eddac3fSPeter Zijlstra /* Example */ 4998eddac3fSPeter Zijlstra if (class->name_version == 1 && 5008eddac3fSPeter Zijlstra !strcmp(class->name, "lockname")) 5018eddac3fSPeter Zijlstra return 1; 5028eddac3fSPeter Zijlstra if (class->name_version == 1 && 5038eddac3fSPeter Zijlstra !strcmp(class->name, "&struct->lockfield")) 5048eddac3fSPeter Zijlstra return 1; 5058eddac3fSPeter Zijlstra #endif 5068eddac3fSPeter Zijlstra /* Filter everything else. 1 would be to allow everything else */ 5078eddac3fSPeter Zijlstra return 0; 5088eddac3fSPeter Zijlstra } 5098eddac3fSPeter Zijlstra #endif 5108eddac3fSPeter Zijlstra 5118eddac3fSPeter Zijlstra static int verbose(struct lock_class *class) 5128eddac3fSPeter Zijlstra { 5138eddac3fSPeter Zijlstra #if VERBOSE 5148eddac3fSPeter Zijlstra return class_filter(class); 5158eddac3fSPeter Zijlstra #endif 5168eddac3fSPeter Zijlstra return 0; 5178eddac3fSPeter Zijlstra } 5188eddac3fSPeter Zijlstra 5198eddac3fSPeter Zijlstra static void print_lockdep_off(const char *bug_msg) 5208eddac3fSPeter Zijlstra { 5218eddac3fSPeter Zijlstra printk(KERN_DEBUG "%s\n", bug_msg); 5228eddac3fSPeter Zijlstra printk(KERN_DEBUG "turning off the locking correctness validator.\n"); 523acf59377SAndreas Gruenbacher #ifdef CONFIG_LOCK_STAT 5248eddac3fSPeter Zijlstra printk(KERN_DEBUG "Please attach the output of /proc/lock_stat to the bug report\n"); 525acf59377SAndreas Gruenbacher #endif 5268eddac3fSPeter Zijlstra } 5278eddac3fSPeter Zijlstra 528886532aeSArnd Bergmann unsigned long nr_stack_trace_entries; 529886532aeSArnd Bergmann 53030a35f79SArnd Bergmann #ifdef CONFIG_PROVE_LOCKING 53112593b74SBart Van Assche /** 53212593b74SBart Van Assche * struct lock_trace - single stack backtrace 53312593b74SBart Van Assche * @hash_entry: Entry in a stack_trace_hash[] list. 53412593b74SBart Van Assche * @hash: jhash() of @entries. 53512593b74SBart Van Assche * @nr_entries: Number of entries in @entries. 53612593b74SBart Van Assche * @entries: Actual stack backtrace. 53712593b74SBart Van Assche */ 53812593b74SBart Van Assche struct lock_trace { 53912593b74SBart Van Assche struct hlist_node hash_entry; 54012593b74SBart Van Assche u32 hash; 54112593b74SBart Van Assche u32 nr_entries; 542db78538cSGustavo A. R. Silva unsigned long entries[] __aligned(sizeof(unsigned long)); 54312593b74SBart Van Assche }; 54412593b74SBart Van Assche #define LOCK_TRACE_SIZE_IN_LONGS \ 54512593b74SBart Van Assche (sizeof(struct lock_trace) / sizeof(unsigned long)) 546886532aeSArnd Bergmann /* 54712593b74SBart Van Assche * Stack-trace: sequence of lock_trace structures. Protected by the graph_lock. 548886532aeSArnd Bergmann */ 549886532aeSArnd Bergmann static unsigned long stack_trace[MAX_STACK_TRACE_ENTRIES]; 55012593b74SBart Van Assche static struct hlist_head stack_trace_hash[STACK_TRACE_HASH_SIZE]; 551886532aeSArnd Bergmann 55212593b74SBart Van Assche static bool traces_identical(struct lock_trace *t1, struct lock_trace *t2) 5538eddac3fSPeter Zijlstra { 55412593b74SBart Van Assche return t1->hash == t2->hash && t1->nr_entries == t2->nr_entries && 55512593b74SBart Van Assche memcmp(t1->entries, t2->entries, 55612593b74SBart Van Assche t1->nr_entries * sizeof(t1->entries[0])) == 0; 55712593b74SBart Van Assche } 55812593b74SBart Van Assche 55912593b74SBart Van Assche static struct lock_trace *save_trace(void) 56012593b74SBart Van Assche { 56112593b74SBart Van Assche struct lock_trace *trace, *t2; 56212593b74SBart Van Assche struct hlist_head *hash_head; 56312593b74SBart Van Assche u32 hash; 564d91f3057SWaiman Long int max_entries; 5658eddac3fSPeter Zijlstra 56612593b74SBart Van Assche BUILD_BUG_ON_NOT_POWER_OF_2(STACK_TRACE_HASH_SIZE); 56712593b74SBart Van Assche BUILD_BUG_ON(LOCK_TRACE_SIZE_IN_LONGS >= MAX_STACK_TRACE_ENTRIES); 5688eddac3fSPeter Zijlstra 56912593b74SBart Van Assche trace = (struct lock_trace *)(stack_trace + nr_stack_trace_entries); 57012593b74SBart Van Assche max_entries = MAX_STACK_TRACE_ENTRIES - nr_stack_trace_entries - 57112593b74SBart Van Assche LOCK_TRACE_SIZE_IN_LONGS; 57212593b74SBart Van Assche 573d91f3057SWaiman Long if (max_entries <= 0) { 5748eddac3fSPeter Zijlstra if (!debug_locks_off_graph_unlock()) 57512593b74SBart Van Assche return NULL; 5768eddac3fSPeter Zijlstra 577*59cd94efSJohn Ogness nbcon_cpu_emergency_enter(); 5788eddac3fSPeter Zijlstra print_lockdep_off("BUG: MAX_STACK_TRACE_ENTRIES too low!"); 5798eddac3fSPeter Zijlstra dump_stack(); 580*59cd94efSJohn Ogness nbcon_cpu_emergency_exit(); 5818eddac3fSPeter Zijlstra 58212593b74SBart Van Assche return NULL; 5838eddac3fSPeter Zijlstra } 584d91f3057SWaiman Long trace->nr_entries = stack_trace_save(trace->entries, max_entries, 3); 5858eddac3fSPeter Zijlstra 58612593b74SBart Van Assche hash = jhash(trace->entries, trace->nr_entries * 58712593b74SBart Van Assche sizeof(trace->entries[0]), 0); 58812593b74SBart Van Assche trace->hash = hash; 58912593b74SBart Van Assche hash_head = stack_trace_hash + (hash & (STACK_TRACE_HASH_SIZE - 1)); 59012593b74SBart Van Assche hlist_for_each_entry(t2, hash_head, hash_entry) { 59112593b74SBart Van Assche if (traces_identical(trace, t2)) 59212593b74SBart Van Assche return t2; 59312593b74SBart Van Assche } 59412593b74SBart Van Assche nr_stack_trace_entries += LOCK_TRACE_SIZE_IN_LONGS + trace->nr_entries; 59512593b74SBart Van Assche hlist_add_head(&trace->hash_entry, hash_head); 59612593b74SBart Van Assche 59712593b74SBart Van Assche return trace; 5988eddac3fSPeter Zijlstra } 5998c779229SBart Van Assche 6008c779229SBart Van Assche /* Return the number of stack traces in the stack_trace[] array. */ 6018c779229SBart Van Assche u64 lockdep_stack_trace_count(void) 6028c779229SBart Van Assche { 6038c779229SBart Van Assche struct lock_trace *trace; 6048c779229SBart Van Assche u64 c = 0; 6058c779229SBart Van Assche int i; 6068c779229SBart Van Assche 6078c779229SBart Van Assche for (i = 0; i < ARRAY_SIZE(stack_trace_hash); i++) { 6088c779229SBart Van Assche hlist_for_each_entry(trace, &stack_trace_hash[i], hash_entry) { 6098c779229SBart Van Assche c++; 6108c779229SBart Van Assche } 6118c779229SBart Van Assche } 6128c779229SBart Van Assche 6138c779229SBart Van Assche return c; 6148c779229SBart Van Assche } 6158c779229SBart Van Assche 6168c779229SBart Van Assche /* Return the number of stack hash chains that have at least one stack trace. */ 6178c779229SBart Van Assche u64 lockdep_stack_hash_count(void) 6188c779229SBart Van Assche { 6198c779229SBart Van Assche u64 c = 0; 6208c779229SBart Van Assche int i; 6218c779229SBart Van Assche 6228c779229SBart Van Assche for (i = 0; i < ARRAY_SIZE(stack_trace_hash); i++) 6238c779229SBart Van Assche if (!hlist_empty(&stack_trace_hash[i])) 6248c779229SBart Van Assche c++; 6258c779229SBart Van Assche 6268c779229SBart Van Assche return c; 6278eddac3fSPeter Zijlstra } 628886532aeSArnd Bergmann #endif 6298eddac3fSPeter Zijlstra 6308eddac3fSPeter Zijlstra unsigned int nr_hardirq_chains; 6318eddac3fSPeter Zijlstra unsigned int nr_softirq_chains; 6328eddac3fSPeter Zijlstra unsigned int nr_process_chains; 6338eddac3fSPeter Zijlstra unsigned int max_lockdep_depth; 6348eddac3fSPeter Zijlstra 6358eddac3fSPeter Zijlstra #ifdef CONFIG_DEBUG_LOCKDEP 6368eddac3fSPeter Zijlstra /* 6378eddac3fSPeter Zijlstra * Various lockdep statistics: 6388eddac3fSPeter Zijlstra */ 6398eddac3fSPeter Zijlstra DEFINE_PER_CPU(struct lockdep_stats, lockdep_stats); 6408eddac3fSPeter Zijlstra #endif 6418eddac3fSPeter Zijlstra 64230a35f79SArnd Bergmann #ifdef CONFIG_PROVE_LOCKING 6438eddac3fSPeter Zijlstra /* 6448eddac3fSPeter Zijlstra * Locking printouts: 6458eddac3fSPeter Zijlstra */ 6468eddac3fSPeter Zijlstra 6478eddac3fSPeter Zijlstra #define __USAGE(__STATE) \ 6488eddac3fSPeter Zijlstra [LOCK_USED_IN_##__STATE] = "IN-"__stringify(__STATE)"-W", \ 6498eddac3fSPeter Zijlstra [LOCK_ENABLED_##__STATE] = __stringify(__STATE)"-ON-W", \ 6508eddac3fSPeter Zijlstra [LOCK_USED_IN_##__STATE##_READ] = "IN-"__stringify(__STATE)"-R",\ 6518eddac3fSPeter Zijlstra [LOCK_ENABLED_##__STATE##_READ] = __stringify(__STATE)"-ON-R", 6528eddac3fSPeter Zijlstra 6538eddac3fSPeter Zijlstra static const char *usage_str[] = 6548eddac3fSPeter Zijlstra { 6558eddac3fSPeter Zijlstra #define LOCKDEP_STATE(__STATE) __USAGE(__STATE) 6568eddac3fSPeter Zijlstra #include "lockdep_states.h" 6578eddac3fSPeter Zijlstra #undef LOCKDEP_STATE 6588eddac3fSPeter Zijlstra [LOCK_USED] = "INITIAL USE", 6592bb8945bSPeter Zijlstra [LOCK_USED_READ] = "INITIAL READ USE", 6602bb8945bSPeter Zijlstra /* abused as string storage for verify_lock_unused() */ 661f6f48e18SPeter Zijlstra [LOCK_USAGE_STATES] = "IN-NMI", 6628eddac3fSPeter Zijlstra }; 663886532aeSArnd Bergmann #endif 6648eddac3fSPeter Zijlstra 665364f6afcSBart Van Assche const char *__get_key_name(const struct lockdep_subclass_key *key, char *str) 6668eddac3fSPeter Zijlstra { 6678eddac3fSPeter Zijlstra return kallsyms_lookup((unsigned long)key, NULL, NULL, NULL, str); 6688eddac3fSPeter Zijlstra } 6698eddac3fSPeter Zijlstra 6708eddac3fSPeter Zijlstra static inline unsigned long lock_flag(enum lock_usage_bit bit) 6718eddac3fSPeter Zijlstra { 6728eddac3fSPeter Zijlstra return 1UL << bit; 6738eddac3fSPeter Zijlstra } 6748eddac3fSPeter Zijlstra 6758eddac3fSPeter Zijlstra static char get_usage_char(struct lock_class *class, enum lock_usage_bit bit) 6768eddac3fSPeter Zijlstra { 677c52478f4SYuyang Du /* 678c52478f4SYuyang Du * The usage character defaults to '.' (i.e., irqs disabled and not in 679c52478f4SYuyang Du * irq context), which is the safest usage category. 680c52478f4SYuyang Du */ 6818eddac3fSPeter Zijlstra char c = '.'; 6828eddac3fSPeter Zijlstra 683c52478f4SYuyang Du /* 684c52478f4SYuyang Du * The order of the following usage checks matters, which will 685c52478f4SYuyang Du * result in the outcome character as follows: 686c52478f4SYuyang Du * 687c52478f4SYuyang Du * - '+': irq is enabled and not in irq context 688c52478f4SYuyang Du * - '-': in irq context and irq is disabled 689c52478f4SYuyang Du * - '?': in irq context and irq is enabled 690c52478f4SYuyang Du */ 691c52478f4SYuyang Du if (class->usage_mask & lock_flag(bit + LOCK_USAGE_DIR_MASK)) { 6928eddac3fSPeter Zijlstra c = '+'; 693c52478f4SYuyang Du if (class->usage_mask & lock_flag(bit)) 6948eddac3fSPeter Zijlstra c = '?'; 695c52478f4SYuyang Du } else if (class->usage_mask & lock_flag(bit)) 696c52478f4SYuyang Du c = '-'; 6978eddac3fSPeter Zijlstra 6988eddac3fSPeter Zijlstra return c; 6998eddac3fSPeter Zijlstra } 7008eddac3fSPeter Zijlstra 7018eddac3fSPeter Zijlstra void get_usage_chars(struct lock_class *class, char usage[LOCK_USAGE_CHARS]) 7028eddac3fSPeter Zijlstra { 7038eddac3fSPeter Zijlstra int i = 0; 7048eddac3fSPeter Zijlstra 7058eddac3fSPeter Zijlstra #define LOCKDEP_STATE(__STATE) \ 7068eddac3fSPeter Zijlstra usage[i++] = get_usage_char(class, LOCK_USED_IN_##__STATE); \ 7078eddac3fSPeter Zijlstra usage[i++] = get_usage_char(class, LOCK_USED_IN_##__STATE##_READ); 7088eddac3fSPeter Zijlstra #include "lockdep_states.h" 7098eddac3fSPeter Zijlstra #undef LOCKDEP_STATE 7108eddac3fSPeter Zijlstra 7118eddac3fSPeter Zijlstra usage[i] = '\0'; 7128eddac3fSPeter Zijlstra } 7138eddac3fSPeter Zijlstra 714eb1cfd09SKent Overstreet static void __print_lock_name(struct held_lock *hlock, struct lock_class *class) 7158eddac3fSPeter Zijlstra { 7168eddac3fSPeter Zijlstra char str[KSYM_NAME_LEN]; 7178eddac3fSPeter Zijlstra const char *name; 7188eddac3fSPeter Zijlstra 7198eddac3fSPeter Zijlstra name = class->name; 7208eddac3fSPeter Zijlstra if (!name) { 7218eddac3fSPeter Zijlstra name = __get_key_name(class->key, str); 722f943fe0fSDmitry Vyukov printk(KERN_CONT "%s", name); 7238eddac3fSPeter Zijlstra } else { 724f943fe0fSDmitry Vyukov printk(KERN_CONT "%s", name); 7258eddac3fSPeter Zijlstra if (class->name_version > 1) 726f943fe0fSDmitry Vyukov printk(KERN_CONT "#%d", class->name_version); 7278eddac3fSPeter Zijlstra if (class->subclass) 728f943fe0fSDmitry Vyukov printk(KERN_CONT "/%d", class->subclass); 729eb1cfd09SKent Overstreet if (hlock && class->print_fn) 730eb1cfd09SKent Overstreet class->print_fn(hlock->instance); 7318eddac3fSPeter Zijlstra } 7328eddac3fSPeter Zijlstra } 7338eddac3fSPeter Zijlstra 734eb1cfd09SKent Overstreet static void print_lock_name(struct held_lock *hlock, struct lock_class *class) 7358eddac3fSPeter Zijlstra { 7368eddac3fSPeter Zijlstra char usage[LOCK_USAGE_CHARS]; 7378eddac3fSPeter Zijlstra 7388eddac3fSPeter Zijlstra get_usage_chars(class, usage); 7398eddac3fSPeter Zijlstra 740f943fe0fSDmitry Vyukov printk(KERN_CONT " ("); 741eb1cfd09SKent Overstreet __print_lock_name(hlock, class); 7426d48b791SArnd Bergmann printk(KERN_CONT "){%s}-{%d:%d}", usage, 743de8f5e4fSPeter Zijlstra class->wait_type_outer ?: class->wait_type_inner, 744de8f5e4fSPeter Zijlstra class->wait_type_inner); 7458eddac3fSPeter Zijlstra } 7468eddac3fSPeter Zijlstra 7478eddac3fSPeter Zijlstra static void print_lockdep_cache(struct lockdep_map *lock) 7488eddac3fSPeter Zijlstra { 7498eddac3fSPeter Zijlstra const char *name; 7508eddac3fSPeter Zijlstra char str[KSYM_NAME_LEN]; 7518eddac3fSPeter Zijlstra 7528eddac3fSPeter Zijlstra name = lock->name; 7538eddac3fSPeter Zijlstra if (!name) 7548eddac3fSPeter Zijlstra name = __get_key_name(lock->key->subkeys, str); 7558eddac3fSPeter Zijlstra 756f943fe0fSDmitry Vyukov printk(KERN_CONT "%s", name); 7578eddac3fSPeter Zijlstra } 7588eddac3fSPeter Zijlstra 7598eddac3fSPeter Zijlstra static void print_lock(struct held_lock *hlock) 7608eddac3fSPeter Zijlstra { 761d7bc3197SPeter Zijlstra /* 762d7bc3197SPeter Zijlstra * We can be called locklessly through debug_show_all_locks() so be 763d7bc3197SPeter Zijlstra * extra careful, the hlock might have been released and cleared. 76401bb6f0aSYuyang Du * 76501bb6f0aSYuyang Du * If this indeed happens, lets pretend it does not hurt to continue 76601bb6f0aSYuyang Du * to print the lock unless the hlock class_idx does not point to a 76701bb6f0aSYuyang Du * registered class. The rationale here is: since we don't attempt 76801bb6f0aSYuyang Du * to distinguish whether we are in this situation, if it just 76901bb6f0aSYuyang Du * happened we can't count on class_idx to tell either. 770d7bc3197SPeter Zijlstra */ 77101bb6f0aSYuyang Du struct lock_class *lock = hlock_class(hlock); 772d7bc3197SPeter Zijlstra 77301bb6f0aSYuyang Du if (!lock) { 774f943fe0fSDmitry Vyukov printk(KERN_CONT "<RELEASED>\n"); 775d7bc3197SPeter Zijlstra return; 776d7bc3197SPeter Zijlstra } 777d7bc3197SPeter Zijlstra 778519248f3SPaul E. McKenney printk(KERN_CONT "%px", hlock->instance); 779eb1cfd09SKent Overstreet print_lock_name(hlock, lock); 780b3c39758STetsuo Handa printk(KERN_CONT ", at: %pS\n", (void *)hlock->acquire_ip); 7818eddac3fSPeter Zijlstra } 7828eddac3fSPeter Zijlstra 7838cc05c71STetsuo Handa static void lockdep_print_held_locks(struct task_struct *p) 7848eddac3fSPeter Zijlstra { 7858cc05c71STetsuo Handa int i, depth = READ_ONCE(p->lockdep_depth); 7868eddac3fSPeter Zijlstra 7878cc05c71STetsuo Handa if (!depth) 7888cc05c71STetsuo Handa printk("no locks held by %s/%d.\n", p->comm, task_pid_nr(p)); 7898cc05c71STetsuo Handa else 7908cc05c71STetsuo Handa printk("%d lock%s held by %s/%d:\n", depth, 7918cc05c71STetsuo Handa depth > 1 ? "s" : "", p->comm, task_pid_nr(p)); 7928cc05c71STetsuo Handa /* 7938cc05c71STetsuo Handa * It's not reliable to print a task's held locks if it's not sleeping 7948cc05c71STetsuo Handa * and it's not the current task. 7958cc05c71STetsuo Handa */ 796b03fbd4fSPeter Zijlstra if (p != current && task_is_running(p)) 7978eddac3fSPeter Zijlstra return; 7988eddac3fSPeter Zijlstra for (i = 0; i < depth; i++) { 7998eddac3fSPeter Zijlstra printk(" #%d: ", i); 8008cc05c71STetsuo Handa print_lock(p->held_locks + i); 8018eddac3fSPeter Zijlstra } 8028eddac3fSPeter Zijlstra } 8038eddac3fSPeter Zijlstra 8048eddac3fSPeter Zijlstra static void print_kernel_ident(void) 8058eddac3fSPeter Zijlstra { 8068eddac3fSPeter Zijlstra printk("%s %.*s %s\n", init_utsname()->release, 8078eddac3fSPeter Zijlstra (int)strcspn(init_utsname()->version, " "), 8088eddac3fSPeter Zijlstra init_utsname()->version, 8098eddac3fSPeter Zijlstra print_tainted()); 8108eddac3fSPeter Zijlstra } 8118eddac3fSPeter Zijlstra 8128eddac3fSPeter Zijlstra static int very_verbose(struct lock_class *class) 8138eddac3fSPeter Zijlstra { 8148eddac3fSPeter Zijlstra #if VERY_VERBOSE 8158eddac3fSPeter Zijlstra return class_filter(class); 8168eddac3fSPeter Zijlstra #endif 8178eddac3fSPeter Zijlstra return 0; 8188eddac3fSPeter Zijlstra } 8198eddac3fSPeter Zijlstra 8208eddac3fSPeter Zijlstra /* 8218eddac3fSPeter Zijlstra * Is this the address of a static object: 8228eddac3fSPeter Zijlstra */ 8238dce7a9aSSasha Levin #ifdef __KERNEL__ 824108c1485SBart Van Assche static int static_obj(const void *obj) 8258eddac3fSPeter Zijlstra { 8260a6b58c5SHelge Deller unsigned long addr = (unsigned long) obj; 8278eddac3fSPeter Zijlstra 8280a6b58c5SHelge Deller if (is_kernel_core_data(addr)) 8290a6b58c5SHelge Deller return 1; 8307a5da02dSGerald Schaefer 8318eddac3fSPeter Zijlstra /* 8320a6b58c5SHelge Deller * keys are allowed in the __ro_after_init section. 8338eddac3fSPeter Zijlstra */ 8340a6b58c5SHelge Deller if (is_kernel_rodata(addr)) 8350a6b58c5SHelge Deller return 1; 8360a6b58c5SHelge Deller 8370a6b58c5SHelge Deller /* 8380a6b58c5SHelge Deller * in initdata section and used during bootup only? 8390a6b58c5SHelge Deller * NOTE: On some platforms the initdata section is 8400a6b58c5SHelge Deller * outside of the _stext ... _end range. 8410a6b58c5SHelge Deller */ 8420a6b58c5SHelge Deller if (system_state < SYSTEM_FREEING_INITMEM && 8430a6b58c5SHelge Deller init_section_contains((void *)addr, 1)) 8448eddac3fSPeter Zijlstra return 1; 8458eddac3fSPeter Zijlstra 8468eddac3fSPeter Zijlstra /* 8478eddac3fSPeter Zijlstra * in-kernel percpu var? 8488eddac3fSPeter Zijlstra */ 8498eddac3fSPeter Zijlstra if (is_kernel_percpu_address(addr)) 8508eddac3fSPeter Zijlstra return 1; 8518eddac3fSPeter Zijlstra 8528eddac3fSPeter Zijlstra /* 8538eddac3fSPeter Zijlstra * module static or percpu var? 8548eddac3fSPeter Zijlstra */ 8558eddac3fSPeter Zijlstra return is_module_address(addr) || is_module_percpu_address(addr); 8568eddac3fSPeter Zijlstra } 8578dce7a9aSSasha Levin #endif 8588eddac3fSPeter Zijlstra 8598eddac3fSPeter Zijlstra /* 8608eddac3fSPeter Zijlstra * To make lock name printouts unique, we calculate a unique 861fe27b0deSBart Van Assche * class->name_version generation counter. The caller must hold the graph 862fe27b0deSBart Van Assche * lock. 8638eddac3fSPeter Zijlstra */ 8648eddac3fSPeter Zijlstra static int count_matching_names(struct lock_class *new_class) 8658eddac3fSPeter Zijlstra { 8668eddac3fSPeter Zijlstra struct lock_class *class; 8678eddac3fSPeter Zijlstra int count = 0; 8688eddac3fSPeter Zijlstra 8698eddac3fSPeter Zijlstra if (!new_class->name) 8708eddac3fSPeter Zijlstra return 0; 8718eddac3fSPeter Zijlstra 872fe27b0deSBart Van Assche list_for_each_entry(class, &all_lock_classes, lock_entry) { 8738eddac3fSPeter Zijlstra if (new_class->key - new_class->subclass == class->key) 8748eddac3fSPeter Zijlstra return class->name_version; 8758eddac3fSPeter Zijlstra if (class->name && !strcmp(class->name, new_class->name)) 8768eddac3fSPeter Zijlstra count = max(count, class->name_version); 8778eddac3fSPeter Zijlstra } 8788eddac3fSPeter Zijlstra 8798eddac3fSPeter Zijlstra return count + 1; 8808eddac3fSPeter Zijlstra } 8818eddac3fSPeter Zijlstra 882f6f48e18SPeter Zijlstra /* used from NMI context -- must be lockless */ 88349faa777SPeter Zijlstra static noinstr struct lock_class * 88408f36ff6SMatthew Wilcox look_up_lock_class(const struct lockdep_map *lock, unsigned int subclass) 8858eddac3fSPeter Zijlstra { 8868eddac3fSPeter Zijlstra struct lockdep_subclass_key *key; 887a63f38ccSAndrew Morton struct hlist_head *hash_head; 8888eddac3fSPeter Zijlstra struct lock_class *class; 8898eddac3fSPeter Zijlstra 8908eddac3fSPeter Zijlstra if (unlikely(subclass >= MAX_LOCKDEP_SUBCLASSES)) { 89149faa777SPeter Zijlstra instrumentation_begin(); 8928eddac3fSPeter Zijlstra debug_locks_off(); 893*59cd94efSJohn Ogness nbcon_cpu_emergency_enter(); 8948eddac3fSPeter Zijlstra printk(KERN_ERR 8958eddac3fSPeter Zijlstra "BUG: looking up invalid subclass: %u\n", subclass); 8968eddac3fSPeter Zijlstra printk(KERN_ERR 8978eddac3fSPeter Zijlstra "turning off the locking correctness validator.\n"); 8988eddac3fSPeter Zijlstra dump_stack(); 899*59cd94efSJohn Ogness nbcon_cpu_emergency_exit(); 90049faa777SPeter Zijlstra instrumentation_end(); 9018eddac3fSPeter Zijlstra return NULL; 9028eddac3fSPeter Zijlstra } 9038eddac3fSPeter Zijlstra 9048eddac3fSPeter Zijlstra /* 90564f29d1bSMatthew Wilcox * If it is not initialised then it has never been locked, 90664f29d1bSMatthew Wilcox * so it won't be present in the hash table. 9078eddac3fSPeter Zijlstra */ 90864f29d1bSMatthew Wilcox if (unlikely(!lock->key)) 90964f29d1bSMatthew Wilcox return NULL; 9108eddac3fSPeter Zijlstra 9118eddac3fSPeter Zijlstra /* 9128eddac3fSPeter Zijlstra * NOTE: the class-key must be unique. For dynamic locks, a static 9138eddac3fSPeter Zijlstra * lock_class_key variable is passed in through the mutex_init() 9148eddac3fSPeter Zijlstra * (or spin_lock_init()) call - which acts as the key. For static 9158eddac3fSPeter Zijlstra * locks we use the lock object itself as the key. 9168eddac3fSPeter Zijlstra */ 9178eddac3fSPeter Zijlstra BUILD_BUG_ON(sizeof(struct lock_class_key) > 9188eddac3fSPeter Zijlstra sizeof(struct lockdep_map)); 9198eddac3fSPeter Zijlstra 9208eddac3fSPeter Zijlstra key = lock->key->subkeys + subclass; 9218eddac3fSPeter Zijlstra 9228eddac3fSPeter Zijlstra hash_head = classhashentry(key); 9238eddac3fSPeter Zijlstra 9248eddac3fSPeter Zijlstra /* 92535a9393cSPeter Zijlstra * We do an RCU walk of the hash, see lockdep_free_key_range(). 9268eddac3fSPeter Zijlstra */ 92735a9393cSPeter Zijlstra if (DEBUG_LOCKS_WARN_ON(!irqs_disabled())) 92835a9393cSPeter Zijlstra return NULL; 92935a9393cSPeter Zijlstra 930ce0b9c80SPeter Zijlstra hlist_for_each_entry_rcu_notrace(class, hash_head, hash_entry) { 9318eddac3fSPeter Zijlstra if (class->key == key) { 9328eddac3fSPeter Zijlstra /* 9338eddac3fSPeter Zijlstra * Huh! same key, different name? Did someone trample 9348eddac3fSPeter Zijlstra * on some memory? We're most confused. 9358eddac3fSPeter Zijlstra */ 93676e64c73STetsuo Handa WARN_ONCE(class->name != lock->name && 93776e64c73STetsuo Handa lock->key != &__lockdep_no_validate__, 93876e64c73STetsuo Handa "Looking for class \"%s\" with key %ps, but found a different class \"%s\" with the same key\n", 93976e64c73STetsuo Handa lock->name, lock->key, class->name); 9408eddac3fSPeter Zijlstra return class; 9418eddac3fSPeter Zijlstra } 9428eddac3fSPeter Zijlstra } 9438eddac3fSPeter Zijlstra 94464f29d1bSMatthew Wilcox return NULL; 94564f29d1bSMatthew Wilcox } 94664f29d1bSMatthew Wilcox 94764f29d1bSMatthew Wilcox /* 94864f29d1bSMatthew Wilcox * Static locks do not have their class-keys yet - for them the key is 94964f29d1bSMatthew Wilcox * the lock object itself. If the lock is in the per cpu area, the 95064f29d1bSMatthew Wilcox * canonical address of the lock (per cpu offset removed) is used. 95164f29d1bSMatthew Wilcox */ 95264f29d1bSMatthew Wilcox static bool assign_lock_key(struct lockdep_map *lock) 95364f29d1bSMatthew Wilcox { 95464f29d1bSMatthew Wilcox unsigned long can_addr, addr = (unsigned long)lock; 95564f29d1bSMatthew Wilcox 9564bf50862SBart Van Assche #ifdef __KERNEL__ 9574bf50862SBart Van Assche /* 9584bf50862SBart Van Assche * lockdep_free_key_range() assumes that struct lock_class_key 9594bf50862SBart Van Assche * objects do not overlap. Since we use the address of lock 9604bf50862SBart Van Assche * objects as class key for static objects, check whether the 9614bf50862SBart Van Assche * size of lock_class_key objects does not exceed the size of 9624bf50862SBart Van Assche * the smallest lock object. 9634bf50862SBart Van Assche */ 9644bf50862SBart Van Assche BUILD_BUG_ON(sizeof(struct lock_class_key) > sizeof(raw_spinlock_t)); 9654bf50862SBart Van Assche #endif 9664bf50862SBart Van Assche 96764f29d1bSMatthew Wilcox if (__is_kernel_percpu_address(addr, &can_addr)) 96864f29d1bSMatthew Wilcox lock->key = (void *)can_addr; 96964f29d1bSMatthew Wilcox else if (__is_module_percpu_address(addr, &can_addr)) 97064f29d1bSMatthew Wilcox lock->key = (void *)can_addr; 97164f29d1bSMatthew Wilcox else if (static_obj(lock)) 97264f29d1bSMatthew Wilcox lock->key = (void *)lock; 97364f29d1bSMatthew Wilcox else { 97464f29d1bSMatthew Wilcox /* Debug-check: all keys must be persistent! */ 97564f29d1bSMatthew Wilcox debug_locks_off(); 976*59cd94efSJohn Ogness nbcon_cpu_emergency_enter(); 97764f29d1bSMatthew Wilcox pr_err("INFO: trying to register non-static key.\n"); 9783a85969eSTetsuo Handa pr_err("The code is fine but needs lockdep annotation, or maybe\n"); 9793a85969eSTetsuo Handa pr_err("you didn't initialize this object before use?\n"); 98064f29d1bSMatthew Wilcox pr_err("turning off the locking correctness validator.\n"); 98164f29d1bSMatthew Wilcox dump_stack(); 982*59cd94efSJohn Ogness nbcon_cpu_emergency_exit(); 98364f29d1bSMatthew Wilcox return false; 98464f29d1bSMatthew Wilcox } 98564f29d1bSMatthew Wilcox 98664f29d1bSMatthew Wilcox return true; 9878eddac3fSPeter Zijlstra } 9888eddac3fSPeter Zijlstra 98972dcd505SPeter Zijlstra #ifdef CONFIG_DEBUG_LOCKDEP 99072dcd505SPeter Zijlstra 991b526b2e3SBart Van Assche /* Check whether element @e occurs in list @h */ 992b526b2e3SBart Van Assche static bool in_list(struct list_head *e, struct list_head *h) 993b526b2e3SBart Van Assche { 994b526b2e3SBart Van Assche struct list_head *f; 995b526b2e3SBart Van Assche 996b526b2e3SBart Van Assche list_for_each(f, h) { 997b526b2e3SBart Van Assche if (e == f) 998b526b2e3SBart Van Assche return true; 999b526b2e3SBart Van Assche } 1000b526b2e3SBart Van Assche 1001b526b2e3SBart Van Assche return false; 1002b526b2e3SBart Van Assche } 1003b526b2e3SBart Van Assche 1004b526b2e3SBart Van Assche /* 1005b526b2e3SBart Van Assche * Check whether entry @e occurs in any of the locks_after or locks_before 1006b526b2e3SBart Van Assche * lists. 1007b526b2e3SBart Van Assche */ 1008b526b2e3SBart Van Assche static bool in_any_class_list(struct list_head *e) 1009b526b2e3SBart Van Assche { 1010b526b2e3SBart Van Assche struct lock_class *class; 1011b526b2e3SBart Van Assche int i; 1012b526b2e3SBart Van Assche 1013b526b2e3SBart Van Assche for (i = 0; i < ARRAY_SIZE(lock_classes); i++) { 1014b526b2e3SBart Van Assche class = &lock_classes[i]; 1015b526b2e3SBart Van Assche if (in_list(e, &class->locks_after) || 1016b526b2e3SBart Van Assche in_list(e, &class->locks_before)) 1017b526b2e3SBart Van Assche return true; 1018b526b2e3SBart Van Assche } 1019b526b2e3SBart Van Assche return false; 1020b526b2e3SBart Van Assche } 1021b526b2e3SBart Van Assche 1022b526b2e3SBart Van Assche static bool class_lock_list_valid(struct lock_class *c, struct list_head *h) 1023b526b2e3SBart Van Assche { 1024b526b2e3SBart Van Assche struct lock_list *e; 1025b526b2e3SBart Van Assche 1026b526b2e3SBart Van Assche list_for_each_entry(e, h, entry) { 1027b526b2e3SBart Van Assche if (e->links_to != c) { 1028b526b2e3SBart Van Assche printk(KERN_INFO "class %s: mismatch for lock entry %ld; class %s <> %s", 1029b526b2e3SBart Van Assche c->name ? : "(?)", 1030b526b2e3SBart Van Assche (unsigned long)(e - list_entries), 1031b526b2e3SBart Van Assche e->links_to && e->links_to->name ? 1032b526b2e3SBart Van Assche e->links_to->name : "(?)", 1033b526b2e3SBart Van Assche e->class && e->class->name ? e->class->name : 1034b526b2e3SBart Van Assche "(?)"); 1035b526b2e3SBart Van Assche return false; 1036b526b2e3SBart Van Assche } 1037b526b2e3SBart Van Assche } 1038b526b2e3SBart Van Assche return true; 1039b526b2e3SBart Van Assche } 1040b526b2e3SBart Van Assche 10413fe7522fSArnd Bergmann #ifdef CONFIG_PROVE_LOCKING 10423fe7522fSArnd Bergmann static u16 chain_hlocks[MAX_LOCKDEP_CHAIN_HLOCKS]; 10433fe7522fSArnd Bergmann #endif 1044b526b2e3SBart Van Assche 1045b526b2e3SBart Van Assche static bool check_lock_chain_key(struct lock_chain *chain) 1046b526b2e3SBart Van Assche { 1047b526b2e3SBart Van Assche #ifdef CONFIG_PROVE_LOCKING 1048f6ec8829SYuyang Du u64 chain_key = INITIAL_CHAIN_KEY; 1049b526b2e3SBart Van Assche int i; 1050b526b2e3SBart Van Assche 1051b526b2e3SBart Van Assche for (i = chain->base; i < chain->base + chain->depth; i++) 105201bb6f0aSYuyang Du chain_key = iterate_chain_key(chain_key, chain_hlocks[i]); 1053b526b2e3SBart Van Assche /* 1054b526b2e3SBart Van Assche * The 'unsigned long long' casts avoid that a compiler warning 1055b526b2e3SBart Van Assche * is reported when building tools/lib/lockdep. 1056b526b2e3SBart Van Assche */ 105772dcd505SPeter Zijlstra if (chain->chain_key != chain_key) { 1058b526b2e3SBart Van Assche printk(KERN_INFO "chain %lld: key %#llx <> %#llx\n", 1059b526b2e3SBart Van Assche (unsigned long long)(chain - lock_chains), 1060b526b2e3SBart Van Assche (unsigned long long)chain->chain_key, 1061b526b2e3SBart Van Assche (unsigned long long)chain_key); 106272dcd505SPeter Zijlstra return false; 106372dcd505SPeter Zijlstra } 1064b526b2e3SBart Van Assche #endif 106572dcd505SPeter Zijlstra return true; 1066b526b2e3SBart Van Assche } 1067b526b2e3SBart Van Assche 1068b526b2e3SBart Van Assche static bool in_any_zapped_class_list(struct lock_class *class) 1069b526b2e3SBart Van Assche { 1070b526b2e3SBart Van Assche struct pending_free *pf; 1071b526b2e3SBart Van Assche int i; 1072b526b2e3SBart Van Assche 107372dcd505SPeter Zijlstra for (i = 0, pf = delayed_free.pf; i < ARRAY_SIZE(delayed_free.pf); i++, pf++) { 1074b526b2e3SBart Van Assche if (in_list(&class->lock_entry, &pf->zapped)) 1075b526b2e3SBart Van Assche return true; 107672dcd505SPeter Zijlstra } 1077b526b2e3SBart Van Assche 1078b526b2e3SBart Van Assche return false; 1079b526b2e3SBart Van Assche } 1080b526b2e3SBart Van Assche 108172dcd505SPeter Zijlstra static bool __check_data_structures(void) 1082b526b2e3SBart Van Assche { 1083b526b2e3SBart Van Assche struct lock_class *class; 1084b526b2e3SBart Van Assche struct lock_chain *chain; 1085b526b2e3SBart Van Assche struct hlist_head *head; 1086b526b2e3SBart Van Assche struct lock_list *e; 1087b526b2e3SBart Van Assche int i; 1088b526b2e3SBart Van Assche 1089b526b2e3SBart Van Assche /* Check whether all classes occur in a lock list. */ 1090b526b2e3SBart Van Assche for (i = 0; i < ARRAY_SIZE(lock_classes); i++) { 1091b526b2e3SBart Van Assche class = &lock_classes[i]; 1092b526b2e3SBart Van Assche if (!in_list(&class->lock_entry, &all_lock_classes) && 1093b526b2e3SBart Van Assche !in_list(&class->lock_entry, &free_lock_classes) && 1094b526b2e3SBart Van Assche !in_any_zapped_class_list(class)) { 1095b526b2e3SBart Van Assche printk(KERN_INFO "class %px/%s is not in any class list\n", 1096b526b2e3SBart Van Assche class, class->name ? : "(?)"); 1097b526b2e3SBart Van Assche return false; 1098b526b2e3SBart Van Assche } 1099b526b2e3SBart Van Assche } 1100b526b2e3SBart Van Assche 1101b526b2e3SBart Van Assche /* Check whether all classes have valid lock lists. */ 1102b526b2e3SBart Van Assche for (i = 0; i < ARRAY_SIZE(lock_classes); i++) { 1103b526b2e3SBart Van Assche class = &lock_classes[i]; 1104b526b2e3SBart Van Assche if (!class_lock_list_valid(class, &class->locks_before)) 1105b526b2e3SBart Van Assche return false; 1106b526b2e3SBart Van Assche if (!class_lock_list_valid(class, &class->locks_after)) 1107b526b2e3SBart Van Assche return false; 1108b526b2e3SBart Van Assche } 1109b526b2e3SBart Van Assche 1110b526b2e3SBart Van Assche /* Check the chain_key of all lock chains. */ 1111b526b2e3SBart Van Assche for (i = 0; i < ARRAY_SIZE(chainhash_table); i++) { 1112b526b2e3SBart Van Assche head = chainhash_table + i; 1113b526b2e3SBart Van Assche hlist_for_each_entry_rcu(chain, head, entry) { 1114b526b2e3SBart Van Assche if (!check_lock_chain_key(chain)) 1115b526b2e3SBart Van Assche return false; 1116b526b2e3SBart Van Assche } 1117b526b2e3SBart Van Assche } 1118b526b2e3SBart Van Assche 1119b526b2e3SBart Van Assche /* 1120b526b2e3SBart Van Assche * Check whether all list entries that are in use occur in a class 1121b526b2e3SBart Van Assche * lock list. 1122b526b2e3SBart Van Assche */ 1123b526b2e3SBart Van Assche for_each_set_bit(i, list_entries_in_use, ARRAY_SIZE(list_entries)) { 1124b526b2e3SBart Van Assche e = list_entries + i; 1125b526b2e3SBart Van Assche if (!in_any_class_list(&e->entry)) { 1126b526b2e3SBart Van Assche printk(KERN_INFO "list entry %d is not in any class list; class %s <> %s\n", 1127b526b2e3SBart Van Assche (unsigned int)(e - list_entries), 1128b526b2e3SBart Van Assche e->class->name ? : "(?)", 1129b526b2e3SBart Van Assche e->links_to->name ? : "(?)"); 1130b526b2e3SBart Van Assche return false; 1131b526b2e3SBart Van Assche } 1132b526b2e3SBart Van Assche } 1133b526b2e3SBart Van Assche 1134b526b2e3SBart Van Assche /* 1135b526b2e3SBart Van Assche * Check whether all list entries that are not in use do not occur in 1136b526b2e3SBart Van Assche * a class lock list. 1137b526b2e3SBart Van Assche */ 1138b526b2e3SBart Van Assche for_each_clear_bit(i, list_entries_in_use, ARRAY_SIZE(list_entries)) { 1139b526b2e3SBart Van Assche e = list_entries + i; 1140b526b2e3SBart Van Assche if (in_any_class_list(&e->entry)) { 1141b526b2e3SBart Van Assche printk(KERN_INFO "list entry %d occurs in a class list; class %s <> %s\n", 1142b526b2e3SBart Van Assche (unsigned int)(e - list_entries), 1143b526b2e3SBart Van Assche e->class && e->class->name ? e->class->name : 1144b526b2e3SBart Van Assche "(?)", 1145b526b2e3SBart Van Assche e->links_to && e->links_to->name ? 1146b526b2e3SBart Van Assche e->links_to->name : "(?)"); 1147b526b2e3SBart Van Assche return false; 1148b526b2e3SBart Van Assche } 1149b526b2e3SBart Van Assche } 1150b526b2e3SBart Van Assche 1151b526b2e3SBart Van Assche return true; 1152b526b2e3SBart Van Assche } 1153b526b2e3SBart Van Assche 115472dcd505SPeter Zijlstra int check_consistency = 0; 115572dcd505SPeter Zijlstra module_param(check_consistency, int, 0644); 115672dcd505SPeter Zijlstra 115772dcd505SPeter Zijlstra static void check_data_structures(void) 115872dcd505SPeter Zijlstra { 115972dcd505SPeter Zijlstra static bool once = false; 116072dcd505SPeter Zijlstra 116172dcd505SPeter Zijlstra if (check_consistency && !once) { 116272dcd505SPeter Zijlstra if (!__check_data_structures()) { 116372dcd505SPeter Zijlstra once = true; 116472dcd505SPeter Zijlstra WARN_ON(once); 116572dcd505SPeter Zijlstra } 116672dcd505SPeter Zijlstra } 116772dcd505SPeter Zijlstra } 116872dcd505SPeter Zijlstra 116972dcd505SPeter Zijlstra #else /* CONFIG_DEBUG_LOCKDEP */ 117072dcd505SPeter Zijlstra 117172dcd505SPeter Zijlstra static inline void check_data_structures(void) { } 117272dcd505SPeter Zijlstra 117372dcd505SPeter Zijlstra #endif /* CONFIG_DEBUG_LOCKDEP */ 117472dcd505SPeter Zijlstra 1175810507feSWaiman Long static void init_chain_block_buckets(void); 1176810507feSWaiman Long 11778eddac3fSPeter Zijlstra /* 1178a0b0fd53SBart Van Assche * Initialize the lock_classes[] array elements, the free_lock_classes list 1179a0b0fd53SBart Van Assche * and also the delayed_free structure. 1180feb0a386SBart Van Assche */ 1181feb0a386SBart Van Assche static void init_data_structures_once(void) 1182feb0a386SBart Van Assche { 1183810507feSWaiman Long static bool __read_mostly ds_initialized, rcu_head_initialized; 1184feb0a386SBart Van Assche int i; 1185feb0a386SBart Van Assche 11860126574fSBart Van Assche if (likely(rcu_head_initialized)) 1187feb0a386SBart Van Assche return; 1188feb0a386SBart Van Assche 11890126574fSBart Van Assche if (system_state >= SYSTEM_SCHEDULING) { 1190a0b0fd53SBart Van Assche init_rcu_head(&delayed_free.rcu_head); 11910126574fSBart Van Assche rcu_head_initialized = true; 11920126574fSBart Van Assche } 11930126574fSBart Van Assche 11940126574fSBart Van Assche if (ds_initialized) 11950126574fSBart Van Assche return; 11960126574fSBart Van Assche 11970126574fSBart Van Assche ds_initialized = true; 11980126574fSBart Van Assche 1199a0b0fd53SBart Van Assche INIT_LIST_HEAD(&delayed_free.pf[0].zapped); 1200a0b0fd53SBart Van Assche INIT_LIST_HEAD(&delayed_free.pf[1].zapped); 1201a0b0fd53SBart Van Assche 1202feb0a386SBart Van Assche for (i = 0; i < ARRAY_SIZE(lock_classes); i++) { 1203a0b0fd53SBart Van Assche list_add_tail(&lock_classes[i].lock_entry, &free_lock_classes); 1204feb0a386SBart Van Assche INIT_LIST_HEAD(&lock_classes[i].locks_after); 1205feb0a386SBart Van Assche INIT_LIST_HEAD(&lock_classes[i].locks_before); 1206feb0a386SBart Van Assche } 1207810507feSWaiman Long init_chain_block_buckets(); 1208feb0a386SBart Van Assche } 1209feb0a386SBart Van Assche 1210108c1485SBart Van Assche static inline struct hlist_head *keyhashentry(const struct lock_class_key *key) 1211108c1485SBart Van Assche { 1212108c1485SBart Van Assche unsigned long hash = hash_long((uintptr_t)key, KEYHASH_BITS); 1213108c1485SBart Van Assche 1214108c1485SBart Van Assche return lock_keys_hash + hash; 1215108c1485SBart Van Assche } 1216108c1485SBart Van Assche 1217108c1485SBart Van Assche /* Register a dynamically allocated key. */ 1218108c1485SBart Van Assche void lockdep_register_key(struct lock_class_key *key) 1219108c1485SBart Van Assche { 1220108c1485SBart Van Assche struct hlist_head *hash_head; 1221108c1485SBart Van Assche struct lock_class_key *k; 1222108c1485SBart Van Assche unsigned long flags; 1223108c1485SBart Van Assche 1224108c1485SBart Van Assche if (WARN_ON_ONCE(static_obj(key))) 1225108c1485SBart Van Assche return; 1226108c1485SBart Van Assche hash_head = keyhashentry(key); 1227108c1485SBart Van Assche 1228108c1485SBart Van Assche raw_local_irq_save(flags); 1229108c1485SBart Van Assche if (!graph_lock()) 1230108c1485SBart Van Assche goto restore_irqs; 1231108c1485SBart Van Assche hlist_for_each_entry_rcu(k, hash_head, hash_entry) { 1232108c1485SBart Van Assche if (WARN_ON_ONCE(k == key)) 1233108c1485SBart Van Assche goto out_unlock; 1234108c1485SBart Van Assche } 1235108c1485SBart Van Assche hlist_add_head_rcu(&key->hash_entry, hash_head); 1236108c1485SBart Van Assche out_unlock: 1237108c1485SBart Van Assche graph_unlock(); 1238108c1485SBart Van Assche restore_irqs: 1239108c1485SBart Van Assche raw_local_irq_restore(flags); 1240108c1485SBart Van Assche } 1241108c1485SBart Van Assche EXPORT_SYMBOL_GPL(lockdep_register_key); 1242108c1485SBart Van Assche 1243108c1485SBart Van Assche /* Check whether a key has been registered as a dynamic key. */ 1244108c1485SBart Van Assche static bool is_dynamic_key(const struct lock_class_key *key) 1245108c1485SBart Van Assche { 1246108c1485SBart Van Assche struct hlist_head *hash_head; 1247108c1485SBart Van Assche struct lock_class_key *k; 1248108c1485SBart Van Assche bool found = false; 1249108c1485SBart Van Assche 1250108c1485SBart Van Assche if (WARN_ON_ONCE(static_obj(key))) 1251108c1485SBart Van Assche return false; 1252108c1485SBart Van Assche 1253108c1485SBart Van Assche /* 1254108c1485SBart Van Assche * If lock debugging is disabled lock_keys_hash[] may contain 1255108c1485SBart Van Assche * pointers to memory that has already been freed. Avoid triggering 1256108c1485SBart Van Assche * a use-after-free in that case by returning early. 1257108c1485SBart Van Assche */ 1258108c1485SBart Van Assche if (!debug_locks) 1259108c1485SBart Van Assche return true; 1260108c1485SBart Van Assche 1261108c1485SBart Van Assche hash_head = keyhashentry(key); 1262108c1485SBart Van Assche 1263108c1485SBart Van Assche rcu_read_lock(); 1264108c1485SBart Van Assche hlist_for_each_entry_rcu(k, hash_head, hash_entry) { 1265108c1485SBart Van Assche if (k == key) { 1266108c1485SBart Van Assche found = true; 1267108c1485SBart Van Assche break; 1268108c1485SBart Van Assche } 1269108c1485SBart Van Assche } 1270108c1485SBart Van Assche rcu_read_unlock(); 1271108c1485SBart Van Assche 1272108c1485SBart Van Assche return found; 1273108c1485SBart Van Assche } 1274108c1485SBart Van Assche 1275feb0a386SBart Van Assche /* 12768eddac3fSPeter Zijlstra * Register a lock's class in the hash-table, if the class is not present 12778eddac3fSPeter Zijlstra * yet. Otherwise we look it up. We cache the result in the lock object 12788eddac3fSPeter Zijlstra * itself, so actual lookup of the hash should be once per lock object. 12798eddac3fSPeter Zijlstra */ 1280c003ed92SDenys Vlasenko static struct lock_class * 12818eddac3fSPeter Zijlstra register_lock_class(struct lockdep_map *lock, unsigned int subclass, int force) 12828eddac3fSPeter Zijlstra { 12838eddac3fSPeter Zijlstra struct lockdep_subclass_key *key; 1284a63f38ccSAndrew Morton struct hlist_head *hash_head; 12858eddac3fSPeter Zijlstra struct lock_class *class; 1286fb7275acSWaiman Long int idx; 128735a9393cSPeter Zijlstra 128835a9393cSPeter Zijlstra DEBUG_LOCKS_WARN_ON(!irqs_disabled()); 12898eddac3fSPeter Zijlstra 12908eddac3fSPeter Zijlstra class = look_up_lock_class(lock, subclass); 129164f29d1bSMatthew Wilcox if (likely(class)) 12928eddac3fSPeter Zijlstra goto out_set_class_cache; 12938eddac3fSPeter Zijlstra 129464f29d1bSMatthew Wilcox if (!lock->key) { 129564f29d1bSMatthew Wilcox if (!assign_lock_key(lock)) 129664f29d1bSMatthew Wilcox return NULL; 1297108c1485SBart Van Assche } else if (!static_obj(lock->key) && !is_dynamic_key(lock->key)) { 12988eddac3fSPeter Zijlstra return NULL; 12998eddac3fSPeter Zijlstra } 13008eddac3fSPeter Zijlstra 13018eddac3fSPeter Zijlstra key = lock->key->subkeys + subclass; 13028eddac3fSPeter Zijlstra hash_head = classhashentry(key); 13038eddac3fSPeter Zijlstra 13048eddac3fSPeter Zijlstra if (!graph_lock()) { 13058eddac3fSPeter Zijlstra return NULL; 13068eddac3fSPeter Zijlstra } 13078eddac3fSPeter Zijlstra /* 13088eddac3fSPeter Zijlstra * We have to do the hash-walk again, to avoid races 13098eddac3fSPeter Zijlstra * with another CPU: 13108eddac3fSPeter Zijlstra */ 1311a63f38ccSAndrew Morton hlist_for_each_entry_rcu(class, hash_head, hash_entry) { 13128eddac3fSPeter Zijlstra if (class->key == key) 13138eddac3fSPeter Zijlstra goto out_unlock_set; 131435a9393cSPeter Zijlstra } 131535a9393cSPeter Zijlstra 1316feb0a386SBart Van Assche init_data_structures_once(); 1317feb0a386SBart Van Assche 1318a0b0fd53SBart Van Assche /* Allocate a new lock class and add it to the hash. */ 1319a0b0fd53SBart Van Assche class = list_first_entry_or_null(&free_lock_classes, typeof(*class), 1320a0b0fd53SBart Van Assche lock_entry); 1321a0b0fd53SBart Van Assche if (!class) { 13228eddac3fSPeter Zijlstra if (!debug_locks_off_graph_unlock()) { 13238eddac3fSPeter Zijlstra return NULL; 13248eddac3fSPeter Zijlstra } 13258eddac3fSPeter Zijlstra 1326*59cd94efSJohn Ogness nbcon_cpu_emergency_enter(); 13278eddac3fSPeter Zijlstra print_lockdep_off("BUG: MAX_LOCKDEP_KEYS too low!"); 13288eddac3fSPeter Zijlstra dump_stack(); 1329*59cd94efSJohn Ogness nbcon_cpu_emergency_exit(); 13308eddac3fSPeter Zijlstra return NULL; 13318eddac3fSPeter Zijlstra } 1332a0b0fd53SBart Van Assche nr_lock_classes++; 133301bb6f0aSYuyang Du __set_bit(class - lock_classes, lock_classes_in_use); 13348eddac3fSPeter Zijlstra debug_atomic_inc(nr_unused_locks); 13358eddac3fSPeter Zijlstra class->key = key; 13368eddac3fSPeter Zijlstra class->name = lock->name; 13378eddac3fSPeter Zijlstra class->subclass = subclass; 1338feb0a386SBart Van Assche WARN_ON_ONCE(!list_empty(&class->locks_before)); 1339feb0a386SBart Van Assche WARN_ON_ONCE(!list_empty(&class->locks_after)); 13408eddac3fSPeter Zijlstra class->name_version = count_matching_names(class); 1341de8f5e4fSPeter Zijlstra class->wait_type_inner = lock->wait_type_inner; 1342de8f5e4fSPeter Zijlstra class->wait_type_outer = lock->wait_type_outer; 1343dfd5e3f5SPeter Zijlstra class->lock_type = lock->lock_type; 13448eddac3fSPeter Zijlstra /* 13458eddac3fSPeter Zijlstra * We use RCU's safe list-add method to make 13468eddac3fSPeter Zijlstra * parallel walking of the hash-list safe: 13478eddac3fSPeter Zijlstra */ 1348a63f38ccSAndrew Morton hlist_add_head_rcu(&class->hash_entry, hash_head); 13498eddac3fSPeter Zijlstra /* 1350a0b0fd53SBart Van Assche * Remove the class from the free list and add it to the global list 1351a0b0fd53SBart Van Assche * of classes. 13528eddac3fSPeter Zijlstra */ 1353a0b0fd53SBart Van Assche list_move_tail(&class->lock_entry, &all_lock_classes); 1354fb7275acSWaiman Long idx = class - lock_classes; 1355fb7275acSWaiman Long if (idx > max_lock_class_idx) 1356fb7275acSWaiman Long max_lock_class_idx = idx; 13578eddac3fSPeter Zijlstra 13588eddac3fSPeter Zijlstra if (verbose(class)) { 13598eddac3fSPeter Zijlstra graph_unlock(); 13608eddac3fSPeter Zijlstra 1361*59cd94efSJohn Ogness nbcon_cpu_emergency_enter(); 136204860d48SBorislav Petkov printk("\nnew class %px: %s", class->key, class->name); 13638eddac3fSPeter Zijlstra if (class->name_version > 1) 1364f943fe0fSDmitry Vyukov printk(KERN_CONT "#%d", class->name_version); 1365f943fe0fSDmitry Vyukov printk(KERN_CONT "\n"); 13668eddac3fSPeter Zijlstra dump_stack(); 1367*59cd94efSJohn Ogness nbcon_cpu_emergency_exit(); 13688eddac3fSPeter Zijlstra 13698eddac3fSPeter Zijlstra if (!graph_lock()) { 13708eddac3fSPeter Zijlstra return NULL; 13718eddac3fSPeter Zijlstra } 13728eddac3fSPeter Zijlstra } 13738eddac3fSPeter Zijlstra out_unlock_set: 13748eddac3fSPeter Zijlstra graph_unlock(); 13758eddac3fSPeter Zijlstra 13768eddac3fSPeter Zijlstra out_set_class_cache: 13778eddac3fSPeter Zijlstra if (!subclass || force) 13788eddac3fSPeter Zijlstra lock->class_cache[0] = class; 13798eddac3fSPeter Zijlstra else if (subclass < NR_LOCKDEP_CACHING_CLASSES) 13808eddac3fSPeter Zijlstra lock->class_cache[subclass] = class; 13818eddac3fSPeter Zijlstra 13828eddac3fSPeter Zijlstra /* 13838eddac3fSPeter Zijlstra * Hash collision, did we smoke some? We found a class with a matching 13848eddac3fSPeter Zijlstra * hash but the subclass -- which is hashed in -- didn't match. 13858eddac3fSPeter Zijlstra */ 13868eddac3fSPeter Zijlstra if (DEBUG_LOCKS_WARN_ON(class->subclass != subclass)) 13878eddac3fSPeter Zijlstra return NULL; 13888eddac3fSPeter Zijlstra 13898eddac3fSPeter Zijlstra return class; 13908eddac3fSPeter Zijlstra } 13918eddac3fSPeter Zijlstra 13928eddac3fSPeter Zijlstra #ifdef CONFIG_PROVE_LOCKING 13938eddac3fSPeter Zijlstra /* 13948eddac3fSPeter Zijlstra * Allocate a lockdep entry. (assumes the graph_lock held, returns 13958eddac3fSPeter Zijlstra * with NULL on failure) 13968eddac3fSPeter Zijlstra */ 13978eddac3fSPeter Zijlstra static struct lock_list *alloc_list_entry(void) 13988eddac3fSPeter Zijlstra { 1399ace35a7aSBart Van Assche int idx = find_first_zero_bit(list_entries_in_use, 1400ace35a7aSBart Van Assche ARRAY_SIZE(list_entries)); 1401ace35a7aSBart Van Assche 1402ace35a7aSBart Van Assche if (idx >= ARRAY_SIZE(list_entries)) { 14038eddac3fSPeter Zijlstra if (!debug_locks_off_graph_unlock()) 14048eddac3fSPeter Zijlstra return NULL; 14058eddac3fSPeter Zijlstra 1406*59cd94efSJohn Ogness nbcon_cpu_emergency_enter(); 14078eddac3fSPeter Zijlstra print_lockdep_off("BUG: MAX_LOCKDEP_ENTRIES too low!"); 14088eddac3fSPeter Zijlstra dump_stack(); 1409*59cd94efSJohn Ogness nbcon_cpu_emergency_exit(); 14108eddac3fSPeter Zijlstra return NULL; 14118eddac3fSPeter Zijlstra } 1412ace35a7aSBart Van Assche nr_list_entries++; 1413ace35a7aSBart Van Assche __set_bit(idx, list_entries_in_use); 1414ace35a7aSBart Van Assche return list_entries + idx; 14158eddac3fSPeter Zijlstra } 14168eddac3fSPeter Zijlstra 14178eddac3fSPeter Zijlstra /* 14188eddac3fSPeter Zijlstra * Add a new dependency to the head of the list: 14198eddac3fSPeter Zijlstra */ 142086cffb80SBart Van Assche static int add_lock_to_list(struct lock_class *this, 142186cffb80SBart Van Assche struct lock_class *links_to, struct list_head *head, 14228b023accSNick Desaulniers u16 distance, u8 dep, 142312593b74SBart Van Assche const struct lock_trace *trace) 14248eddac3fSPeter Zijlstra { 14258eddac3fSPeter Zijlstra struct lock_list *entry; 14268eddac3fSPeter Zijlstra /* 14278eddac3fSPeter Zijlstra * Lock not present yet - get a new dependency struct and 14288eddac3fSPeter Zijlstra * add it to the list: 14298eddac3fSPeter Zijlstra */ 14308eddac3fSPeter Zijlstra entry = alloc_list_entry(); 14318eddac3fSPeter Zijlstra if (!entry) 14328eddac3fSPeter Zijlstra return 0; 14338eddac3fSPeter Zijlstra 14348eddac3fSPeter Zijlstra entry->class = this; 143586cffb80SBart Van Assche entry->links_to = links_to; 14363454a36dSBoqun Feng entry->dep = dep; 14378eddac3fSPeter Zijlstra entry->distance = distance; 143812593b74SBart Van Assche entry->trace = trace; 14398eddac3fSPeter Zijlstra /* 144035a9393cSPeter Zijlstra * Both allocation and removal are done under the graph lock; but 144135a9393cSPeter Zijlstra * iteration is under RCU-sched; see look_up_lock_class() and 144235a9393cSPeter Zijlstra * lockdep_free_key_range(). 14438eddac3fSPeter Zijlstra */ 14448eddac3fSPeter Zijlstra list_add_tail_rcu(&entry->entry, head); 14458eddac3fSPeter Zijlstra 14468eddac3fSPeter Zijlstra return 1; 14478eddac3fSPeter Zijlstra } 14488eddac3fSPeter Zijlstra 14498eddac3fSPeter Zijlstra /* 14508eddac3fSPeter Zijlstra * For good efficiency of modular, we use power of 2 14518eddac3fSPeter Zijlstra */ 14525dc33592STetsuo Handa #define MAX_CIRCULAR_QUEUE_SIZE (1UL << CONFIG_LOCKDEP_CIRCULAR_QUEUE_BITS) 14538eddac3fSPeter Zijlstra #define CQ_MASK (MAX_CIRCULAR_QUEUE_SIZE-1) 14548eddac3fSPeter Zijlstra 14558eddac3fSPeter Zijlstra /* 1456aa480771SYuyang Du * The circular_queue and helpers are used to implement graph 1457aa480771SYuyang Du * breadth-first search (BFS) algorithm, by which we can determine 1458aa480771SYuyang Du * whether there is a path from a lock to another. In deadlock checks, 1459aa480771SYuyang Du * a path from the next lock to be acquired to a previous held lock 1460aa480771SYuyang Du * indicates that adding the <prev> -> <next> lock dependency will 1461aa480771SYuyang Du * produce a circle in the graph. Breadth-first search instead of 1462aa480771SYuyang Du * depth-first search is used in order to find the shortest (circular) 1463aa480771SYuyang Du * path. 14648eddac3fSPeter Zijlstra */ 14658eddac3fSPeter Zijlstra struct circular_queue { 1466aa480771SYuyang Du struct lock_list *element[MAX_CIRCULAR_QUEUE_SIZE]; 14678eddac3fSPeter Zijlstra unsigned int front, rear; 14688eddac3fSPeter Zijlstra }; 14698eddac3fSPeter Zijlstra 14708eddac3fSPeter Zijlstra static struct circular_queue lock_cq; 14718eddac3fSPeter Zijlstra 14728eddac3fSPeter Zijlstra unsigned int max_bfs_queue_depth; 14738eddac3fSPeter Zijlstra 14748eddac3fSPeter Zijlstra static unsigned int lockdep_dependency_gen_id; 14758eddac3fSPeter Zijlstra 14768eddac3fSPeter Zijlstra static inline void __cq_init(struct circular_queue *cq) 14778eddac3fSPeter Zijlstra { 14788eddac3fSPeter Zijlstra cq->front = cq->rear = 0; 14798eddac3fSPeter Zijlstra lockdep_dependency_gen_id++; 14808eddac3fSPeter Zijlstra } 14818eddac3fSPeter Zijlstra 14828eddac3fSPeter Zijlstra static inline int __cq_empty(struct circular_queue *cq) 14838eddac3fSPeter Zijlstra { 14848eddac3fSPeter Zijlstra return (cq->front == cq->rear); 14858eddac3fSPeter Zijlstra } 14868eddac3fSPeter Zijlstra 14878eddac3fSPeter Zijlstra static inline int __cq_full(struct circular_queue *cq) 14888eddac3fSPeter Zijlstra { 14898eddac3fSPeter Zijlstra return ((cq->rear + 1) & CQ_MASK) == cq->front; 14908eddac3fSPeter Zijlstra } 14918eddac3fSPeter Zijlstra 1492aa480771SYuyang Du static inline int __cq_enqueue(struct circular_queue *cq, struct lock_list *elem) 14938eddac3fSPeter Zijlstra { 14948eddac3fSPeter Zijlstra if (__cq_full(cq)) 14958eddac3fSPeter Zijlstra return -1; 14968eddac3fSPeter Zijlstra 14978eddac3fSPeter Zijlstra cq->element[cq->rear] = elem; 14988eddac3fSPeter Zijlstra cq->rear = (cq->rear + 1) & CQ_MASK; 14998eddac3fSPeter Zijlstra return 0; 15008eddac3fSPeter Zijlstra } 15018eddac3fSPeter Zijlstra 1502c1661325SYuyang Du /* 1503c1661325SYuyang Du * Dequeue an element from the circular_queue, return a lock_list if 1504c1661325SYuyang Du * the queue is not empty, or NULL if otherwise. 1505c1661325SYuyang Du */ 1506c1661325SYuyang Du static inline struct lock_list * __cq_dequeue(struct circular_queue *cq) 15078eddac3fSPeter Zijlstra { 1508c1661325SYuyang Du struct lock_list * lock; 15098eddac3fSPeter Zijlstra 1510c1661325SYuyang Du if (__cq_empty(cq)) 1511c1661325SYuyang Du return NULL; 1512c1661325SYuyang Du 1513c1661325SYuyang Du lock = cq->element[cq->front]; 15148eddac3fSPeter Zijlstra cq->front = (cq->front + 1) & CQ_MASK; 1515c1661325SYuyang Du 1516c1661325SYuyang Du return lock; 15178eddac3fSPeter Zijlstra } 15188eddac3fSPeter Zijlstra 15198eddac3fSPeter Zijlstra static inline unsigned int __cq_get_elem_count(struct circular_queue *cq) 15208eddac3fSPeter Zijlstra { 15218eddac3fSPeter Zijlstra return (cq->rear - cq->front) & CQ_MASK; 15228eddac3fSPeter Zijlstra } 15238eddac3fSPeter Zijlstra 1524d563bc6eSBoqun Feng static inline void mark_lock_accessed(struct lock_list *lock) 1525d563bc6eSBoqun Feng { 1526d563bc6eSBoqun Feng lock->class->dep_gen_id = lockdep_dependency_gen_id; 1527d563bc6eSBoqun Feng } 1528d563bc6eSBoqun Feng 1529d563bc6eSBoqun Feng static inline void visit_lock_entry(struct lock_list *lock, 15308eddac3fSPeter Zijlstra struct lock_list *parent) 15318eddac3fSPeter Zijlstra { 15328eddac3fSPeter Zijlstra lock->parent = parent; 15338eddac3fSPeter Zijlstra } 15348eddac3fSPeter Zijlstra 15358eddac3fSPeter Zijlstra static inline unsigned long lock_accessed(struct lock_list *lock) 15368eddac3fSPeter Zijlstra { 15378eddac3fSPeter Zijlstra return lock->class->dep_gen_id == lockdep_dependency_gen_id; 15388eddac3fSPeter Zijlstra } 15398eddac3fSPeter Zijlstra 15408eddac3fSPeter Zijlstra static inline struct lock_list *get_lock_parent(struct lock_list *child) 15418eddac3fSPeter Zijlstra { 15428eddac3fSPeter Zijlstra return child->parent; 15438eddac3fSPeter Zijlstra } 15448eddac3fSPeter Zijlstra 15458eddac3fSPeter Zijlstra static inline int get_lock_depth(struct lock_list *child) 15468eddac3fSPeter Zijlstra { 15478eddac3fSPeter Zijlstra int depth = 0; 15488eddac3fSPeter Zijlstra struct lock_list *parent; 15498eddac3fSPeter Zijlstra 15508eddac3fSPeter Zijlstra while ((parent = get_lock_parent(child))) { 15518eddac3fSPeter Zijlstra child = parent; 15528eddac3fSPeter Zijlstra depth++; 15538eddac3fSPeter Zijlstra } 15548eddac3fSPeter Zijlstra return depth; 15558eddac3fSPeter Zijlstra } 15568eddac3fSPeter Zijlstra 155777a80692SYuyang Du /* 155877a80692SYuyang Du * Return the forward or backward dependency list. 155977a80692SYuyang Du * 156077a80692SYuyang Du * @lock: the lock_list to get its class's dependency list 156177a80692SYuyang Du * @offset: the offset to struct lock_class to determine whether it is 156277a80692SYuyang Du * locks_after or locks_before 156377a80692SYuyang Du */ 156477a80692SYuyang Du static inline struct list_head *get_dep_list(struct lock_list *lock, int offset) 156577a80692SYuyang Du { 156677a80692SYuyang Du void *lock_class = lock->class; 156777a80692SYuyang Du 156877a80692SYuyang Du return lock_class + offset; 156977a80692SYuyang Du } 1570b11be024SBoqun Feng /* 1571b11be024SBoqun Feng * Return values of a bfs search: 1572b11be024SBoqun Feng * 1573b11be024SBoqun Feng * BFS_E* indicates an error 1574b11be024SBoqun Feng * BFS_R* indicates a result (match or not) 1575b11be024SBoqun Feng * 1576b11be024SBoqun Feng * BFS_EINVALIDNODE: Find a invalid node in the graph. 1577b11be024SBoqun Feng * 1578b11be024SBoqun Feng * BFS_EQUEUEFULL: The queue is full while doing the bfs. 1579b11be024SBoqun Feng * 1580b11be024SBoqun Feng * BFS_RMATCH: Find the matched node in the graph, and put that node into 1581b11be024SBoqun Feng * *@target_entry. 1582b11be024SBoqun Feng * 1583b11be024SBoqun Feng * BFS_RNOMATCH: Haven't found the matched node and keep *@target_entry 1584b11be024SBoqun Feng * _unchanged_. 1585b11be024SBoqun Feng */ 1586b11be024SBoqun Feng enum bfs_result { 1587b11be024SBoqun Feng BFS_EINVALIDNODE = -2, 1588b11be024SBoqun Feng BFS_EQUEUEFULL = -1, 1589b11be024SBoqun Feng BFS_RMATCH = 0, 1590b11be024SBoqun Feng BFS_RNOMATCH = 1, 1591b11be024SBoqun Feng }; 1592b11be024SBoqun Feng 1593b11be024SBoqun Feng /* 1594b11be024SBoqun Feng * bfs_result < 0 means error 1595b11be024SBoqun Feng */ 1596b11be024SBoqun Feng static inline bool bfs_error(enum bfs_result res) 1597b11be024SBoqun Feng { 1598b11be024SBoqun Feng return res < 0; 1599b11be024SBoqun Feng } 160077a80692SYuyang Du 1601154f185eSYuyang Du /* 16023454a36dSBoqun Feng * DEP_*_BIT in lock_list::dep 16033454a36dSBoqun Feng * 16043454a36dSBoqun Feng * For dependency @prev -> @next: 16053454a36dSBoqun Feng * 16063454a36dSBoqun Feng * SR: @prev is shared reader (->read != 0) and @next is recursive reader 16073454a36dSBoqun Feng * (->read == 2) 16083454a36dSBoqun Feng * ER: @prev is exclusive locker (->read == 0) and @next is recursive reader 16093454a36dSBoqun Feng * SN: @prev is shared reader and @next is non-recursive locker (->read != 2) 16103454a36dSBoqun Feng * EN: @prev is exclusive locker and @next is non-recursive locker 16113454a36dSBoqun Feng * 16123454a36dSBoqun Feng * Note that we define the value of DEP_*_BITs so that: 16133454a36dSBoqun Feng * bit0 is prev->read == 0 16143454a36dSBoqun Feng * bit1 is next->read != 2 16153454a36dSBoqun Feng */ 16163454a36dSBoqun Feng #define DEP_SR_BIT (0 + (0 << 1)) /* 0 */ 16173454a36dSBoqun Feng #define DEP_ER_BIT (1 + (0 << 1)) /* 1 */ 16183454a36dSBoqun Feng #define DEP_SN_BIT (0 + (1 << 1)) /* 2 */ 16193454a36dSBoqun Feng #define DEP_EN_BIT (1 + (1 << 1)) /* 3 */ 16203454a36dSBoqun Feng 16213454a36dSBoqun Feng #define DEP_SR_MASK (1U << (DEP_SR_BIT)) 16223454a36dSBoqun Feng #define DEP_ER_MASK (1U << (DEP_ER_BIT)) 16233454a36dSBoqun Feng #define DEP_SN_MASK (1U << (DEP_SN_BIT)) 16243454a36dSBoqun Feng #define DEP_EN_MASK (1U << (DEP_EN_BIT)) 16253454a36dSBoqun Feng 16263454a36dSBoqun Feng static inline unsigned int 16273454a36dSBoqun Feng __calc_dep_bit(struct held_lock *prev, struct held_lock *next) 16283454a36dSBoqun Feng { 16293454a36dSBoqun Feng return (prev->read == 0) + ((next->read != 2) << 1); 16303454a36dSBoqun Feng } 16313454a36dSBoqun Feng 16323454a36dSBoqun Feng static inline u8 calc_dep(struct held_lock *prev, struct held_lock *next) 16333454a36dSBoqun Feng { 16343454a36dSBoqun Feng return 1U << __calc_dep_bit(prev, next); 16353454a36dSBoqun Feng } 16363454a36dSBoqun Feng 16373454a36dSBoqun Feng /* 16383454a36dSBoqun Feng * calculate the dep_bit for backwards edges. We care about whether @prev is 16393454a36dSBoqun Feng * shared and whether @next is recursive. 16403454a36dSBoqun Feng */ 16413454a36dSBoqun Feng static inline unsigned int 16423454a36dSBoqun Feng __calc_dep_bitb(struct held_lock *prev, struct held_lock *next) 16433454a36dSBoqun Feng { 16443454a36dSBoqun Feng return (next->read != 2) + ((prev->read == 0) << 1); 16453454a36dSBoqun Feng } 16463454a36dSBoqun Feng 16473454a36dSBoqun Feng static inline u8 calc_depb(struct held_lock *prev, struct held_lock *next) 16483454a36dSBoqun Feng { 16493454a36dSBoqun Feng return 1U << __calc_dep_bitb(prev, next); 16503454a36dSBoqun Feng } 16513454a36dSBoqun Feng 16523454a36dSBoqun Feng /* 16536971c0f3SBoqun Feng * Initialize a lock_list entry @lock belonging to @class as the root for a BFS 16546971c0f3SBoqun Feng * search. 16556971c0f3SBoqun Feng */ 16566971c0f3SBoqun Feng static inline void __bfs_init_root(struct lock_list *lock, 16576971c0f3SBoqun Feng struct lock_class *class) 16586971c0f3SBoqun Feng { 16596971c0f3SBoqun Feng lock->class = class; 16606971c0f3SBoqun Feng lock->parent = NULL; 16616971c0f3SBoqun Feng lock->only_xr = 0; 16626971c0f3SBoqun Feng } 16636971c0f3SBoqun Feng 16646971c0f3SBoqun Feng /* 16656971c0f3SBoqun Feng * Initialize a lock_list entry @lock based on a lock acquisition @hlock as the 16666971c0f3SBoqun Feng * root for a BFS search. 16676971c0f3SBoqun Feng * 16686971c0f3SBoqun Feng * ->only_xr of the initial lock node is set to @hlock->read == 2, to make sure 16696971c0f3SBoqun Feng * that <prev> -> @hlock and @hlock -> <whatever __bfs() found> is not -(*R)-> 16706971c0f3SBoqun Feng * and -(S*)->. 16716971c0f3SBoqun Feng */ 16726971c0f3SBoqun Feng static inline void bfs_init_root(struct lock_list *lock, 16736971c0f3SBoqun Feng struct held_lock *hlock) 16746971c0f3SBoqun Feng { 16756971c0f3SBoqun Feng __bfs_init_root(lock, hlock_class(hlock)); 16766971c0f3SBoqun Feng lock->only_xr = (hlock->read == 2); 16776971c0f3SBoqun Feng } 16786971c0f3SBoqun Feng 16796971c0f3SBoqun Feng /* 16806971c0f3SBoqun Feng * Similar to bfs_init_root() but initialize the root for backwards BFS. 16816971c0f3SBoqun Feng * 16826971c0f3SBoqun Feng * ->only_xr of the initial lock node is set to @hlock->read != 0, to make sure 16836971c0f3SBoqun Feng * that <next> -> @hlock and @hlock -> <whatever backwards BFS found> is not 16846971c0f3SBoqun Feng * -(*S)-> and -(R*)-> (reverse order of -(*R)-> and -(S*)->). 16856971c0f3SBoqun Feng */ 16866971c0f3SBoqun Feng static inline void bfs_init_rootb(struct lock_list *lock, 16876971c0f3SBoqun Feng struct held_lock *hlock) 16886971c0f3SBoqun Feng { 16896971c0f3SBoqun Feng __bfs_init_root(lock, hlock_class(hlock)); 16906971c0f3SBoqun Feng lock->only_xr = (hlock->read != 0); 16916971c0f3SBoqun Feng } 16926971c0f3SBoqun Feng 16936d1823ccSBoqun Feng static inline struct lock_list *__bfs_next(struct lock_list *lock, int offset) 16946d1823ccSBoqun Feng { 16956d1823ccSBoqun Feng if (!lock || !lock->parent) 16966d1823ccSBoqun Feng return NULL; 16976d1823ccSBoqun Feng 16986d1823ccSBoqun Feng return list_next_or_null_rcu(get_dep_list(lock->parent, offset), 16996d1823ccSBoqun Feng &lock->entry, struct lock_list, entry); 17006d1823ccSBoqun Feng } 17016d1823ccSBoqun Feng 17026971c0f3SBoqun Feng /* 17036971c0f3SBoqun Feng * Breadth-First Search to find a strong path in the dependency graph. 17046971c0f3SBoqun Feng * 17056971c0f3SBoqun Feng * @source_entry: the source of the path we are searching for. 17066971c0f3SBoqun Feng * @data: data used for the second parameter of @match function 17076971c0f3SBoqun Feng * @match: match function for the search 17086971c0f3SBoqun Feng * @target_entry: pointer to the target of a matched path 17096971c0f3SBoqun Feng * @offset: the offset to struct lock_class to determine whether it is 17106971c0f3SBoqun Feng * locks_after or locks_before 17116971c0f3SBoqun Feng * 17126971c0f3SBoqun Feng * We may have multiple edges (considering different kinds of dependencies, 17136971c0f3SBoqun Feng * e.g. ER and SN) between two nodes in the dependency graph. But 17146971c0f3SBoqun Feng * only the strong dependency path in the graph is relevant to deadlocks. A 17156971c0f3SBoqun Feng * strong dependency path is a dependency path that doesn't have two adjacent 17166971c0f3SBoqun Feng * dependencies as -(*R)-> -(S*)->, please see: 17176971c0f3SBoqun Feng * 17186971c0f3SBoqun Feng * Documentation/locking/lockdep-design.rst 17196971c0f3SBoqun Feng * 17206971c0f3SBoqun Feng * for more explanation of the definition of strong dependency paths 17216971c0f3SBoqun Feng * 17226971c0f3SBoqun Feng * In __bfs(), we only traverse in the strong dependency path: 17236971c0f3SBoqun Feng * 17246971c0f3SBoqun Feng * In lock_list::only_xr, we record whether the previous dependency only 17256971c0f3SBoqun Feng * has -(*R)-> in the search, and if it does (prev only has -(*R)->), we 17266971c0f3SBoqun Feng * filter out any -(S*)-> in the current dependency and after that, the 17276971c0f3SBoqun Feng * ->only_xr is set according to whether we only have -(*R)-> left. 1728154f185eSYuyang Du */ 1729b11be024SBoqun Feng static enum bfs_result __bfs(struct lock_list *source_entry, 17308eddac3fSPeter Zijlstra void *data, 173161775ed2SBoqun Feng bool (*match)(struct lock_list *entry, void *data), 1732bc2dd71bSBoqun Feng bool (*skip)(struct lock_list *entry, void *data), 17338eddac3fSPeter Zijlstra struct lock_list **target_entry, 173477a80692SYuyang Du int offset) 17358eddac3fSPeter Zijlstra { 17368eddac3fSPeter Zijlstra struct circular_queue *cq = &lock_cq; 17376d1823ccSBoqun Feng struct lock_list *lock = NULL; 17386d1823ccSBoqun Feng struct lock_list *entry; 17396d1823ccSBoqun Feng struct list_head *head; 17406d1823ccSBoqun Feng unsigned int cq_depth; 17416d1823ccSBoqun Feng bool first; 17428eddac3fSPeter Zijlstra 1743248efb21SPeter Zijlstra lockdep_assert_locked(); 1744248efb21SPeter Zijlstra 17458eddac3fSPeter Zijlstra __cq_init(cq); 1746aa480771SYuyang Du __cq_enqueue(cq, source_entry); 17478eddac3fSPeter Zijlstra 17486d1823ccSBoqun Feng while ((lock = __bfs_next(lock, offset)) || (lock = __cq_dequeue(cq))) { 17496d1823ccSBoqun Feng if (!lock->class) 17506d1823ccSBoqun Feng return BFS_EINVALIDNODE; 17518eddac3fSPeter Zijlstra 1752d563bc6eSBoqun Feng /* 17536d1823ccSBoqun Feng * Step 1: check whether we already finish on this one. 17546d1823ccSBoqun Feng * 1755d563bc6eSBoqun Feng * If we have visited all the dependencies from this @lock to 1756d563bc6eSBoqun Feng * others (iow, if we have visited all lock_list entries in 1757d563bc6eSBoqun Feng * @lock->class->locks_{after,before}) we skip, otherwise go 1758d563bc6eSBoqun Feng * and visit all the dependencies in the list and mark this 1759d563bc6eSBoqun Feng * list accessed. 1760d563bc6eSBoqun Feng */ 1761d563bc6eSBoqun Feng if (lock_accessed(lock)) 1762d563bc6eSBoqun Feng continue; 1763d563bc6eSBoqun Feng else 1764d563bc6eSBoqun Feng mark_lock_accessed(lock); 1765d563bc6eSBoqun Feng 17666d1823ccSBoqun Feng /* 17676d1823ccSBoqun Feng * Step 2: check whether prev dependency and this form a strong 17686d1823ccSBoqun Feng * dependency path. 17696d1823ccSBoqun Feng */ 17706d1823ccSBoqun Feng if (lock->parent) { /* Parent exists, check prev dependency */ 17716d1823ccSBoqun Feng u8 dep = lock->dep; 17726d1823ccSBoqun Feng bool prev_only_xr = lock->parent->only_xr; 17736971c0f3SBoqun Feng 17746971c0f3SBoqun Feng /* 17756971c0f3SBoqun Feng * Mask out all -(S*)-> if we only have *R in previous 17766971c0f3SBoqun Feng * step, because -(*R)-> -(S*)-> don't make up a strong 17776971c0f3SBoqun Feng * dependency. 17786971c0f3SBoqun Feng */ 17796971c0f3SBoqun Feng if (prev_only_xr) 17806971c0f3SBoqun Feng dep &= ~(DEP_SR_MASK | DEP_SN_MASK); 17816971c0f3SBoqun Feng 17826971c0f3SBoqun Feng /* If nothing left, we skip */ 17836971c0f3SBoqun Feng if (!dep) 17846971c0f3SBoqun Feng continue; 17856971c0f3SBoqun Feng 17866971c0f3SBoqun Feng /* If there are only -(*R)-> left, set that for the next step */ 17876d1823ccSBoqun Feng lock->only_xr = !(dep & (DEP_SN_MASK | DEP_EN_MASK)); 17886d1823ccSBoqun Feng } 1789d563bc6eSBoqun Feng 17906d1823ccSBoqun Feng /* 17916d1823ccSBoqun Feng * Step 3: we haven't visited this and there is a strong 17926d1823ccSBoqun Feng * dependency path to this, so check with @match. 1793bc2dd71bSBoqun Feng * If @skip is provide and returns true, we skip this 1794bc2dd71bSBoqun Feng * lock (and any path this lock is in). 17956d1823ccSBoqun Feng */ 1796bc2dd71bSBoqun Feng if (skip && skip(lock, data)) 1797bc2dd71bSBoqun Feng continue; 1798bc2dd71bSBoqun Feng 17996d1823ccSBoqun Feng if (match(lock, data)) { 18006d1823ccSBoqun Feng *target_entry = lock; 18016d1823ccSBoqun Feng return BFS_RMATCH; 18026d1823ccSBoqun Feng } 18036d1823ccSBoqun Feng 18046d1823ccSBoqun Feng /* 18056d1823ccSBoqun Feng * Step 4: if not match, expand the path by adding the 1806e2db7592SIngo Molnar * forward or backwards dependencies in the search 18076d1823ccSBoqun Feng * 18086d1823ccSBoqun Feng */ 18096d1823ccSBoqun Feng first = true; 18106d1823ccSBoqun Feng head = get_dep_list(lock, offset); 18116d1823ccSBoqun Feng list_for_each_entry_rcu(entry, head, entry) { 1812d563bc6eSBoqun Feng visit_lock_entry(entry, lock); 18138eddac3fSPeter Zijlstra 18146d1823ccSBoqun Feng /* 18156d1823ccSBoqun Feng * Note we only enqueue the first of the list into the 18166d1823ccSBoqun Feng * queue, because we can always find a sibling 18176d1823ccSBoqun Feng * dependency from one (see __bfs_next()), as a result 18186d1823ccSBoqun Feng * the space of queue is saved. 18196d1823ccSBoqun Feng */ 18206d1823ccSBoqun Feng if (!first) 18216d1823ccSBoqun Feng continue; 18226d1823ccSBoqun Feng 18236d1823ccSBoqun Feng first = false; 18246d1823ccSBoqun Feng 18256d1823ccSBoqun Feng if (__cq_enqueue(cq, entry)) 18266d1823ccSBoqun Feng return BFS_EQUEUEFULL; 18276d1823ccSBoqun Feng 18288eddac3fSPeter Zijlstra cq_depth = __cq_get_elem_count(cq); 18298eddac3fSPeter Zijlstra if (max_bfs_queue_depth < cq_depth) 18308eddac3fSPeter Zijlstra max_bfs_queue_depth = cq_depth; 18318eddac3fSPeter Zijlstra } 18328eddac3fSPeter Zijlstra } 18336d1823ccSBoqun Feng 18346d1823ccSBoqun Feng return BFS_RNOMATCH; 18358eddac3fSPeter Zijlstra } 18368eddac3fSPeter Zijlstra 1837b11be024SBoqun Feng static inline enum bfs_result 1838b11be024SBoqun Feng __bfs_forwards(struct lock_list *src_entry, 18398eddac3fSPeter Zijlstra void *data, 184061775ed2SBoqun Feng bool (*match)(struct lock_list *entry, void *data), 1841bc2dd71bSBoqun Feng bool (*skip)(struct lock_list *entry, void *data), 18428eddac3fSPeter Zijlstra struct lock_list **target_entry) 18438eddac3fSPeter Zijlstra { 1844bc2dd71bSBoqun Feng return __bfs(src_entry, data, match, skip, target_entry, 184577a80692SYuyang Du offsetof(struct lock_class, locks_after)); 18468eddac3fSPeter Zijlstra 18478eddac3fSPeter Zijlstra } 18488eddac3fSPeter Zijlstra 1849b11be024SBoqun Feng static inline enum bfs_result 1850b11be024SBoqun Feng __bfs_backwards(struct lock_list *src_entry, 18518eddac3fSPeter Zijlstra void *data, 185261775ed2SBoqun Feng bool (*match)(struct lock_list *entry, void *data), 1853bc2dd71bSBoqun Feng bool (*skip)(struct lock_list *entry, void *data), 18548eddac3fSPeter Zijlstra struct lock_list **target_entry) 18558eddac3fSPeter Zijlstra { 1856bc2dd71bSBoqun Feng return __bfs(src_entry, data, match, skip, target_entry, 185777a80692SYuyang Du offsetof(struct lock_class, locks_before)); 18588eddac3fSPeter Zijlstra 18598eddac3fSPeter Zijlstra } 18608eddac3fSPeter Zijlstra 186112593b74SBart Van Assche static void print_lock_trace(const struct lock_trace *trace, 186212593b74SBart Van Assche unsigned int spaces) 1863c120bce7SThomas Gleixner { 186412593b74SBart Van Assche stack_trace_print(trace->entries, trace->nr_entries, spaces); 1865c120bce7SThomas Gleixner } 1866c120bce7SThomas Gleixner 18678eddac3fSPeter Zijlstra /* 18688eddac3fSPeter Zijlstra * Print a dependency chain entry (this is only done when a deadlock 18698eddac3fSPeter Zijlstra * has been detected): 18708eddac3fSPeter Zijlstra */ 1871f7c1c6b3SYuyang Du static noinline void 18728eddac3fSPeter Zijlstra print_circular_bug_entry(struct lock_list *target, int depth) 18738eddac3fSPeter Zijlstra { 18748eddac3fSPeter Zijlstra if (debug_locks_silent) 1875f7c1c6b3SYuyang Du return; 18768eddac3fSPeter Zijlstra printk("\n-> #%u", depth); 1877eb1cfd09SKent Overstreet print_lock_name(NULL, target->class); 1878f943fe0fSDmitry Vyukov printk(KERN_CONT ":\n"); 187912593b74SBart Van Assche print_lock_trace(target->trace, 6); 18808eddac3fSPeter Zijlstra } 18818eddac3fSPeter Zijlstra 18828eddac3fSPeter Zijlstra static void 18838eddac3fSPeter Zijlstra print_circular_lock_scenario(struct held_lock *src, 18848eddac3fSPeter Zijlstra struct held_lock *tgt, 18858eddac3fSPeter Zijlstra struct lock_list *prt) 18868eddac3fSPeter Zijlstra { 18878eddac3fSPeter Zijlstra struct lock_class *source = hlock_class(src); 18888eddac3fSPeter Zijlstra struct lock_class *target = hlock_class(tgt); 18898eddac3fSPeter Zijlstra struct lock_class *parent = prt->class; 18900471db44SBoqun Feng int src_read = src->read; 18910471db44SBoqun Feng int tgt_read = tgt->read; 18928eddac3fSPeter Zijlstra 18938eddac3fSPeter Zijlstra /* 18948eddac3fSPeter Zijlstra * A direct locking problem where unsafe_class lock is taken 18958eddac3fSPeter Zijlstra * directly by safe_class lock, then all we need to show 18968eddac3fSPeter Zijlstra * is the deadlock scenario, as it is obvious that the 18978eddac3fSPeter Zijlstra * unsafe lock is taken under the safe lock. 18988eddac3fSPeter Zijlstra * 18998eddac3fSPeter Zijlstra * But if there is a chain instead, where the safe lock takes 19008eddac3fSPeter Zijlstra * an intermediate lock (middle_class) where this lock is 19018eddac3fSPeter Zijlstra * not the same as the safe lock, then the lock chain is 19028eddac3fSPeter Zijlstra * used to describe the problem. Otherwise we would need 19038eddac3fSPeter Zijlstra * to show a different CPU case for each link in the chain 19048eddac3fSPeter Zijlstra * from the safe_class lock to the unsafe_class lock. 19058eddac3fSPeter Zijlstra */ 19068eddac3fSPeter Zijlstra if (parent != source) { 19078eddac3fSPeter Zijlstra printk("Chain exists of:\n "); 1908eb1cfd09SKent Overstreet __print_lock_name(src, source); 1909f943fe0fSDmitry Vyukov printk(KERN_CONT " --> "); 1910eb1cfd09SKent Overstreet __print_lock_name(NULL, parent); 1911f943fe0fSDmitry Vyukov printk(KERN_CONT " --> "); 1912eb1cfd09SKent Overstreet __print_lock_name(tgt, target); 1913f943fe0fSDmitry Vyukov printk(KERN_CONT "\n\n"); 19148eddac3fSPeter Zijlstra } 19158eddac3fSPeter Zijlstra 19168eddac3fSPeter Zijlstra printk(" Possible unsafe locking scenario:\n\n"); 19178eddac3fSPeter Zijlstra printk(" CPU0 CPU1\n"); 19188eddac3fSPeter Zijlstra printk(" ---- ----\n"); 19190471db44SBoqun Feng if (tgt_read != 0) 19200471db44SBoqun Feng printk(" rlock("); 19210471db44SBoqun Feng else 19228eddac3fSPeter Zijlstra printk(" lock("); 1923eb1cfd09SKent Overstreet __print_lock_name(tgt, target); 1924f943fe0fSDmitry Vyukov printk(KERN_CONT ");\n"); 19258eddac3fSPeter Zijlstra printk(" lock("); 1926eb1cfd09SKent Overstreet __print_lock_name(NULL, parent); 1927f943fe0fSDmitry Vyukov printk(KERN_CONT ");\n"); 19288eddac3fSPeter Zijlstra printk(" lock("); 1929eb1cfd09SKent Overstreet __print_lock_name(tgt, target); 1930f943fe0fSDmitry Vyukov printk(KERN_CONT ");\n"); 19310471db44SBoqun Feng if (src_read != 0) 19320471db44SBoqun Feng printk(" rlock("); 19330471db44SBoqun Feng else if (src->sync) 19340471db44SBoqun Feng printk(" sync("); 19350471db44SBoqun Feng else 19368eddac3fSPeter Zijlstra printk(" lock("); 1937eb1cfd09SKent Overstreet __print_lock_name(src, source); 1938f943fe0fSDmitry Vyukov printk(KERN_CONT ");\n"); 19398eddac3fSPeter Zijlstra printk("\n *** DEADLOCK ***\n\n"); 19408eddac3fSPeter Zijlstra } 19418eddac3fSPeter Zijlstra 19428eddac3fSPeter Zijlstra /* 19438eddac3fSPeter Zijlstra * When a circular dependency is detected, print the 19448eddac3fSPeter Zijlstra * header first: 19458eddac3fSPeter Zijlstra */ 1946f7c1c6b3SYuyang Du static noinline void 19478eddac3fSPeter Zijlstra print_circular_bug_header(struct lock_list *entry, unsigned int depth, 19488eddac3fSPeter Zijlstra struct held_lock *check_src, 19498eddac3fSPeter Zijlstra struct held_lock *check_tgt) 19508eddac3fSPeter Zijlstra { 19518eddac3fSPeter Zijlstra struct task_struct *curr = current; 19528eddac3fSPeter Zijlstra 19538eddac3fSPeter Zijlstra if (debug_locks_silent) 1954f7c1c6b3SYuyang Du return; 19558eddac3fSPeter Zijlstra 1956681fbec8SPaul E. McKenney pr_warn("\n"); 1957a5dd63efSPaul E. McKenney pr_warn("======================================================\n"); 1958a5dd63efSPaul E. McKenney pr_warn("WARNING: possible circular locking dependency detected\n"); 19598eddac3fSPeter Zijlstra print_kernel_ident(); 1960a5dd63efSPaul E. McKenney pr_warn("------------------------------------------------------\n"); 1961681fbec8SPaul E. McKenney pr_warn("%s/%d is trying to acquire lock:\n", 19628eddac3fSPeter Zijlstra curr->comm, task_pid_nr(curr)); 19638eddac3fSPeter Zijlstra print_lock(check_src); 1964383a4bc8SByungchul Park 1965681fbec8SPaul E. McKenney pr_warn("\nbut task is already holding lock:\n"); 1966383a4bc8SByungchul Park 19678eddac3fSPeter Zijlstra print_lock(check_tgt); 1968681fbec8SPaul E. McKenney pr_warn("\nwhich lock already depends on the new lock.\n\n"); 1969681fbec8SPaul E. McKenney pr_warn("\nthe existing dependency chain (in reverse order) is:\n"); 19708eddac3fSPeter Zijlstra 19718eddac3fSPeter Zijlstra print_circular_bug_entry(entry, depth); 19728eddac3fSPeter Zijlstra } 19738eddac3fSPeter Zijlstra 197468e30567SBoqun Feng /* 197568e30567SBoqun Feng * We are about to add A -> B into the dependency graph, and in __bfs() a 197668e30567SBoqun Feng * strong dependency path A -> .. -> B is found: hlock_class equals 197768e30567SBoqun Feng * entry->class. 197868e30567SBoqun Feng * 197968e30567SBoqun Feng * If A -> .. -> B can replace A -> B in any __bfs() search (means the former 198068e30567SBoqun Feng * is _stronger_ than or equal to the latter), we consider A -> B as redundant. 198168e30567SBoqun Feng * For example if A -> .. -> B is -(EN)-> (i.e. A -(E*)-> .. -(*N)-> B), and A 198268e30567SBoqun Feng * -> B is -(ER)-> or -(EN)->, then we don't need to add A -> B into the 198368e30567SBoqun Feng * dependency graph, as any strong path ..-> A -> B ->.. we can get with 198468e30567SBoqun Feng * having dependency A -> B, we could already get a equivalent path ..-> A -> 1985e2db7592SIngo Molnar * .. -> B -> .. with A -> .. -> B. Therefore A -> B is redundant. 198668e30567SBoqun Feng * 198768e30567SBoqun Feng * We need to make sure both the start and the end of A -> .. -> B is not 198868e30567SBoqun Feng * weaker than A -> B. For the start part, please see the comment in 198968e30567SBoqun Feng * check_redundant(). For the end part, we need: 199068e30567SBoqun Feng * 199168e30567SBoqun Feng * Either 199268e30567SBoqun Feng * 199368e30567SBoqun Feng * a) A -> B is -(*R)-> (everything is not weaker than that) 199468e30567SBoqun Feng * 199568e30567SBoqun Feng * or 199668e30567SBoqun Feng * 199768e30567SBoqun Feng * b) A -> .. -> B is -(*N)-> (nothing is stronger than this) 199868e30567SBoqun Feng * 199968e30567SBoqun Feng */ 200068e30567SBoqun Feng static inline bool hlock_equal(struct lock_list *entry, void *data) 20018eddac3fSPeter Zijlstra { 200268e30567SBoqun Feng struct held_lock *hlock = (struct held_lock *)data; 200368e30567SBoqun Feng 200468e30567SBoqun Feng return hlock_class(hlock) == entry->class && /* Found A -> .. -> B */ 200568e30567SBoqun Feng (hlock->read == 2 || /* A -> B is -(*R)-> */ 200668e30567SBoqun Feng !entry->only_xr); /* A -> .. -> B is -(*N)-> */ 20078eddac3fSPeter Zijlstra } 20088eddac3fSPeter Zijlstra 20099de0c9bbSBoqun Feng /* 20109de0c9bbSBoqun Feng * We are about to add B -> A into the dependency graph, and in __bfs() a 20119de0c9bbSBoqun Feng * strong dependency path A -> .. -> B is found: hlock_class equals 20129de0c9bbSBoqun Feng * entry->class. 20139de0c9bbSBoqun Feng * 20149de0c9bbSBoqun Feng * We will have a deadlock case (conflict) if A -> .. -> B -> A is a strong 20159de0c9bbSBoqun Feng * dependency cycle, that means: 20169de0c9bbSBoqun Feng * 20179de0c9bbSBoqun Feng * Either 20189de0c9bbSBoqun Feng * 20199de0c9bbSBoqun Feng * a) B -> A is -(E*)-> 20209de0c9bbSBoqun Feng * 20219de0c9bbSBoqun Feng * or 20229de0c9bbSBoqun Feng * 20239de0c9bbSBoqun Feng * b) A -> .. -> B is -(*N)-> (i.e. A -> .. -(*N)-> B) 20249de0c9bbSBoqun Feng * 20259de0c9bbSBoqun Feng * as then we don't have -(*R)-> -(S*)-> in the cycle. 20269de0c9bbSBoqun Feng */ 20279de0c9bbSBoqun Feng static inline bool hlock_conflict(struct lock_list *entry, void *data) 20289de0c9bbSBoqun Feng { 20299de0c9bbSBoqun Feng struct held_lock *hlock = (struct held_lock *)data; 20309de0c9bbSBoqun Feng 20319de0c9bbSBoqun Feng return hlock_class(hlock) == entry->class && /* Found A -> .. -> B */ 20329de0c9bbSBoqun Feng (hlock->read == 0 || /* B -> A is -(E*)-> */ 20339de0c9bbSBoqun Feng !entry->only_xr); /* A -> .. -> B is -(*N)-> */ 20349de0c9bbSBoqun Feng } 20359de0c9bbSBoqun Feng 2036f7c1c6b3SYuyang Du static noinline void print_circular_bug(struct lock_list *this, 20378eddac3fSPeter Zijlstra struct lock_list *target, 20388eddac3fSPeter Zijlstra struct held_lock *check_src, 2039b1abe462SThomas Gleixner struct held_lock *check_tgt) 20408eddac3fSPeter Zijlstra { 20418eddac3fSPeter Zijlstra struct task_struct *curr = current; 20428eddac3fSPeter Zijlstra struct lock_list *parent; 20438eddac3fSPeter Zijlstra struct lock_list *first_parent; 20448eddac3fSPeter Zijlstra int depth; 20458eddac3fSPeter Zijlstra 20468eddac3fSPeter Zijlstra if (!debug_locks_off_graph_unlock() || debug_locks_silent) 2047f7c1c6b3SYuyang Du return; 20488eddac3fSPeter Zijlstra 204912593b74SBart Van Assche this->trace = save_trace(); 205012593b74SBart Van Assche if (!this->trace) 2051f7c1c6b3SYuyang Du return; 20528eddac3fSPeter Zijlstra 20538eddac3fSPeter Zijlstra depth = get_lock_depth(target); 20548eddac3fSPeter Zijlstra 2055*59cd94efSJohn Ogness nbcon_cpu_emergency_enter(); 2056*59cd94efSJohn Ogness 20578eddac3fSPeter Zijlstra print_circular_bug_header(target, depth, check_src, check_tgt); 20588eddac3fSPeter Zijlstra 20598eddac3fSPeter Zijlstra parent = get_lock_parent(target); 20608eddac3fSPeter Zijlstra first_parent = parent; 20618eddac3fSPeter Zijlstra 20628eddac3fSPeter Zijlstra while (parent) { 20638eddac3fSPeter Zijlstra print_circular_bug_entry(parent, --depth); 20648eddac3fSPeter Zijlstra parent = get_lock_parent(parent); 20658eddac3fSPeter Zijlstra } 20668eddac3fSPeter Zijlstra 20678eddac3fSPeter Zijlstra printk("\nother info that might help us debug this:\n\n"); 20688eddac3fSPeter Zijlstra print_circular_lock_scenario(check_src, check_tgt, 20698eddac3fSPeter Zijlstra first_parent); 20708eddac3fSPeter Zijlstra 20718eddac3fSPeter Zijlstra lockdep_print_held_locks(curr); 20728eddac3fSPeter Zijlstra 20738eddac3fSPeter Zijlstra printk("\nstack backtrace:\n"); 20748eddac3fSPeter Zijlstra dump_stack(); 2075*59cd94efSJohn Ogness 2076*59cd94efSJohn Ogness nbcon_cpu_emergency_exit(); 20778eddac3fSPeter Zijlstra } 20788eddac3fSPeter Zijlstra 2079f7c1c6b3SYuyang Du static noinline void print_bfs_bug(int ret) 20808eddac3fSPeter Zijlstra { 20818eddac3fSPeter Zijlstra if (!debug_locks_off_graph_unlock()) 2082f7c1c6b3SYuyang Du return; 20838eddac3fSPeter Zijlstra 20848eddac3fSPeter Zijlstra /* 20858eddac3fSPeter Zijlstra * Breadth-first-search failed, graph got corrupted? 20868eddac3fSPeter Zijlstra */ 20878eddac3fSPeter Zijlstra WARN(1, "lockdep bfs error:%d\n", ret); 20888eddac3fSPeter Zijlstra } 20898eddac3fSPeter Zijlstra 209061775ed2SBoqun Feng static bool noop_count(struct lock_list *entry, void *data) 20918eddac3fSPeter Zijlstra { 20928eddac3fSPeter Zijlstra (*(unsigned long *)data)++; 209361775ed2SBoqun Feng return false; 20948eddac3fSPeter Zijlstra } 20958eddac3fSPeter Zijlstra 20965216d530SFengguang Wu static unsigned long __lockdep_count_forward_deps(struct lock_list *this) 20978eddac3fSPeter Zijlstra { 20988eddac3fSPeter Zijlstra unsigned long count = 0; 20993f649ab7SKees Cook struct lock_list *target_entry; 21008eddac3fSPeter Zijlstra 2101bc2dd71bSBoqun Feng __bfs_forwards(this, (void *)&count, noop_count, NULL, &target_entry); 21028eddac3fSPeter Zijlstra 21038eddac3fSPeter Zijlstra return count; 21048eddac3fSPeter Zijlstra } 21058eddac3fSPeter Zijlstra unsigned long lockdep_count_forward_deps(struct lock_class *class) 21068eddac3fSPeter Zijlstra { 21078eddac3fSPeter Zijlstra unsigned long ret, flags; 21088eddac3fSPeter Zijlstra struct lock_list this; 21098eddac3fSPeter Zijlstra 21106971c0f3SBoqun Feng __bfs_init_root(&this, class); 21118eddac3fSPeter Zijlstra 2112fcc784beSSteven Rostedt (VMware) raw_local_irq_save(flags); 2113248efb21SPeter Zijlstra lockdep_lock(); 21148eddac3fSPeter Zijlstra ret = __lockdep_count_forward_deps(&this); 2115248efb21SPeter Zijlstra lockdep_unlock(); 2116fcc784beSSteven Rostedt (VMware) raw_local_irq_restore(flags); 21178eddac3fSPeter Zijlstra 21188eddac3fSPeter Zijlstra return ret; 21198eddac3fSPeter Zijlstra } 21208eddac3fSPeter Zijlstra 21215216d530SFengguang Wu static unsigned long __lockdep_count_backward_deps(struct lock_list *this) 21228eddac3fSPeter Zijlstra { 21238eddac3fSPeter Zijlstra unsigned long count = 0; 21243f649ab7SKees Cook struct lock_list *target_entry; 21258eddac3fSPeter Zijlstra 2126bc2dd71bSBoqun Feng __bfs_backwards(this, (void *)&count, noop_count, NULL, &target_entry); 21278eddac3fSPeter Zijlstra 21288eddac3fSPeter Zijlstra return count; 21298eddac3fSPeter Zijlstra } 21308eddac3fSPeter Zijlstra 21318eddac3fSPeter Zijlstra unsigned long lockdep_count_backward_deps(struct lock_class *class) 21328eddac3fSPeter Zijlstra { 21338eddac3fSPeter Zijlstra unsigned long ret, flags; 21348eddac3fSPeter Zijlstra struct lock_list this; 21358eddac3fSPeter Zijlstra 21366971c0f3SBoqun Feng __bfs_init_root(&this, class); 21378eddac3fSPeter Zijlstra 2138fcc784beSSteven Rostedt (VMware) raw_local_irq_save(flags); 2139248efb21SPeter Zijlstra lockdep_lock(); 21408eddac3fSPeter Zijlstra ret = __lockdep_count_backward_deps(&this); 2141248efb21SPeter Zijlstra lockdep_unlock(); 2142fcc784beSSteven Rostedt (VMware) raw_local_irq_restore(flags); 21438eddac3fSPeter Zijlstra 21448eddac3fSPeter Zijlstra return ret; 21458eddac3fSPeter Zijlstra } 21468eddac3fSPeter Zijlstra 21478eddac3fSPeter Zijlstra /* 21488c2c2b44SYuyang Du * Check that the dependency graph starting at <src> can lead to 2149b11be024SBoqun Feng * <target> or not. 21508eddac3fSPeter Zijlstra */ 2151b11be024SBoqun Feng static noinline enum bfs_result 21529de0c9bbSBoqun Feng check_path(struct held_lock *target, struct lock_list *src_entry, 21539de0c9bbSBoqun Feng bool (*match)(struct lock_list *entry, void *data), 2154bc2dd71bSBoqun Feng bool (*skip)(struct lock_list *entry, void *data), 21558eddac3fSPeter Zijlstra struct lock_list **target_entry) 21568eddac3fSPeter Zijlstra { 2157b11be024SBoqun Feng enum bfs_result ret; 21588c2c2b44SYuyang Du 2159bc2dd71bSBoqun Feng ret = __bfs_forwards(src_entry, target, match, skip, target_entry); 21608c2c2b44SYuyang Du 2161b11be024SBoqun Feng if (unlikely(bfs_error(ret))) 21628c2c2b44SYuyang Du print_bfs_bug(ret); 21638c2c2b44SYuyang Du 21648c2c2b44SYuyang Du return ret; 21658c2c2b44SYuyang Du } 21668c2c2b44SYuyang Du 2167eb1cfd09SKent Overstreet static void print_deadlock_bug(struct task_struct *, struct held_lock *, struct held_lock *); 2168eb1cfd09SKent Overstreet 21698c2c2b44SYuyang Du /* 21708c2c2b44SYuyang Du * Prove that the dependency graph starting at <src> can not 21718c2c2b44SYuyang Du * lead to <target>. If it can, there is a circle when adding 21728c2c2b44SYuyang Du * <target> -> <src> dependency. 21738c2c2b44SYuyang Du * 2174b11be024SBoqun Feng * Print an error and return BFS_RMATCH if it does. 21758c2c2b44SYuyang Du */ 2176b11be024SBoqun Feng static noinline enum bfs_result 21778c2c2b44SYuyang Du check_noncircular(struct held_lock *src, struct held_lock *target, 217812593b74SBart Van Assche struct lock_trace **const trace) 21798c2c2b44SYuyang Du { 2180b11be024SBoqun Feng enum bfs_result ret; 21813f649ab7SKees Cook struct lock_list *target_entry; 21826971c0f3SBoqun Feng struct lock_list src_entry; 21836971c0f3SBoqun Feng 21846971c0f3SBoqun Feng bfs_init_root(&src_entry, src); 21858eddac3fSPeter Zijlstra 21868eddac3fSPeter Zijlstra debug_atomic_inc(nr_cyclic_checks); 21878eddac3fSPeter Zijlstra 2188bc2dd71bSBoqun Feng ret = check_path(target, &src_entry, hlock_conflict, NULL, &target_entry); 21898eddac3fSPeter Zijlstra 2190b11be024SBoqun Feng if (unlikely(ret == BFS_RMATCH)) { 219112593b74SBart Van Assche if (!*trace) { 21928c2c2b44SYuyang Du /* 21938c2c2b44SYuyang Du * If save_trace fails here, the printing might 21948c2c2b44SYuyang Du * trigger a WARN but because of the !nr_entries it 21958c2c2b44SYuyang Du * should not do bad things. 21968c2c2b44SYuyang Du */ 219712593b74SBart Van Assche *trace = save_trace(); 21988eddac3fSPeter Zijlstra } 21998eddac3fSPeter Zijlstra 2200eb1cfd09SKent Overstreet if (src->class_idx == target->class_idx) 2201eb1cfd09SKent Overstreet print_deadlock_bug(current, src, target); 2202eb1cfd09SKent Overstreet else 22038c2c2b44SYuyang Du print_circular_bug(&src_entry, target_entry, src, target); 22048c2c2b44SYuyang Du } 22058c2c2b44SYuyang Du 22068c2c2b44SYuyang Du return ret; 22078c2c2b44SYuyang Du } 22088c2c2b44SYuyang Du 2209e7a38f63SYuyang Du #ifdef CONFIG_TRACE_IRQFLAGS 2210948f8376SFrederic Weisbecker 2211f08e3888SBoqun Feng /* 2212f08e3888SBoqun Feng * Forwards and backwards subgraph searching, for the purposes of 2213f08e3888SBoqun Feng * proving that two subgraphs can be connected by a new dependency 2214f08e3888SBoqun Feng * without creating any illegal irq-safe -> irq-unsafe lock dependency. 2215f08e3888SBoqun Feng * 2216f08e3888SBoqun Feng * A irq safe->unsafe deadlock happens with the following conditions: 2217f08e3888SBoqun Feng * 2218f08e3888SBoqun Feng * 1) We have a strong dependency path A -> ... -> B 2219f08e3888SBoqun Feng * 2220f08e3888SBoqun Feng * 2) and we have ENABLED_IRQ usage of B and USED_IN_IRQ usage of A, therefore 2221f08e3888SBoqun Feng * irq can create a new dependency B -> A (consider the case that a holder 2222f08e3888SBoqun Feng * of B gets interrupted by an irq whose handler will try to acquire A). 2223f08e3888SBoqun Feng * 2224f08e3888SBoqun Feng * 3) the dependency circle A -> ... -> B -> A we get from 1) and 2) is a 2225f08e3888SBoqun Feng * strong circle: 2226f08e3888SBoqun Feng * 2227f08e3888SBoqun Feng * For the usage bits of B: 2228f08e3888SBoqun Feng * a) if A -> B is -(*N)->, then B -> A could be any type, so any 2229f08e3888SBoqun Feng * ENABLED_IRQ usage suffices. 2230f08e3888SBoqun Feng * b) if A -> B is -(*R)->, then B -> A must be -(E*)->, so only 2231f08e3888SBoqun Feng * ENABLED_IRQ_*_READ usage suffices. 2232f08e3888SBoqun Feng * 2233f08e3888SBoqun Feng * For the usage bits of A: 2234f08e3888SBoqun Feng * c) if A -> B is -(E*)->, then B -> A could be any type, so any 2235f08e3888SBoqun Feng * USED_IN_IRQ usage suffices. 2236f08e3888SBoqun Feng * d) if A -> B is -(S*)->, then B -> A must be -(*N)->, so only 2237f08e3888SBoqun Feng * USED_IN_IRQ_*_READ usage suffices. 2238f08e3888SBoqun Feng */ 2239f08e3888SBoqun Feng 2240f08e3888SBoqun Feng /* 2241f08e3888SBoqun Feng * There is a strong dependency path in the dependency graph: A -> B, and now 2242f08e3888SBoqun Feng * we need to decide which usage bit of A should be accumulated to detect 2243f08e3888SBoqun Feng * safe->unsafe bugs. 2244f08e3888SBoqun Feng * 2245f08e3888SBoqun Feng * Note that usage_accumulate() is used in backwards search, so ->only_xr 2246f08e3888SBoqun Feng * stands for whether A -> B only has -(S*)-> (in this case ->only_xr is true). 2247f08e3888SBoqun Feng * 2248f08e3888SBoqun Feng * As above, if only_xr is false, which means A -> B has -(E*)-> dependency 2249f08e3888SBoqun Feng * path, any usage of A should be considered. Otherwise, we should only 2250f08e3888SBoqun Feng * consider _READ usage. 2251f08e3888SBoqun Feng */ 225261775ed2SBoqun Feng static inline bool usage_accumulate(struct lock_list *entry, void *mask) 2253948f8376SFrederic Weisbecker { 2254f08e3888SBoqun Feng if (!entry->only_xr) 2255948f8376SFrederic Weisbecker *(unsigned long *)mask |= entry->class->usage_mask; 2256f08e3888SBoqun Feng else /* Mask out _READ usage bits */ 2257f08e3888SBoqun Feng *(unsigned long *)mask |= (entry->class->usage_mask & LOCKF_IRQ); 2258948f8376SFrederic Weisbecker 225961775ed2SBoqun Feng return false; 2260948f8376SFrederic Weisbecker } 2261948f8376SFrederic Weisbecker 22628eddac3fSPeter Zijlstra /* 2263f08e3888SBoqun Feng * There is a strong dependency path in the dependency graph: A -> B, and now 2264f08e3888SBoqun Feng * we need to decide which usage bit of B conflicts with the usage bits of A, 2265f08e3888SBoqun Feng * i.e. which usage bit of B may introduce safe->unsafe deadlocks. 2266f08e3888SBoqun Feng * 2267f08e3888SBoqun Feng * As above, if only_xr is false, which means A -> B has -(*N)-> dependency 2268f08e3888SBoqun Feng * path, any usage of B should be considered. Otherwise, we should only 2269f08e3888SBoqun Feng * consider _READ usage. 22708eddac3fSPeter Zijlstra */ 227161775ed2SBoqun Feng static inline bool usage_match(struct lock_list *entry, void *mask) 22728eddac3fSPeter Zijlstra { 2273f08e3888SBoqun Feng if (!entry->only_xr) 227461775ed2SBoqun Feng return !!(entry->class->usage_mask & *(unsigned long *)mask); 2275f08e3888SBoqun Feng else /* Mask out _READ usage bits */ 2276f08e3888SBoqun Feng return !!((entry->class->usage_mask & LOCKF_IRQ) & *(unsigned long *)mask); 22778eddac3fSPeter Zijlstra } 22788eddac3fSPeter Zijlstra 22795f296240SBoqun Feng static inline bool usage_skip(struct lock_list *entry, void *mask) 22805f296240SBoqun Feng { 22810cce06baSPeter Zijlstra if (entry->class->lock_type == LD_LOCK_NORMAL) 22820cce06baSPeter Zijlstra return false; 22830cce06baSPeter Zijlstra 22845f296240SBoqun Feng /* 22855f296240SBoqun Feng * Skip local_lock() for irq inversion detection. 22865f296240SBoqun Feng * 22875f296240SBoqun Feng * For !RT, local_lock() is not a real lock, so it won't carry any 22885f296240SBoqun Feng * dependency. 22895f296240SBoqun Feng * 22905f296240SBoqun Feng * For RT, an irq inversion happens when we have lock A and B, and on 22915f296240SBoqun Feng * some CPU we can have: 22925f296240SBoqun Feng * 22935f296240SBoqun Feng * lock(A); 22945f296240SBoqun Feng * <interrupted> 22955f296240SBoqun Feng * lock(B); 22965f296240SBoqun Feng * 22975f296240SBoqun Feng * where lock(B) cannot sleep, and we have a dependency B -> ... -> A. 22985f296240SBoqun Feng * 22995f296240SBoqun Feng * Now we prove local_lock() cannot exist in that dependency. First we 23005f296240SBoqun Feng * have the observation for any lock chain L1 -> ... -> Ln, for any 23015f296240SBoqun Feng * 1 <= i <= n, Li.inner_wait_type <= L1.inner_wait_type, otherwise 23025f296240SBoqun Feng * wait context check will complain. And since B is not a sleep lock, 23035f296240SBoqun Feng * therefore B.inner_wait_type >= 2, and since the inner_wait_type of 23045f296240SBoqun Feng * local_lock() is 3, which is greater than 2, therefore there is no 23055f296240SBoqun Feng * way the local_lock() exists in the dependency B -> ... -> A. 23065f296240SBoqun Feng * 23075f296240SBoqun Feng * As a result, we will skip local_lock(), when we search for irq 23085f296240SBoqun Feng * inversion bugs. 23095f296240SBoqun Feng */ 23100cce06baSPeter Zijlstra if (entry->class->lock_type == LD_LOCK_PERCPU && 23110cce06baSPeter Zijlstra DEBUG_LOCKS_WARN_ON(entry->class->wait_type_inner < LD_WAIT_CONFIG)) 23125f296240SBoqun Feng return false; 23135f296240SBoqun Feng 23140cce06baSPeter Zijlstra /* 23150cce06baSPeter Zijlstra * Skip WAIT_OVERRIDE for irq inversion detection -- it's not actually 23160cce06baSPeter Zijlstra * a lock and only used to override the wait_type. 23170cce06baSPeter Zijlstra */ 23180cce06baSPeter Zijlstra 23195f296240SBoqun Feng return true; 23205f296240SBoqun Feng } 23215f296240SBoqun Feng 23228eddac3fSPeter Zijlstra /* 23238eddac3fSPeter Zijlstra * Find a node in the forwards-direction dependency sub-graph starting 23248eddac3fSPeter Zijlstra * at @root->class that matches @bit. 23258eddac3fSPeter Zijlstra * 2326b11be024SBoqun Feng * Return BFS_MATCH if such a node exists in the subgraph, and put that node 23278eddac3fSPeter Zijlstra * into *@target_entry. 23288eddac3fSPeter Zijlstra */ 2329b11be024SBoqun Feng static enum bfs_result 2330627f364dSFrederic Weisbecker find_usage_forwards(struct lock_list *root, unsigned long usage_mask, 23318eddac3fSPeter Zijlstra struct lock_list **target_entry) 23328eddac3fSPeter Zijlstra { 2333b11be024SBoqun Feng enum bfs_result result; 23348eddac3fSPeter Zijlstra 23358eddac3fSPeter Zijlstra debug_atomic_inc(nr_find_usage_forwards_checks); 23368eddac3fSPeter Zijlstra 23375f296240SBoqun Feng result = __bfs_forwards(root, &usage_mask, usage_match, usage_skip, target_entry); 23388eddac3fSPeter Zijlstra 23398eddac3fSPeter Zijlstra return result; 23408eddac3fSPeter Zijlstra } 23418eddac3fSPeter Zijlstra 23428eddac3fSPeter Zijlstra /* 23438eddac3fSPeter Zijlstra * Find a node in the backwards-direction dependency sub-graph starting 23448eddac3fSPeter Zijlstra * at @root->class that matches @bit. 23458eddac3fSPeter Zijlstra */ 2346b11be024SBoqun Feng static enum bfs_result 2347627f364dSFrederic Weisbecker find_usage_backwards(struct lock_list *root, unsigned long usage_mask, 23488eddac3fSPeter Zijlstra struct lock_list **target_entry) 23498eddac3fSPeter Zijlstra { 2350b11be024SBoqun Feng enum bfs_result result; 23518eddac3fSPeter Zijlstra 23528eddac3fSPeter Zijlstra debug_atomic_inc(nr_find_usage_backwards_checks); 23538eddac3fSPeter Zijlstra 23545f296240SBoqun Feng result = __bfs_backwards(root, &usage_mask, usage_match, usage_skip, target_entry); 23558eddac3fSPeter Zijlstra 23568eddac3fSPeter Zijlstra return result; 23578eddac3fSPeter Zijlstra } 23588eddac3fSPeter Zijlstra 23598eddac3fSPeter Zijlstra static void print_lock_class_header(struct lock_class *class, int depth) 23608eddac3fSPeter Zijlstra { 23618eddac3fSPeter Zijlstra int bit; 23628eddac3fSPeter Zijlstra 23638eddac3fSPeter Zijlstra printk("%*s->", depth, ""); 2364eb1cfd09SKent Overstreet print_lock_name(NULL, class); 23658ca2b56cSWaiman Long #ifdef CONFIG_DEBUG_LOCKDEP 23668ca2b56cSWaiman Long printk(KERN_CONT " ops: %lu", debug_class_ops_read(class)); 23678ca2b56cSWaiman Long #endif 2368f943fe0fSDmitry Vyukov printk(KERN_CONT " {\n"); 23698eddac3fSPeter Zijlstra 23702bb8945bSPeter Zijlstra for (bit = 0; bit < LOCK_TRACE_STATES; bit++) { 23718eddac3fSPeter Zijlstra if (class->usage_mask & (1 << bit)) { 23728eddac3fSPeter Zijlstra int len = depth; 23738eddac3fSPeter Zijlstra 23748eddac3fSPeter Zijlstra len += printk("%*s %s", depth, "", usage_str[bit]); 2375f943fe0fSDmitry Vyukov len += printk(KERN_CONT " at:\n"); 237612593b74SBart Van Assche print_lock_trace(class->usage_traces[bit], len); 23778eddac3fSPeter Zijlstra } 23788eddac3fSPeter Zijlstra } 23798eddac3fSPeter Zijlstra printk("%*s }\n", depth, ""); 23808eddac3fSPeter Zijlstra 238104860d48SBorislav Petkov printk("%*s ... key at: [<%px>] %pS\n", 2382f943fe0fSDmitry Vyukov depth, "", class->key, class->key); 23838eddac3fSPeter Zijlstra } 23848eddac3fSPeter Zijlstra 23858eddac3fSPeter Zijlstra /* 238669c7a5fbSBoqun Feng * Dependency path printing: 238769c7a5fbSBoqun Feng * 238869c7a5fbSBoqun Feng * After BFS we get a lock dependency path (linked via ->parent of lock_list), 238969c7a5fbSBoqun Feng * printing out each lock in the dependency path will help on understanding how 239069c7a5fbSBoqun Feng * the deadlock could happen. Here are some details about dependency path 239169c7a5fbSBoqun Feng * printing: 239269c7a5fbSBoqun Feng * 239369c7a5fbSBoqun Feng * 1) A lock_list can be either forwards or backwards for a lock dependency, 239469c7a5fbSBoqun Feng * for a lock dependency A -> B, there are two lock_lists: 239569c7a5fbSBoqun Feng * 239669c7a5fbSBoqun Feng * a) lock_list in the ->locks_after list of A, whose ->class is B and 239769c7a5fbSBoqun Feng * ->links_to is A. In this case, we can say the lock_list is 239869c7a5fbSBoqun Feng * "A -> B" (forwards case). 239969c7a5fbSBoqun Feng * 240069c7a5fbSBoqun Feng * b) lock_list in the ->locks_before list of B, whose ->class is A 240169c7a5fbSBoqun Feng * and ->links_to is B. In this case, we can say the lock_list is 240269c7a5fbSBoqun Feng * "B <- A" (bacwards case). 240369c7a5fbSBoqun Feng * 240469c7a5fbSBoqun Feng * The ->trace of both a) and b) point to the call trace where B was 240569c7a5fbSBoqun Feng * acquired with A held. 240669c7a5fbSBoqun Feng * 240769c7a5fbSBoqun Feng * 2) A "helper" lock_list is introduced during BFS, this lock_list doesn't 240869c7a5fbSBoqun Feng * represent a certain lock dependency, it only provides an initial entry 240969c7a5fbSBoqun Feng * for BFS. For example, BFS may introduce a "helper" lock_list whose 241069c7a5fbSBoqun Feng * ->class is A, as a result BFS will search all dependencies starting with 241169c7a5fbSBoqun Feng * A, e.g. A -> B or A -> C. 241269c7a5fbSBoqun Feng * 241369c7a5fbSBoqun Feng * The notation of a forwards helper lock_list is like "-> A", which means 241469c7a5fbSBoqun Feng * we should search the forwards dependencies starting with "A", e.g A -> B 241569c7a5fbSBoqun Feng * or A -> C. 241669c7a5fbSBoqun Feng * 241769c7a5fbSBoqun Feng * The notation of a bacwards helper lock_list is like "<- B", which means 241869c7a5fbSBoqun Feng * we should search the backwards dependencies ending with "B", e.g. 241969c7a5fbSBoqun Feng * B <- A or B <- C. 242069c7a5fbSBoqun Feng */ 242169c7a5fbSBoqun Feng 242269c7a5fbSBoqun Feng /* 242369c7a5fbSBoqun Feng * printk the shortest lock dependencies from @root to @leaf in reverse order. 242469c7a5fbSBoqun Feng * 242569c7a5fbSBoqun Feng * We have a lock dependency path as follow: 242669c7a5fbSBoqun Feng * 242769c7a5fbSBoqun Feng * @root @leaf 242869c7a5fbSBoqun Feng * | | 242969c7a5fbSBoqun Feng * V V 243069c7a5fbSBoqun Feng * ->parent ->parent 243169c7a5fbSBoqun Feng * | lock_list | <--------- | lock_list | ... | lock_list | <--------- | lock_list | 243269c7a5fbSBoqun Feng * | -> L1 | | L1 -> L2 | ... |Ln-2 -> Ln-1| | Ln-1 -> Ln| 243369c7a5fbSBoqun Feng * 243469c7a5fbSBoqun Feng * , so it's natural that we start from @leaf and print every ->class and 243569c7a5fbSBoqun Feng * ->trace until we reach the @root. 24368eddac3fSPeter Zijlstra */ 24378eddac3fSPeter Zijlstra static void __used 24388eddac3fSPeter Zijlstra print_shortest_lock_dependencies(struct lock_list *leaf, 24398eddac3fSPeter Zijlstra struct lock_list *root) 24408eddac3fSPeter Zijlstra { 24418eddac3fSPeter Zijlstra struct lock_list *entry = leaf; 24428eddac3fSPeter Zijlstra int depth; 24438eddac3fSPeter Zijlstra 24448eddac3fSPeter Zijlstra /*compute depth from generated tree by BFS*/ 24458eddac3fSPeter Zijlstra depth = get_lock_depth(leaf); 24468eddac3fSPeter Zijlstra 24478eddac3fSPeter Zijlstra do { 24488eddac3fSPeter Zijlstra print_lock_class_header(entry->class, depth); 24498eddac3fSPeter Zijlstra printk("%*s ... acquired at:\n", depth, ""); 245012593b74SBart Van Assche print_lock_trace(entry->trace, 2); 24518eddac3fSPeter Zijlstra printk("\n"); 24528eddac3fSPeter Zijlstra 24538eddac3fSPeter Zijlstra if (depth == 0 && (entry != root)) { 24548eddac3fSPeter Zijlstra printk("lockdep:%s bad path found in chain graph\n", __func__); 24558eddac3fSPeter Zijlstra break; 24568eddac3fSPeter Zijlstra } 24578eddac3fSPeter Zijlstra 24588eddac3fSPeter Zijlstra entry = get_lock_parent(entry); 24598eddac3fSPeter Zijlstra depth--; 24608eddac3fSPeter Zijlstra } while (entry && (depth >= 0)); 24618eddac3fSPeter Zijlstra } 24628eddac3fSPeter Zijlstra 246369c7a5fbSBoqun Feng /* 246469c7a5fbSBoqun Feng * printk the shortest lock dependencies from @leaf to @root. 246569c7a5fbSBoqun Feng * 246669c7a5fbSBoqun Feng * We have a lock dependency path (from a backwards search) as follow: 246769c7a5fbSBoqun Feng * 246869c7a5fbSBoqun Feng * @leaf @root 246969c7a5fbSBoqun Feng * | | 247069c7a5fbSBoqun Feng * V V 247169c7a5fbSBoqun Feng * ->parent ->parent 247269c7a5fbSBoqun Feng * | lock_list | ---------> | lock_list | ... | lock_list | ---------> | lock_list | 247369c7a5fbSBoqun Feng * | L2 <- L1 | | L3 <- L2 | ... | Ln <- Ln-1 | | <- Ln | 247469c7a5fbSBoqun Feng * 247569c7a5fbSBoqun Feng * , so when we iterate from @leaf to @root, we actually print the lock 247669c7a5fbSBoqun Feng * dependency path L1 -> L2 -> .. -> Ln in the non-reverse order. 247769c7a5fbSBoqun Feng * 247869c7a5fbSBoqun Feng * Another thing to notice here is that ->class of L2 <- L1 is L1, while the 247969c7a5fbSBoqun Feng * ->trace of L2 <- L1 is the call trace of L2, in fact we don't have the call 248069c7a5fbSBoqun Feng * trace of L1 in the dependency path, which is alright, because most of the 248169c7a5fbSBoqun Feng * time we can figure out where L1 is held from the call trace of L2. 248269c7a5fbSBoqun Feng */ 248369c7a5fbSBoqun Feng static void __used 248469c7a5fbSBoqun Feng print_shortest_lock_dependencies_backwards(struct lock_list *leaf, 248569c7a5fbSBoqun Feng struct lock_list *root) 248669c7a5fbSBoqun Feng { 248769c7a5fbSBoqun Feng struct lock_list *entry = leaf; 248869c7a5fbSBoqun Feng const struct lock_trace *trace = NULL; 248969c7a5fbSBoqun Feng int depth; 249069c7a5fbSBoqun Feng 249169c7a5fbSBoqun Feng /*compute depth from generated tree by BFS*/ 249269c7a5fbSBoqun Feng depth = get_lock_depth(leaf); 249369c7a5fbSBoqun Feng 249469c7a5fbSBoqun Feng do { 249569c7a5fbSBoqun Feng print_lock_class_header(entry->class, depth); 249669c7a5fbSBoqun Feng if (trace) { 249769c7a5fbSBoqun Feng printk("%*s ... acquired at:\n", depth, ""); 249869c7a5fbSBoqun Feng print_lock_trace(trace, 2); 249969c7a5fbSBoqun Feng printk("\n"); 250069c7a5fbSBoqun Feng } 250169c7a5fbSBoqun Feng 250269c7a5fbSBoqun Feng /* 250369c7a5fbSBoqun Feng * Record the pointer to the trace for the next lock_list 250469c7a5fbSBoqun Feng * entry, see the comments for the function. 250569c7a5fbSBoqun Feng */ 250669c7a5fbSBoqun Feng trace = entry->trace; 250769c7a5fbSBoqun Feng 250869c7a5fbSBoqun Feng if (depth == 0 && (entry != root)) { 250969c7a5fbSBoqun Feng printk("lockdep:%s bad path found in chain graph\n", __func__); 251069c7a5fbSBoqun Feng break; 251169c7a5fbSBoqun Feng } 251269c7a5fbSBoqun Feng 251369c7a5fbSBoqun Feng entry = get_lock_parent(entry); 251469c7a5fbSBoqun Feng depth--; 251569c7a5fbSBoqun Feng } while (entry && (depth >= 0)); 251669c7a5fbSBoqun Feng } 251769c7a5fbSBoqun Feng 25188eddac3fSPeter Zijlstra static void 25198eddac3fSPeter Zijlstra print_irq_lock_scenario(struct lock_list *safe_entry, 25208eddac3fSPeter Zijlstra struct lock_list *unsafe_entry, 25218eddac3fSPeter Zijlstra struct lock_class *prev_class, 25228eddac3fSPeter Zijlstra struct lock_class *next_class) 25238eddac3fSPeter Zijlstra { 25248eddac3fSPeter Zijlstra struct lock_class *safe_class = safe_entry->class; 25258eddac3fSPeter Zijlstra struct lock_class *unsafe_class = unsafe_entry->class; 25268eddac3fSPeter Zijlstra struct lock_class *middle_class = prev_class; 25278eddac3fSPeter Zijlstra 25288eddac3fSPeter Zijlstra if (middle_class == safe_class) 25298eddac3fSPeter Zijlstra middle_class = next_class; 25308eddac3fSPeter Zijlstra 25318eddac3fSPeter Zijlstra /* 25328eddac3fSPeter Zijlstra * A direct locking problem where unsafe_class lock is taken 25338eddac3fSPeter Zijlstra * directly by safe_class lock, then all we need to show 25348eddac3fSPeter Zijlstra * is the deadlock scenario, as it is obvious that the 25358eddac3fSPeter Zijlstra * unsafe lock is taken under the safe lock. 25368eddac3fSPeter Zijlstra * 25378eddac3fSPeter Zijlstra * But if there is a chain instead, where the safe lock takes 25388eddac3fSPeter Zijlstra * an intermediate lock (middle_class) where this lock is 25398eddac3fSPeter Zijlstra * not the same as the safe lock, then the lock chain is 25408eddac3fSPeter Zijlstra * used to describe the problem. Otherwise we would need 25418eddac3fSPeter Zijlstra * to show a different CPU case for each link in the chain 25428eddac3fSPeter Zijlstra * from the safe_class lock to the unsafe_class lock. 25438eddac3fSPeter Zijlstra */ 25448eddac3fSPeter Zijlstra if (middle_class != unsafe_class) { 25458eddac3fSPeter Zijlstra printk("Chain exists of:\n "); 2546eb1cfd09SKent Overstreet __print_lock_name(NULL, safe_class); 2547f943fe0fSDmitry Vyukov printk(KERN_CONT " --> "); 2548eb1cfd09SKent Overstreet __print_lock_name(NULL, middle_class); 2549f943fe0fSDmitry Vyukov printk(KERN_CONT " --> "); 2550eb1cfd09SKent Overstreet __print_lock_name(NULL, unsafe_class); 2551f943fe0fSDmitry Vyukov printk(KERN_CONT "\n\n"); 25528eddac3fSPeter Zijlstra } 25538eddac3fSPeter Zijlstra 25548eddac3fSPeter Zijlstra printk(" Possible interrupt unsafe locking scenario:\n\n"); 25558eddac3fSPeter Zijlstra printk(" CPU0 CPU1\n"); 25568eddac3fSPeter Zijlstra printk(" ---- ----\n"); 25578eddac3fSPeter Zijlstra printk(" lock("); 2558eb1cfd09SKent Overstreet __print_lock_name(NULL, unsafe_class); 2559f943fe0fSDmitry Vyukov printk(KERN_CONT ");\n"); 25608eddac3fSPeter Zijlstra printk(" local_irq_disable();\n"); 25618eddac3fSPeter Zijlstra printk(" lock("); 2562eb1cfd09SKent Overstreet __print_lock_name(NULL, safe_class); 2563f943fe0fSDmitry Vyukov printk(KERN_CONT ");\n"); 25648eddac3fSPeter Zijlstra printk(" lock("); 2565eb1cfd09SKent Overstreet __print_lock_name(NULL, middle_class); 2566f943fe0fSDmitry Vyukov printk(KERN_CONT ");\n"); 25678eddac3fSPeter Zijlstra printk(" <Interrupt>\n"); 25688eddac3fSPeter Zijlstra printk(" lock("); 2569eb1cfd09SKent Overstreet __print_lock_name(NULL, safe_class); 2570f943fe0fSDmitry Vyukov printk(KERN_CONT ");\n"); 25718eddac3fSPeter Zijlstra printk("\n *** DEADLOCK ***\n\n"); 25728eddac3fSPeter Zijlstra } 25738eddac3fSPeter Zijlstra 2574f7c1c6b3SYuyang Du static void 25758eddac3fSPeter Zijlstra print_bad_irq_dependency(struct task_struct *curr, 25768eddac3fSPeter Zijlstra struct lock_list *prev_root, 25778eddac3fSPeter Zijlstra struct lock_list *next_root, 25788eddac3fSPeter Zijlstra struct lock_list *backwards_entry, 25798eddac3fSPeter Zijlstra struct lock_list *forwards_entry, 25808eddac3fSPeter Zijlstra struct held_lock *prev, 25818eddac3fSPeter Zijlstra struct held_lock *next, 25828eddac3fSPeter Zijlstra enum lock_usage_bit bit1, 25838eddac3fSPeter Zijlstra enum lock_usage_bit bit2, 25848eddac3fSPeter Zijlstra const char *irqclass) 25858eddac3fSPeter Zijlstra { 25868eddac3fSPeter Zijlstra if (!debug_locks_off_graph_unlock() || debug_locks_silent) 2587f7c1c6b3SYuyang Du return; 25888eddac3fSPeter Zijlstra 2589*59cd94efSJohn Ogness nbcon_cpu_emergency_enter(); 2590*59cd94efSJohn Ogness 2591681fbec8SPaul E. McKenney pr_warn("\n"); 2592a5dd63efSPaul E. McKenney pr_warn("=====================================================\n"); 2593a5dd63efSPaul E. McKenney pr_warn("WARNING: %s-safe -> %s-unsafe lock order detected\n", 25948eddac3fSPeter Zijlstra irqclass, irqclass); 25958eddac3fSPeter Zijlstra print_kernel_ident(); 2596a5dd63efSPaul E. McKenney pr_warn("-----------------------------------------------------\n"); 2597681fbec8SPaul E. McKenney pr_warn("%s/%d [HC%u[%lu]:SC%u[%lu]:HE%u:SE%u] is trying to acquire:\n", 25988eddac3fSPeter Zijlstra curr->comm, task_pid_nr(curr), 2599f9ad4a5fSPeter Zijlstra lockdep_hardirq_context(), hardirq_count() >> HARDIRQ_SHIFT, 26008eddac3fSPeter Zijlstra curr->softirq_context, softirq_count() >> SOFTIRQ_SHIFT, 2601f9ad4a5fSPeter Zijlstra lockdep_hardirqs_enabled(), 26028eddac3fSPeter Zijlstra curr->softirqs_enabled); 26038eddac3fSPeter Zijlstra print_lock(next); 26048eddac3fSPeter Zijlstra 2605681fbec8SPaul E. McKenney pr_warn("\nand this task is already holding:\n"); 26068eddac3fSPeter Zijlstra print_lock(prev); 2607681fbec8SPaul E. McKenney pr_warn("which would create a new lock dependency:\n"); 2608eb1cfd09SKent Overstreet print_lock_name(prev, hlock_class(prev)); 2609681fbec8SPaul E. McKenney pr_cont(" ->"); 2610eb1cfd09SKent Overstreet print_lock_name(next, hlock_class(next)); 2611681fbec8SPaul E. McKenney pr_cont("\n"); 26128eddac3fSPeter Zijlstra 2613681fbec8SPaul E. McKenney pr_warn("\nbut this new dependency connects a %s-irq-safe lock:\n", 26148eddac3fSPeter Zijlstra irqclass); 2615eb1cfd09SKent Overstreet print_lock_name(NULL, backwards_entry->class); 2616681fbec8SPaul E. McKenney pr_warn("\n... which became %s-irq-safe at:\n", irqclass); 26178eddac3fSPeter Zijlstra 261812593b74SBart Van Assche print_lock_trace(backwards_entry->class->usage_traces[bit1], 1); 26198eddac3fSPeter Zijlstra 2620681fbec8SPaul E. McKenney pr_warn("\nto a %s-irq-unsafe lock:\n", irqclass); 2621eb1cfd09SKent Overstreet print_lock_name(NULL, forwards_entry->class); 2622681fbec8SPaul E. McKenney pr_warn("\n... which became %s-irq-unsafe at:\n", irqclass); 2623681fbec8SPaul E. McKenney pr_warn("..."); 26248eddac3fSPeter Zijlstra 262512593b74SBart Van Assche print_lock_trace(forwards_entry->class->usage_traces[bit2], 1); 26268eddac3fSPeter Zijlstra 2627681fbec8SPaul E. McKenney pr_warn("\nother info that might help us debug this:\n\n"); 26288eddac3fSPeter Zijlstra print_irq_lock_scenario(backwards_entry, forwards_entry, 26298eddac3fSPeter Zijlstra hlock_class(prev), hlock_class(next)); 26308eddac3fSPeter Zijlstra 26318eddac3fSPeter Zijlstra lockdep_print_held_locks(curr); 26328eddac3fSPeter Zijlstra 2633681fbec8SPaul E. McKenney pr_warn("\nthe dependencies between %s-irq-safe lock and the holding lock:\n", irqclass); 263469c7a5fbSBoqun Feng print_shortest_lock_dependencies_backwards(backwards_entry, prev_root); 26358eddac3fSPeter Zijlstra 2636681fbec8SPaul E. McKenney pr_warn("\nthe dependencies between the lock to be acquired"); 2637681fbec8SPaul E. McKenney pr_warn(" and %s-irq-unsafe lock:\n", irqclass); 263812593b74SBart Van Assche next_root->trace = save_trace(); 263912593b74SBart Van Assche if (!next_root->trace) 2640*59cd94efSJohn Ogness goto out; 26418eddac3fSPeter Zijlstra print_shortest_lock_dependencies(forwards_entry, next_root); 26428eddac3fSPeter Zijlstra 2643681fbec8SPaul E. McKenney pr_warn("\nstack backtrace:\n"); 26448eddac3fSPeter Zijlstra dump_stack(); 2645*59cd94efSJohn Ogness out: 2646*59cd94efSJohn Ogness nbcon_cpu_emergency_exit(); 26478eddac3fSPeter Zijlstra } 26488eddac3fSPeter Zijlstra 26498eddac3fSPeter Zijlstra static const char *state_names[] = { 26508eddac3fSPeter Zijlstra #define LOCKDEP_STATE(__STATE) \ 26518eddac3fSPeter Zijlstra __stringify(__STATE), 26528eddac3fSPeter Zijlstra #include "lockdep_states.h" 26538eddac3fSPeter Zijlstra #undef LOCKDEP_STATE 26548eddac3fSPeter Zijlstra }; 26558eddac3fSPeter Zijlstra 26568eddac3fSPeter Zijlstra static const char *state_rnames[] = { 26578eddac3fSPeter Zijlstra #define LOCKDEP_STATE(__STATE) \ 26588eddac3fSPeter Zijlstra __stringify(__STATE)"-READ", 26598eddac3fSPeter Zijlstra #include "lockdep_states.h" 26608eddac3fSPeter Zijlstra #undef LOCKDEP_STATE 26618eddac3fSPeter Zijlstra }; 26628eddac3fSPeter Zijlstra 26638eddac3fSPeter Zijlstra static inline const char *state_name(enum lock_usage_bit bit) 26648eddac3fSPeter Zijlstra { 2665c902a1e8SFrederic Weisbecker if (bit & LOCK_USAGE_READ_MASK) 2666c902a1e8SFrederic Weisbecker return state_rnames[bit >> LOCK_USAGE_DIR_MASK]; 2667c902a1e8SFrederic Weisbecker else 2668c902a1e8SFrederic Weisbecker return state_names[bit >> LOCK_USAGE_DIR_MASK]; 26698eddac3fSPeter Zijlstra } 26708eddac3fSPeter Zijlstra 2671948f8376SFrederic Weisbecker /* 2672948f8376SFrederic Weisbecker * The bit number is encoded like: 2673948f8376SFrederic Weisbecker * 2674948f8376SFrederic Weisbecker * bit0: 0 exclusive, 1 read lock 2675948f8376SFrederic Weisbecker * bit1: 0 used in irq, 1 irq enabled 2676948f8376SFrederic Weisbecker * bit2-n: state 2677948f8376SFrederic Weisbecker */ 26788eddac3fSPeter Zijlstra static int exclusive_bit(int new_bit) 26798eddac3fSPeter Zijlstra { 2680bba2a8f1SFrederic Weisbecker int state = new_bit & LOCK_USAGE_STATE_MASK; 2681bba2a8f1SFrederic Weisbecker int dir = new_bit & LOCK_USAGE_DIR_MASK; 26828eddac3fSPeter Zijlstra 26838eddac3fSPeter Zijlstra /* 26848eddac3fSPeter Zijlstra * keep state, bit flip the direction and strip read. 26858eddac3fSPeter Zijlstra */ 2686bba2a8f1SFrederic Weisbecker return state | (dir ^ LOCK_USAGE_DIR_MASK); 26878eddac3fSPeter Zijlstra } 26888eddac3fSPeter Zijlstra 2689948f8376SFrederic Weisbecker /* 2690948f8376SFrederic Weisbecker * Observe that when given a bitmask where each bitnr is encoded as above, a 2691948f8376SFrederic Weisbecker * right shift of the mask transforms the individual bitnrs as -1 and 2692948f8376SFrederic Weisbecker * conversely, a left shift transforms into +1 for the individual bitnrs. 2693948f8376SFrederic Weisbecker * 2694948f8376SFrederic Weisbecker * So for all bits whose number have LOCK_ENABLED_* set (bitnr1 == 1), we can 2695948f8376SFrederic Weisbecker * create the mask with those bit numbers using LOCK_USED_IN_* (bitnr1 == 0) 2696948f8376SFrederic Weisbecker * instead by subtracting the bit number by 2, or shifting the mask right by 2. 2697948f8376SFrederic Weisbecker * 2698948f8376SFrederic Weisbecker * Similarly, bitnr1 == 0 becomes bitnr1 == 1 by adding 2, or shifting left 2. 2699948f8376SFrederic Weisbecker * 2700948f8376SFrederic Weisbecker * So split the mask (note that LOCKF_ENABLED_IRQ_ALL|LOCKF_USED_IN_IRQ_ALL is 2701948f8376SFrederic Weisbecker * all bits set) and recompose with bitnr1 flipped. 2702948f8376SFrederic Weisbecker */ 2703948f8376SFrederic Weisbecker static unsigned long invert_dir_mask(unsigned long mask) 27048eddac3fSPeter Zijlstra { 2705948f8376SFrederic Weisbecker unsigned long excl = 0; 27068eddac3fSPeter Zijlstra 2707948f8376SFrederic Weisbecker /* Invert dir */ 2708948f8376SFrederic Weisbecker excl |= (mask & LOCKF_ENABLED_IRQ_ALL) >> LOCK_USAGE_DIR_MASK; 2709948f8376SFrederic Weisbecker excl |= (mask & LOCKF_USED_IN_IRQ_ALL) << LOCK_USAGE_DIR_MASK; 27108eddac3fSPeter Zijlstra 2711948f8376SFrederic Weisbecker return excl; 27128eddac3fSPeter Zijlstra } 27138eddac3fSPeter Zijlstra 2714948f8376SFrederic Weisbecker /* 2715f08e3888SBoqun Feng * Note that a LOCK_ENABLED_IRQ_*_READ usage and a LOCK_USED_IN_IRQ_*_READ 2716f08e3888SBoqun Feng * usage may cause deadlock too, for example: 2717f08e3888SBoqun Feng * 2718f08e3888SBoqun Feng * P1 P2 2719f08e3888SBoqun Feng * <irq disabled> 2720f08e3888SBoqun Feng * write_lock(l1); <irq enabled> 2721f08e3888SBoqun Feng * read_lock(l2); 2722f08e3888SBoqun Feng * write_lock(l2); 2723f08e3888SBoqun Feng * <in irq> 2724f08e3888SBoqun Feng * read_lock(l1); 2725f08e3888SBoqun Feng * 2726f08e3888SBoqun Feng * , in above case, l1 will be marked as LOCK_USED_IN_IRQ_HARDIRQ_READ and l2 2727f08e3888SBoqun Feng * will marked as LOCK_ENABLE_IRQ_HARDIRQ_READ, and this is a possible 2728f08e3888SBoqun Feng * deadlock. 2729f08e3888SBoqun Feng * 2730f08e3888SBoqun Feng * In fact, all of the following cases may cause deadlocks: 2731f08e3888SBoqun Feng * 2732f08e3888SBoqun Feng * LOCK_USED_IN_IRQ_* -> LOCK_ENABLED_IRQ_* 2733f08e3888SBoqun Feng * LOCK_USED_IN_IRQ_*_READ -> LOCK_ENABLED_IRQ_* 2734f08e3888SBoqun Feng * LOCK_USED_IN_IRQ_* -> LOCK_ENABLED_IRQ_*_READ 2735f08e3888SBoqun Feng * LOCK_USED_IN_IRQ_*_READ -> LOCK_ENABLED_IRQ_*_READ 2736f08e3888SBoqun Feng * 2737f08e3888SBoqun Feng * As a result, to calculate the "exclusive mask", first we invert the 2738f08e3888SBoqun Feng * direction (USED_IN/ENABLED) of the original mask, and 1) for all bits with 2739f08e3888SBoqun Feng * bitnr0 set (LOCK_*_READ), add those with bitnr0 cleared (LOCK_*). 2) for all 2740f08e3888SBoqun Feng * bits with bitnr0 cleared (LOCK_*_READ), add those with bitnr0 set (LOCK_*). 2741948f8376SFrederic Weisbecker */ 2742948f8376SFrederic Weisbecker static unsigned long exclusive_mask(unsigned long mask) 2743948f8376SFrederic Weisbecker { 2744948f8376SFrederic Weisbecker unsigned long excl = invert_dir_mask(mask); 2745948f8376SFrederic Weisbecker 2746948f8376SFrederic Weisbecker excl |= (excl & LOCKF_IRQ_READ) >> LOCK_USAGE_READ_MASK; 2747f08e3888SBoqun Feng excl |= (excl & LOCKF_IRQ) << LOCK_USAGE_READ_MASK; 2748948f8376SFrederic Weisbecker 2749948f8376SFrederic Weisbecker return excl; 2750948f8376SFrederic Weisbecker } 2751948f8376SFrederic Weisbecker 2752948f8376SFrederic Weisbecker /* 2753948f8376SFrederic Weisbecker * Retrieve the _possible_ original mask to which @mask is 2754948f8376SFrederic Weisbecker * exclusive. Ie: this is the opposite of exclusive_mask(). 2755948f8376SFrederic Weisbecker * Note that 2 possible original bits can match an exclusive 2756948f8376SFrederic Weisbecker * bit: one has LOCK_USAGE_READ_MASK set, the other has it 2757948f8376SFrederic Weisbecker * cleared. So both are returned for each exclusive bit. 2758948f8376SFrederic Weisbecker */ 2759948f8376SFrederic Weisbecker static unsigned long original_mask(unsigned long mask) 2760948f8376SFrederic Weisbecker { 2761948f8376SFrederic Weisbecker unsigned long excl = invert_dir_mask(mask); 2762948f8376SFrederic Weisbecker 2763948f8376SFrederic Weisbecker /* Include read in existing usages */ 2764f08e3888SBoqun Feng excl |= (excl & LOCKF_IRQ_READ) >> LOCK_USAGE_READ_MASK; 2765948f8376SFrederic Weisbecker excl |= (excl & LOCKF_IRQ) << LOCK_USAGE_READ_MASK; 2766948f8376SFrederic Weisbecker 2767948f8376SFrederic Weisbecker return excl; 2768948f8376SFrederic Weisbecker } 2769948f8376SFrederic Weisbecker 2770948f8376SFrederic Weisbecker /* 2771948f8376SFrederic Weisbecker * Find the first pair of bit match between an original 2772948f8376SFrederic Weisbecker * usage mask and an exclusive usage mask. 2773948f8376SFrederic Weisbecker */ 2774948f8376SFrederic Weisbecker static int find_exclusive_match(unsigned long mask, 2775948f8376SFrederic Weisbecker unsigned long excl_mask, 2776948f8376SFrederic Weisbecker enum lock_usage_bit *bitp, 2777948f8376SFrederic Weisbecker enum lock_usage_bit *excl_bitp) 2778948f8376SFrederic Weisbecker { 2779f08e3888SBoqun Feng int bit, excl, excl_read; 2780948f8376SFrederic Weisbecker 2781948f8376SFrederic Weisbecker for_each_set_bit(bit, &mask, LOCK_USED) { 2782f08e3888SBoqun Feng /* 2783f08e3888SBoqun Feng * exclusive_bit() strips the read bit, however, 2784f08e3888SBoqun Feng * LOCK_ENABLED_IRQ_*_READ may cause deadlocks too, so we need 2785f08e3888SBoqun Feng * to search excl | LOCK_USAGE_READ_MASK as well. 2786f08e3888SBoqun Feng */ 2787948f8376SFrederic Weisbecker excl = exclusive_bit(bit); 2788f08e3888SBoqun Feng excl_read = excl | LOCK_USAGE_READ_MASK; 2789948f8376SFrederic Weisbecker if (excl_mask & lock_flag(excl)) { 2790948f8376SFrederic Weisbecker *bitp = bit; 2791948f8376SFrederic Weisbecker *excl_bitp = excl; 2792948f8376SFrederic Weisbecker return 0; 2793f08e3888SBoqun Feng } else if (excl_mask & lock_flag(excl_read)) { 2794f08e3888SBoqun Feng *bitp = bit; 2795f08e3888SBoqun Feng *excl_bitp = excl_read; 2796f08e3888SBoqun Feng return 0; 2797948f8376SFrederic Weisbecker } 2798948f8376SFrederic Weisbecker } 2799948f8376SFrederic Weisbecker return -1; 2800948f8376SFrederic Weisbecker } 2801948f8376SFrederic Weisbecker 2802948f8376SFrederic Weisbecker /* 2803948f8376SFrederic Weisbecker * Prove that the new dependency does not connect a hardirq-safe(-read) 2804948f8376SFrederic Weisbecker * lock with a hardirq-unsafe lock - to achieve this we search 2805948f8376SFrederic Weisbecker * the backwards-subgraph starting at <prev>, and the 2806948f8376SFrederic Weisbecker * forwards-subgraph starting at <next>: 2807948f8376SFrederic Weisbecker */ 2808948f8376SFrederic Weisbecker static int check_irq_usage(struct task_struct *curr, struct held_lock *prev, 28098eddac3fSPeter Zijlstra struct held_lock *next) 28108eddac3fSPeter Zijlstra { 2811948f8376SFrederic Weisbecker unsigned long usage_mask = 0, forward_mask, backward_mask; 2812948f8376SFrederic Weisbecker enum lock_usage_bit forward_bit = 0, backward_bit = 0; 28133f649ab7SKees Cook struct lock_list *target_entry1; 28143f649ab7SKees Cook struct lock_list *target_entry; 2815948f8376SFrederic Weisbecker struct lock_list this, that; 2816b11be024SBoqun Feng enum bfs_result ret; 28178eddac3fSPeter Zijlstra 2818948f8376SFrederic Weisbecker /* 2819948f8376SFrederic Weisbecker * Step 1: gather all hard/soft IRQs usages backward in an 2820948f8376SFrederic Weisbecker * accumulated usage mask. 2821948f8376SFrederic Weisbecker */ 2822f08e3888SBoqun Feng bfs_init_rootb(&this, prev); 2823948f8376SFrederic Weisbecker 28245f296240SBoqun Feng ret = __bfs_backwards(&this, &usage_mask, usage_accumulate, usage_skip, NULL); 2825b11be024SBoqun Feng if (bfs_error(ret)) { 2826f7c1c6b3SYuyang Du print_bfs_bug(ret); 2827f7c1c6b3SYuyang Du return 0; 2828f7c1c6b3SYuyang Du } 2829948f8376SFrederic Weisbecker 2830948f8376SFrederic Weisbecker usage_mask &= LOCKF_USED_IN_IRQ_ALL; 2831948f8376SFrederic Weisbecker if (!usage_mask) 28328eddac3fSPeter Zijlstra return 1; 2833948f8376SFrederic Weisbecker 2834948f8376SFrederic Weisbecker /* 2835948f8376SFrederic Weisbecker * Step 2: find exclusive uses forward that match the previous 2836948f8376SFrederic Weisbecker * backward accumulated mask. 2837948f8376SFrederic Weisbecker */ 2838948f8376SFrederic Weisbecker forward_mask = exclusive_mask(usage_mask); 2839948f8376SFrederic Weisbecker 2840f08e3888SBoqun Feng bfs_init_root(&that, next); 2841948f8376SFrederic Weisbecker 2842948f8376SFrederic Weisbecker ret = find_usage_forwards(&that, forward_mask, &target_entry1); 2843b11be024SBoqun Feng if (bfs_error(ret)) { 2844f7c1c6b3SYuyang Du print_bfs_bug(ret); 2845f7c1c6b3SYuyang Du return 0; 2846f7c1c6b3SYuyang Du } 2847b11be024SBoqun Feng if (ret == BFS_RNOMATCH) 2848b11be024SBoqun Feng return 1; 2849948f8376SFrederic Weisbecker 2850948f8376SFrederic Weisbecker /* 2851948f8376SFrederic Weisbecker * Step 3: we found a bad match! Now retrieve a lock from the backward 2852948f8376SFrederic Weisbecker * list whose usage mask matches the exclusive usage mask from the 2853948f8376SFrederic Weisbecker * lock found on the forward list. 28547b1f8c61SBoqun Feng * 28557b1f8c61SBoqun Feng * Note, we should only keep the LOCKF_ENABLED_IRQ_ALL bits, considering 28567b1f8c61SBoqun Feng * the follow case: 28577b1f8c61SBoqun Feng * 28587b1f8c61SBoqun Feng * When trying to add A -> B to the graph, we find that there is a 28597b1f8c61SBoqun Feng * hardirq-safe L, that L -> ... -> A, and another hardirq-unsafe M, 28607b1f8c61SBoqun Feng * that B -> ... -> M. However M is **softirq-safe**, if we use exact 28617b1f8c61SBoqun Feng * invert bits of M's usage_mask, we will find another lock N that is 28627b1f8c61SBoqun Feng * **softirq-unsafe** and N -> ... -> A, however N -> .. -> M will not 28637b1f8c61SBoqun Feng * cause a inversion deadlock. 2864948f8376SFrederic Weisbecker */ 28657b1f8c61SBoqun Feng backward_mask = original_mask(target_entry1->class->usage_mask & LOCKF_ENABLED_IRQ_ALL); 2866948f8376SFrederic Weisbecker 2867948f8376SFrederic Weisbecker ret = find_usage_backwards(&this, backward_mask, &target_entry); 2868b11be024SBoqun Feng if (bfs_error(ret)) { 2869f7c1c6b3SYuyang Du print_bfs_bug(ret); 2870f7c1c6b3SYuyang Du return 0; 2871f7c1c6b3SYuyang Du } 2872b11be024SBoqun Feng if (DEBUG_LOCKS_WARN_ON(ret == BFS_RNOMATCH)) 2873948f8376SFrederic Weisbecker return 1; 2874948f8376SFrederic Weisbecker 2875948f8376SFrederic Weisbecker /* 2876948f8376SFrederic Weisbecker * Step 4: narrow down to a pair of incompatible usage bits 2877948f8376SFrederic Weisbecker * and report it. 2878948f8376SFrederic Weisbecker */ 2879948f8376SFrederic Weisbecker ret = find_exclusive_match(target_entry->class->usage_mask, 2880948f8376SFrederic Weisbecker target_entry1->class->usage_mask, 2881948f8376SFrederic Weisbecker &backward_bit, &forward_bit); 2882948f8376SFrederic Weisbecker if (DEBUG_LOCKS_WARN_ON(ret == -1)) 2883948f8376SFrederic Weisbecker return 1; 2884948f8376SFrederic Weisbecker 2885f7c1c6b3SYuyang Du print_bad_irq_dependency(curr, &this, &that, 2886948f8376SFrederic Weisbecker target_entry, target_entry1, 2887948f8376SFrederic Weisbecker prev, next, 2888948f8376SFrederic Weisbecker backward_bit, forward_bit, 2889948f8376SFrederic Weisbecker state_name(backward_bit)); 2890f7c1c6b3SYuyang Du 2891f7c1c6b3SYuyang Du return 0; 28928eddac3fSPeter Zijlstra } 28938eddac3fSPeter Zijlstra 28948eddac3fSPeter Zijlstra #else 28958eddac3fSPeter Zijlstra 2896948f8376SFrederic Weisbecker static inline int check_irq_usage(struct task_struct *curr, 2897948f8376SFrederic Weisbecker struct held_lock *prev, struct held_lock *next) 28988eddac3fSPeter Zijlstra { 28998eddac3fSPeter Zijlstra return 1; 29008eddac3fSPeter Zijlstra } 29015f296240SBoqun Feng 29025f296240SBoqun Feng static inline bool usage_skip(struct lock_list *entry, void *mask) 29035f296240SBoqun Feng { 29045f296240SBoqun Feng return false; 29055f296240SBoqun Feng } 29065f296240SBoqun Feng 2907b3b9c187SWaiman Long #endif /* CONFIG_TRACE_IRQFLAGS */ 29088eddac3fSPeter Zijlstra 2909175b1a60SPeter Zijlstra #ifdef CONFIG_LOCKDEP_SMALL 2910175b1a60SPeter Zijlstra /* 2911175b1a60SPeter Zijlstra * Check that the dependency graph starting at <src> can lead to 2912175b1a60SPeter Zijlstra * <target> or not. If it can, <src> -> <target> dependency is already 2913175b1a60SPeter Zijlstra * in the graph. 2914175b1a60SPeter Zijlstra * 29150e8a89d4SXiongwei Song * Return BFS_RMATCH if it does, or BFS_RNOMATCH if it does not, return BFS_E* if 2916175b1a60SPeter Zijlstra * any error appears in the bfs search. 2917175b1a60SPeter Zijlstra */ 2918175b1a60SPeter Zijlstra static noinline enum bfs_result 2919175b1a60SPeter Zijlstra check_redundant(struct held_lock *src, struct held_lock *target) 2920175b1a60SPeter Zijlstra { 2921175b1a60SPeter Zijlstra enum bfs_result ret; 2922175b1a60SPeter Zijlstra struct lock_list *target_entry; 2923175b1a60SPeter Zijlstra struct lock_list src_entry; 2924175b1a60SPeter Zijlstra 2925175b1a60SPeter Zijlstra bfs_init_root(&src_entry, src); 2926175b1a60SPeter Zijlstra /* 2927175b1a60SPeter Zijlstra * Special setup for check_redundant(). 2928175b1a60SPeter Zijlstra * 2929175b1a60SPeter Zijlstra * To report redundant, we need to find a strong dependency path that 2930175b1a60SPeter Zijlstra * is equal to or stronger than <src> -> <target>. So if <src> is E, 2931175b1a60SPeter Zijlstra * we need to let __bfs() only search for a path starting at a -(E*)->, 2932175b1a60SPeter Zijlstra * we achieve this by setting the initial node's ->only_xr to true in 2933175b1a60SPeter Zijlstra * that case. And if <prev> is S, we set initial ->only_xr to false 2934175b1a60SPeter Zijlstra * because both -(S*)-> (equal) and -(E*)-> (stronger) are redundant. 2935175b1a60SPeter Zijlstra */ 2936175b1a60SPeter Zijlstra src_entry.only_xr = src->read == 0; 2937175b1a60SPeter Zijlstra 2938175b1a60SPeter Zijlstra debug_atomic_inc(nr_redundant_checks); 2939175b1a60SPeter Zijlstra 29405f296240SBoqun Feng /* 29415f296240SBoqun Feng * Note: we skip local_lock() for redundant check, because as the 29425f296240SBoqun Feng * comment in usage_skip(), A -> local_lock() -> B and A -> B are not 29435f296240SBoqun Feng * the same. 29445f296240SBoqun Feng */ 29455f296240SBoqun Feng ret = check_path(target, &src_entry, hlock_equal, usage_skip, &target_entry); 2946175b1a60SPeter Zijlstra 2947175b1a60SPeter Zijlstra if (ret == BFS_RMATCH) 2948175b1a60SPeter Zijlstra debug_atomic_inc(nr_redundant); 2949175b1a60SPeter Zijlstra 2950175b1a60SPeter Zijlstra return ret; 2951175b1a60SPeter Zijlstra } 2952175b1a60SPeter Zijlstra 2953175b1a60SPeter Zijlstra #else 2954175b1a60SPeter Zijlstra 2955175b1a60SPeter Zijlstra static inline enum bfs_result 2956175b1a60SPeter Zijlstra check_redundant(struct held_lock *src, struct held_lock *target) 2957175b1a60SPeter Zijlstra { 2958175b1a60SPeter Zijlstra return BFS_RNOMATCH; 2959175b1a60SPeter Zijlstra } 2960175b1a60SPeter Zijlstra 2961175b1a60SPeter Zijlstra #endif 2962175b1a60SPeter Zijlstra 2963b3b9c187SWaiman Long static void inc_chains(int irq_context) 29648eddac3fSPeter Zijlstra { 2965b3b9c187SWaiman Long if (irq_context & LOCK_CHAIN_HARDIRQ_CONTEXT) 2966b3b9c187SWaiman Long nr_hardirq_chains++; 2967b3b9c187SWaiman Long else if (irq_context & LOCK_CHAIN_SOFTIRQ_CONTEXT) 2968b3b9c187SWaiman Long nr_softirq_chains++; 2969b3b9c187SWaiman Long else 29708eddac3fSPeter Zijlstra nr_process_chains++; 29718eddac3fSPeter Zijlstra } 29728eddac3fSPeter Zijlstra 2973b3b9c187SWaiman Long static void dec_chains(int irq_context) 2974b3b9c187SWaiman Long { 2975b3b9c187SWaiman Long if (irq_context & LOCK_CHAIN_HARDIRQ_CONTEXT) 2976b3b9c187SWaiman Long nr_hardirq_chains--; 2977b3b9c187SWaiman Long else if (irq_context & LOCK_CHAIN_SOFTIRQ_CONTEXT) 2978b3b9c187SWaiman Long nr_softirq_chains--; 2979b3b9c187SWaiman Long else 2980b3b9c187SWaiman Long nr_process_chains--; 2981b3b9c187SWaiman Long } 29828eddac3fSPeter Zijlstra 29838eddac3fSPeter Zijlstra static void 2984f7c1c6b3SYuyang Du print_deadlock_scenario(struct held_lock *nxt, struct held_lock *prv) 29858eddac3fSPeter Zijlstra { 29868eddac3fSPeter Zijlstra struct lock_class *next = hlock_class(nxt); 29878eddac3fSPeter Zijlstra struct lock_class *prev = hlock_class(prv); 29888eddac3fSPeter Zijlstra 29898eddac3fSPeter Zijlstra printk(" Possible unsafe locking scenario:\n\n"); 29908eddac3fSPeter Zijlstra printk(" CPU0\n"); 29918eddac3fSPeter Zijlstra printk(" ----\n"); 29928eddac3fSPeter Zijlstra printk(" lock("); 2993eb1cfd09SKent Overstreet __print_lock_name(prv, prev); 2994f943fe0fSDmitry Vyukov printk(KERN_CONT ");\n"); 29958eddac3fSPeter Zijlstra printk(" lock("); 2996eb1cfd09SKent Overstreet __print_lock_name(nxt, next); 2997f943fe0fSDmitry Vyukov printk(KERN_CONT ");\n"); 29988eddac3fSPeter Zijlstra printk("\n *** DEADLOCK ***\n\n"); 29998eddac3fSPeter Zijlstra printk(" May be due to missing lock nesting notation\n\n"); 30008eddac3fSPeter Zijlstra } 30018eddac3fSPeter Zijlstra 3002f7c1c6b3SYuyang Du static void 30038eddac3fSPeter Zijlstra print_deadlock_bug(struct task_struct *curr, struct held_lock *prev, 30048eddac3fSPeter Zijlstra struct held_lock *next) 30058eddac3fSPeter Zijlstra { 3006eb1cfd09SKent Overstreet struct lock_class *class = hlock_class(prev); 3007eb1cfd09SKent Overstreet 30088eddac3fSPeter Zijlstra if (!debug_locks_off_graph_unlock() || debug_locks_silent) 3009f7c1c6b3SYuyang Du return; 30108eddac3fSPeter Zijlstra 3011*59cd94efSJohn Ogness nbcon_cpu_emergency_enter(); 3012*59cd94efSJohn Ogness 3013681fbec8SPaul E. McKenney pr_warn("\n"); 3014a5dd63efSPaul E. McKenney pr_warn("============================================\n"); 3015a5dd63efSPaul E. McKenney pr_warn("WARNING: possible recursive locking detected\n"); 30168eddac3fSPeter Zijlstra print_kernel_ident(); 3017a5dd63efSPaul E. McKenney pr_warn("--------------------------------------------\n"); 3018681fbec8SPaul E. McKenney pr_warn("%s/%d is trying to acquire lock:\n", 30198eddac3fSPeter Zijlstra curr->comm, task_pid_nr(curr)); 30208eddac3fSPeter Zijlstra print_lock(next); 3021681fbec8SPaul E. McKenney pr_warn("\nbut task is already holding lock:\n"); 30228eddac3fSPeter Zijlstra print_lock(prev); 30238eddac3fSPeter Zijlstra 3024eb1cfd09SKent Overstreet if (class->cmp_fn) { 3025eb1cfd09SKent Overstreet pr_warn("and the lock comparison function returns %i:\n", 3026eb1cfd09SKent Overstreet class->cmp_fn(prev->instance, next->instance)); 3027eb1cfd09SKent Overstreet } 3028eb1cfd09SKent Overstreet 3029681fbec8SPaul E. McKenney pr_warn("\nother info that might help us debug this:\n"); 30308eddac3fSPeter Zijlstra print_deadlock_scenario(next, prev); 30318eddac3fSPeter Zijlstra lockdep_print_held_locks(curr); 30328eddac3fSPeter Zijlstra 3033681fbec8SPaul E. McKenney pr_warn("\nstack backtrace:\n"); 30348eddac3fSPeter Zijlstra dump_stack(); 3035*59cd94efSJohn Ogness 3036*59cd94efSJohn Ogness nbcon_cpu_emergency_exit(); 30378eddac3fSPeter Zijlstra } 30388eddac3fSPeter Zijlstra 30398eddac3fSPeter Zijlstra /* 30408eddac3fSPeter Zijlstra * Check whether we are holding such a class already. 30418eddac3fSPeter Zijlstra * 30428eddac3fSPeter Zijlstra * (Note that this has to be done separately, because the graph cannot 30438eddac3fSPeter Zijlstra * detect such classes of deadlocks.) 30448eddac3fSPeter Zijlstra * 3045d61fc96aSBoqun Feng * Returns: 0 on deadlock detected, 1 on OK, 2 if another lock with the same 3046d61fc96aSBoqun Feng * lock class is held but nest_lock is also held, i.e. we rely on the 3047d61fc96aSBoqun Feng * nest_lock to avoid the deadlock. 30488eddac3fSPeter Zijlstra */ 30498eddac3fSPeter Zijlstra static int 30504609c4f9SYuyang Du check_deadlock(struct task_struct *curr, struct held_lock *next) 30518eddac3fSPeter Zijlstra { 3052eb1cfd09SKent Overstreet struct lock_class *class; 30538eddac3fSPeter Zijlstra struct held_lock *prev; 30548eddac3fSPeter Zijlstra struct held_lock *nest = NULL; 30558eddac3fSPeter Zijlstra int i; 30568eddac3fSPeter Zijlstra 30578eddac3fSPeter Zijlstra for (i = 0; i < curr->lockdep_depth; i++) { 30588eddac3fSPeter Zijlstra prev = curr->held_locks + i; 30598eddac3fSPeter Zijlstra 30608eddac3fSPeter Zijlstra if (prev->instance == next->nest_lock) 30618eddac3fSPeter Zijlstra nest = prev; 30628eddac3fSPeter Zijlstra 30638eddac3fSPeter Zijlstra if (hlock_class(prev) != hlock_class(next)) 30648eddac3fSPeter Zijlstra continue; 30658eddac3fSPeter Zijlstra 30668eddac3fSPeter Zijlstra /* 30678eddac3fSPeter Zijlstra * Allow read-after-read recursion of the same 30688eddac3fSPeter Zijlstra * lock class (i.e. read_lock(lock)+read_lock(lock)): 30698eddac3fSPeter Zijlstra */ 30704609c4f9SYuyang Du if ((next->read == 2) && prev->read) 3071d61fc96aSBoqun Feng continue; 30728eddac3fSPeter Zijlstra 3073eb1cfd09SKent Overstreet class = hlock_class(prev); 3074eb1cfd09SKent Overstreet 3075eb1cfd09SKent Overstreet if (class->cmp_fn && 3076eb1cfd09SKent Overstreet class->cmp_fn(prev->instance, next->instance) < 0) 3077eb1cfd09SKent Overstreet continue; 3078eb1cfd09SKent Overstreet 30798eddac3fSPeter Zijlstra /* 30808eddac3fSPeter Zijlstra * We're holding the nest_lock, which serializes this lock's 30818eddac3fSPeter Zijlstra * nesting behaviour. 30828eddac3fSPeter Zijlstra */ 30838eddac3fSPeter Zijlstra if (nest) 30848eddac3fSPeter Zijlstra return 2; 30858eddac3fSPeter Zijlstra 3086f7c1c6b3SYuyang Du print_deadlock_bug(curr, prev, next); 3087f7c1c6b3SYuyang Du return 0; 30888eddac3fSPeter Zijlstra } 30898eddac3fSPeter Zijlstra return 1; 30908eddac3fSPeter Zijlstra } 30918eddac3fSPeter Zijlstra 30928eddac3fSPeter Zijlstra /* 30938eddac3fSPeter Zijlstra * There was a chain-cache miss, and we are about to add a new dependency 3094154f185eSYuyang Du * to a previous lock. We validate the following rules: 30958eddac3fSPeter Zijlstra * 30968eddac3fSPeter Zijlstra * - would the adding of the <prev> -> <next> dependency create a 30978eddac3fSPeter Zijlstra * circular dependency in the graph? [== circular deadlock] 30988eddac3fSPeter Zijlstra * 30998eddac3fSPeter Zijlstra * - does the new prev->next dependency connect any hardirq-safe lock 31008eddac3fSPeter Zijlstra * (in the full backwards-subgraph starting at <prev>) with any 31018eddac3fSPeter Zijlstra * hardirq-unsafe lock (in the full forwards-subgraph starting at 31028eddac3fSPeter Zijlstra * <next>)? [== illegal lock inversion with hardirq contexts] 31038eddac3fSPeter Zijlstra * 31048eddac3fSPeter Zijlstra * - does the new prev->next dependency connect any softirq-safe lock 31058eddac3fSPeter Zijlstra * (in the full backwards-subgraph starting at <prev>) with any 31068eddac3fSPeter Zijlstra * softirq-unsafe lock (in the full forwards-subgraph starting at 31078eddac3fSPeter Zijlstra * <next>)? [== illegal lock inversion with softirq contexts] 31088eddac3fSPeter Zijlstra * 31098eddac3fSPeter Zijlstra * any of these scenarios could lead to a deadlock. 31108eddac3fSPeter Zijlstra * 31118eddac3fSPeter Zijlstra * Then if all the validations pass, we add the forwards and backwards 31128eddac3fSPeter Zijlstra * dependency. 31138eddac3fSPeter Zijlstra */ 31148eddac3fSPeter Zijlstra static int 31158eddac3fSPeter Zijlstra check_prev_add(struct task_struct *curr, struct held_lock *prev, 3116bd76eca1SBoqun Feng struct held_lock *next, u16 distance, 311712593b74SBart Van Assche struct lock_trace **const trace) 31188eddac3fSPeter Zijlstra { 31198b405d5cSPeter Zijlstra struct lock_list *entry; 3120b11be024SBoqun Feng enum bfs_result ret; 31218eddac3fSPeter Zijlstra 3122a0b0fd53SBart Van Assche if (!hlock_class(prev)->key || !hlock_class(next)->key) { 3123a0b0fd53SBart Van Assche /* 3124a0b0fd53SBart Van Assche * The warning statements below may trigger a use-after-free 3125a0b0fd53SBart Van Assche * of the class name. It is better to trigger a use-after free 3126a0b0fd53SBart Van Assche * and to have the class name most of the time instead of not 3127a0b0fd53SBart Van Assche * having the class name available. 3128a0b0fd53SBart Van Assche */ 3129a0b0fd53SBart Van Assche WARN_ONCE(!debug_locks_silent && !hlock_class(prev)->key, 3130a0b0fd53SBart Van Assche "Detected use-after-free of lock class %px/%s\n", 3131a0b0fd53SBart Van Assche hlock_class(prev), 3132a0b0fd53SBart Van Assche hlock_class(prev)->name); 3133a0b0fd53SBart Van Assche WARN_ONCE(!debug_locks_silent && !hlock_class(next)->key, 3134a0b0fd53SBart Van Assche "Detected use-after-free of lock class %px/%s\n", 3135a0b0fd53SBart Van Assche hlock_class(next), 3136a0b0fd53SBart Van Assche hlock_class(next)->name); 3137a0b0fd53SBart Van Assche return 2; 3138a0b0fd53SBart Van Assche } 3139a0b0fd53SBart Van Assche 3140eb1cfd09SKent Overstreet if (prev->class_idx == next->class_idx) { 3141eb1cfd09SKent Overstreet struct lock_class *class = hlock_class(prev); 3142eb1cfd09SKent Overstreet 3143eb1cfd09SKent Overstreet if (class->cmp_fn && 3144eb1cfd09SKent Overstreet class->cmp_fn(prev->instance, next->instance) < 0) 3145eb1cfd09SKent Overstreet return 2; 3146eb1cfd09SKent Overstreet } 3147eb1cfd09SKent Overstreet 31488eddac3fSPeter Zijlstra /* 31498eddac3fSPeter Zijlstra * Prove that the new <prev> -> <next> dependency would not 31508eddac3fSPeter Zijlstra * create a circular dependency in the graph. (We do this by 3151154f185eSYuyang Du * a breadth-first search into the graph starting at <next>, 3152154f185eSYuyang Du * and check whether we can reach <prev>.) 31538eddac3fSPeter Zijlstra * 3154154f185eSYuyang Du * The search is limited by the size of the circular queue (i.e., 3155154f185eSYuyang Du * MAX_CIRCULAR_QUEUE_SIZE) which keeps track of a breadth of nodes 3156154f185eSYuyang Du * in the graph whose neighbours are to be checked. 31578eddac3fSPeter Zijlstra */ 31588c2c2b44SYuyang Du ret = check_noncircular(next, prev, trace); 3159b11be024SBoqun Feng if (unlikely(bfs_error(ret) || ret == BFS_RMATCH)) 3160f7c1c6b3SYuyang Du return 0; 31618eddac3fSPeter Zijlstra 3162948f8376SFrederic Weisbecker if (!check_irq_usage(curr, prev, next)) 31638eddac3fSPeter Zijlstra return 0; 31648eddac3fSPeter Zijlstra 31658eddac3fSPeter Zijlstra /* 31668eddac3fSPeter Zijlstra * Is the <prev> -> <next> dependency already present? 31678eddac3fSPeter Zijlstra * 31688eddac3fSPeter Zijlstra * (this may occur even though this is a new chain: consider 31698eddac3fSPeter Zijlstra * e.g. the L1 -> L2 -> L3 -> L4 and the L5 -> L1 -> L2 -> L3 31708eddac3fSPeter Zijlstra * chains - the second one will be new, but L1 already has 31718eddac3fSPeter Zijlstra * L2 added to its dependency list, due to the first chain.) 31728eddac3fSPeter Zijlstra */ 31738eddac3fSPeter Zijlstra list_for_each_entry(entry, &hlock_class(prev)->locks_after, entry) { 31748eddac3fSPeter Zijlstra if (entry->class == hlock_class(next)) { 31758eddac3fSPeter Zijlstra if (distance == 1) 31768eddac3fSPeter Zijlstra entry->distance = 1; 31773454a36dSBoqun Feng entry->dep |= calc_dep(prev, next); 31783454a36dSBoqun Feng 31793454a36dSBoqun Feng /* 31803454a36dSBoqun Feng * Also, update the reverse dependency in @next's 31813454a36dSBoqun Feng * ->locks_before list. 31823454a36dSBoqun Feng * 31833454a36dSBoqun Feng * Here we reuse @entry as the cursor, which is fine 31843454a36dSBoqun Feng * because we won't go to the next iteration of the 31853454a36dSBoqun Feng * outer loop: 31863454a36dSBoqun Feng * 31873454a36dSBoqun Feng * For normal cases, we return in the inner loop. 31883454a36dSBoqun Feng * 31893454a36dSBoqun Feng * If we fail to return, we have inconsistency, i.e. 31903454a36dSBoqun Feng * <prev>::locks_after contains <next> while 31913454a36dSBoqun Feng * <next>::locks_before doesn't contain <prev>. In 31923454a36dSBoqun Feng * that case, we return after the inner and indicate 31933454a36dSBoqun Feng * something is wrong. 31943454a36dSBoqun Feng */ 31953454a36dSBoqun Feng list_for_each_entry(entry, &hlock_class(next)->locks_before, entry) { 31963454a36dSBoqun Feng if (entry->class == hlock_class(prev)) { 31973454a36dSBoqun Feng if (distance == 1) 31983454a36dSBoqun Feng entry->distance = 1; 31993454a36dSBoqun Feng entry->dep |= calc_depb(prev, next); 320070911fdcSByungchul Park return 1; 32018eddac3fSPeter Zijlstra } 32028eddac3fSPeter Zijlstra } 32038eddac3fSPeter Zijlstra 32043454a36dSBoqun Feng /* <prev> is not found in <next>::locks_before */ 32053454a36dSBoqun Feng return 0; 32063454a36dSBoqun Feng } 32073454a36dSBoqun Feng } 32083454a36dSBoqun Feng 3209ae813308SPeter Zijlstra /* 3210ae813308SPeter Zijlstra * Is the <prev> -> <next> link redundant? 3211ae813308SPeter Zijlstra */ 32128c2c2b44SYuyang Du ret = check_redundant(prev, next); 3213b11be024SBoqun Feng if (bfs_error(ret)) 3214b11be024SBoqun Feng return 0; 3215b11be024SBoqun Feng else if (ret == BFS_RMATCH) 3216b11be024SBoqun Feng return 2; 3217ae813308SPeter Zijlstra 321812593b74SBart Van Assche if (!*trace) { 321912593b74SBart Van Assche *trace = save_trace(); 322012593b74SBart Van Assche if (!*trace) 32218eddac3fSPeter Zijlstra return 0; 322212593b74SBart Van Assche } 32238eddac3fSPeter Zijlstra 32248eddac3fSPeter Zijlstra /* 32258eddac3fSPeter Zijlstra * Ok, all validations passed, add the new lock 32268eddac3fSPeter Zijlstra * to the previous lock's dependency list: 32278eddac3fSPeter Zijlstra */ 322886cffb80SBart Van Assche ret = add_lock_to_list(hlock_class(next), hlock_class(prev), 32298b023accSNick Desaulniers &hlock_class(prev)->locks_after, distance, 32308b023accSNick Desaulniers calc_dep(prev, next), *trace); 32318eddac3fSPeter Zijlstra 32328eddac3fSPeter Zijlstra if (!ret) 32338eddac3fSPeter Zijlstra return 0; 32348eddac3fSPeter Zijlstra 323586cffb80SBart Van Assche ret = add_lock_to_list(hlock_class(prev), hlock_class(next), 32368b023accSNick Desaulniers &hlock_class(next)->locks_before, distance, 32378b023accSNick Desaulniers calc_depb(prev, next), *trace); 32388eddac3fSPeter Zijlstra if (!ret) 32398eddac3fSPeter Zijlstra return 0; 32408eddac3fSPeter Zijlstra 324170911fdcSByungchul Park return 2; 32428eddac3fSPeter Zijlstra } 32438eddac3fSPeter Zijlstra 32448eddac3fSPeter Zijlstra /* 32458eddac3fSPeter Zijlstra * Add the dependency to all directly-previous locks that are 'relevant'. 32468eddac3fSPeter Zijlstra * The ones that are relevant are (in increasing distance from curr): 32478eddac3fSPeter Zijlstra * all consecutive trylock entries and the final non-trylock entry - or 32488eddac3fSPeter Zijlstra * the end of this context's lock-chain - whichever comes first. 32498eddac3fSPeter Zijlstra */ 32508eddac3fSPeter Zijlstra static int 32518eddac3fSPeter Zijlstra check_prevs_add(struct task_struct *curr, struct held_lock *next) 32528eddac3fSPeter Zijlstra { 325312593b74SBart Van Assche struct lock_trace *trace = NULL; 32548eddac3fSPeter Zijlstra int depth = curr->lockdep_depth; 32558eddac3fSPeter Zijlstra struct held_lock *hlock; 32568eddac3fSPeter Zijlstra 32578eddac3fSPeter Zijlstra /* 32588eddac3fSPeter Zijlstra * Debugging checks. 32598eddac3fSPeter Zijlstra * 32608eddac3fSPeter Zijlstra * Depth must not be zero for a non-head lock: 32618eddac3fSPeter Zijlstra */ 32628eddac3fSPeter Zijlstra if (!depth) 32638eddac3fSPeter Zijlstra goto out_bug; 32648eddac3fSPeter Zijlstra /* 32658eddac3fSPeter Zijlstra * At least two relevant locks must exist for this 32668eddac3fSPeter Zijlstra * to be a head: 32678eddac3fSPeter Zijlstra */ 32688eddac3fSPeter Zijlstra if (curr->held_locks[depth].irq_context != 32698eddac3fSPeter Zijlstra curr->held_locks[depth-1].irq_context) 32708eddac3fSPeter Zijlstra goto out_bug; 32718eddac3fSPeter Zijlstra 32728eddac3fSPeter Zijlstra for (;;) { 3273bd76eca1SBoqun Feng u16 distance = curr->lockdep_depth - depth + 1; 32748eddac3fSPeter Zijlstra hlock = curr->held_locks + depth - 1; 3275e966eaeeSIngo Molnar 3276621c9dacSBoqun Feng if (hlock->check) { 3277621c9dacSBoqun Feng int ret = check_prev_add(curr, hlock, next, distance, &trace); 3278ce07a941SByungchul Park if (!ret) 32798eddac3fSPeter Zijlstra return 0; 3280ce07a941SByungchul Park 3281ce07a941SByungchul Park /* 32828eddac3fSPeter Zijlstra * Stop after the first non-trylock entry, 32838eddac3fSPeter Zijlstra * as non-trylock entries have added their 32848eddac3fSPeter Zijlstra * own direct dependencies already, so this 32858eddac3fSPeter Zijlstra * lock is connected to them indirectly: 32868eddac3fSPeter Zijlstra */ 32878eddac3fSPeter Zijlstra if (!hlock->trylock) 32888eddac3fSPeter Zijlstra break; 32898eddac3fSPeter Zijlstra } 3290e966eaeeSIngo Molnar 32918eddac3fSPeter Zijlstra depth--; 32928eddac3fSPeter Zijlstra /* 32938eddac3fSPeter Zijlstra * End of lock-stack? 32948eddac3fSPeter Zijlstra */ 32958eddac3fSPeter Zijlstra if (!depth) 32968eddac3fSPeter Zijlstra break; 32978eddac3fSPeter Zijlstra /* 32988eddac3fSPeter Zijlstra * Stop the search if we cross into another context: 32998eddac3fSPeter Zijlstra */ 33008eddac3fSPeter Zijlstra if (curr->held_locks[depth].irq_context != 33018eddac3fSPeter Zijlstra curr->held_locks[depth-1].irq_context) 33028eddac3fSPeter Zijlstra break; 33038eddac3fSPeter Zijlstra } 33048eddac3fSPeter Zijlstra return 1; 33058eddac3fSPeter Zijlstra out_bug: 33068eddac3fSPeter Zijlstra if (!debug_locks_off_graph_unlock()) 33078eddac3fSPeter Zijlstra return 0; 33088eddac3fSPeter Zijlstra 33098eddac3fSPeter Zijlstra /* 33108eddac3fSPeter Zijlstra * Clearly we all shouldn't be here, but since we made it we 33118eddac3fSPeter Zijlstra * can reliable say we messed up our state. See the above two 33128eddac3fSPeter Zijlstra * gotos for reasons why we could possibly end up here. 33138eddac3fSPeter Zijlstra */ 33148eddac3fSPeter Zijlstra WARN_ON(1); 33158eddac3fSPeter Zijlstra 33168eddac3fSPeter Zijlstra return 0; 33178eddac3fSPeter Zijlstra } 33188eddac3fSPeter Zijlstra 33198eddac3fSPeter Zijlstra struct lock_chain lock_chains[MAX_LOCKDEP_CHAINS]; 3320de4643a7SBart Van Assche static DECLARE_BITMAP(lock_chains_in_use, MAX_LOCKDEP_CHAINS); 33218eddac3fSPeter Zijlstra static u16 chain_hlocks[MAX_LOCKDEP_CHAIN_HLOCKS]; 3322797b82ebSWaiman Long unsigned long nr_zapped_lock_chains; 3323810507feSWaiman Long unsigned int nr_free_chain_hlocks; /* Free chain_hlocks in buckets */ 3324810507feSWaiman Long unsigned int nr_lost_chain_hlocks; /* Lost chain_hlocks */ 3325810507feSWaiman Long unsigned int nr_large_chain_blocks; /* size > MAX_CHAIN_BUCKETS */ 3326810507feSWaiman Long 3327810507feSWaiman Long /* 3328810507feSWaiman Long * The first 2 chain_hlocks entries in the chain block in the bucket 3329810507feSWaiman Long * list contains the following meta data: 3330810507feSWaiman Long * 3331810507feSWaiman Long * entry[0]: 3332810507feSWaiman Long * Bit 15 - always set to 1 (it is not a class index) 3333810507feSWaiman Long * Bits 0-14 - upper 15 bits of the next block index 3334810507feSWaiman Long * entry[1] - lower 16 bits of next block index 3335810507feSWaiman Long * 3336810507feSWaiman Long * A next block index of all 1 bits means it is the end of the list. 3337810507feSWaiman Long * 3338810507feSWaiman Long * On the unsized bucket (bucket-0), the 3rd and 4th entries contain 3339810507feSWaiman Long * the chain block size: 3340810507feSWaiman Long * 3341810507feSWaiman Long * entry[2] - upper 16 bits of the chain block size 3342810507feSWaiman Long * entry[3] - lower 16 bits of the chain block size 3343810507feSWaiman Long */ 3344810507feSWaiman Long #define MAX_CHAIN_BUCKETS 16 3345810507feSWaiman Long #define CHAIN_BLK_FLAG (1U << 15) 3346810507feSWaiman Long #define CHAIN_BLK_LIST_END 0xFFFFU 3347810507feSWaiman Long 3348810507feSWaiman Long static int chain_block_buckets[MAX_CHAIN_BUCKETS]; 3349810507feSWaiman Long 3350810507feSWaiman Long static inline int size_to_bucket(int size) 3351810507feSWaiman Long { 3352810507feSWaiman Long if (size > MAX_CHAIN_BUCKETS) 3353810507feSWaiman Long return 0; 3354810507feSWaiman Long 3355810507feSWaiman Long return size - 1; 3356810507feSWaiman Long } 3357810507feSWaiman Long 3358810507feSWaiman Long /* 3359810507feSWaiman Long * Iterate all the chain blocks in a bucket. 3360810507feSWaiman Long */ 3361810507feSWaiman Long #define for_each_chain_block(bucket, prev, curr) \ 3362810507feSWaiman Long for ((prev) = -1, (curr) = chain_block_buckets[bucket]; \ 3363810507feSWaiman Long (curr) >= 0; \ 3364810507feSWaiman Long (prev) = (curr), (curr) = chain_block_next(curr)) 3365810507feSWaiman Long 3366810507feSWaiman Long /* 3367810507feSWaiman Long * next block or -1 3368810507feSWaiman Long */ 3369810507feSWaiman Long static inline int chain_block_next(int offset) 3370810507feSWaiman Long { 3371810507feSWaiman Long int next = chain_hlocks[offset]; 3372810507feSWaiman Long 3373810507feSWaiman Long WARN_ON_ONCE(!(next & CHAIN_BLK_FLAG)); 3374810507feSWaiman Long 3375810507feSWaiman Long if (next == CHAIN_BLK_LIST_END) 3376810507feSWaiman Long return -1; 3377810507feSWaiman Long 3378810507feSWaiman Long next &= ~CHAIN_BLK_FLAG; 3379810507feSWaiman Long next <<= 16; 3380810507feSWaiman Long next |= chain_hlocks[offset + 1]; 3381810507feSWaiman Long 3382810507feSWaiman Long return next; 3383810507feSWaiman Long } 3384810507feSWaiman Long 3385810507feSWaiman Long /* 3386810507feSWaiman Long * bucket-0 only 3387810507feSWaiman Long */ 3388810507feSWaiman Long static inline int chain_block_size(int offset) 3389810507feSWaiman Long { 3390810507feSWaiman Long return (chain_hlocks[offset + 2] << 16) | chain_hlocks[offset + 3]; 3391810507feSWaiman Long } 3392810507feSWaiman Long 3393810507feSWaiman Long static inline void init_chain_block(int offset, int next, int bucket, int size) 3394810507feSWaiman Long { 3395810507feSWaiman Long chain_hlocks[offset] = (next >> 16) | CHAIN_BLK_FLAG; 3396810507feSWaiman Long chain_hlocks[offset + 1] = (u16)next; 3397810507feSWaiman Long 3398810507feSWaiman Long if (size && !bucket) { 3399810507feSWaiman Long chain_hlocks[offset + 2] = size >> 16; 3400810507feSWaiman Long chain_hlocks[offset + 3] = (u16)size; 3401810507feSWaiman Long } 3402810507feSWaiman Long } 3403810507feSWaiman Long 3404810507feSWaiman Long static inline void add_chain_block(int offset, int size) 3405810507feSWaiman Long { 3406810507feSWaiman Long int bucket = size_to_bucket(size); 3407810507feSWaiman Long int next = chain_block_buckets[bucket]; 3408810507feSWaiman Long int prev, curr; 3409810507feSWaiman Long 3410810507feSWaiman Long if (unlikely(size < 2)) { 3411810507feSWaiman Long /* 3412810507feSWaiman Long * We can't store single entries on the freelist. Leak them. 3413810507feSWaiman Long * 3414810507feSWaiman Long * One possible way out would be to uniquely mark them, other 3415810507feSWaiman Long * than with CHAIN_BLK_FLAG, such that we can recover them when 3416810507feSWaiman Long * the block before it is re-added. 3417810507feSWaiman Long */ 3418810507feSWaiman Long if (size) 3419810507feSWaiman Long nr_lost_chain_hlocks++; 3420810507feSWaiman Long return; 3421810507feSWaiman Long } 3422810507feSWaiman Long 3423810507feSWaiman Long nr_free_chain_hlocks += size; 3424810507feSWaiman Long if (!bucket) { 3425810507feSWaiman Long nr_large_chain_blocks++; 3426810507feSWaiman Long 3427810507feSWaiman Long /* 3428810507feSWaiman Long * Variable sized, sort large to small. 3429810507feSWaiman Long */ 3430810507feSWaiman Long for_each_chain_block(0, prev, curr) { 3431810507feSWaiman Long if (size >= chain_block_size(curr)) 3432810507feSWaiman Long break; 3433810507feSWaiman Long } 3434810507feSWaiman Long init_chain_block(offset, curr, 0, size); 3435810507feSWaiman Long if (prev < 0) 3436810507feSWaiman Long chain_block_buckets[0] = offset; 3437810507feSWaiman Long else 3438810507feSWaiman Long init_chain_block(prev, offset, 0, 0); 3439810507feSWaiman Long return; 3440810507feSWaiman Long } 3441810507feSWaiman Long /* 3442810507feSWaiman Long * Fixed size, add to head. 3443810507feSWaiman Long */ 3444810507feSWaiman Long init_chain_block(offset, next, bucket, size); 3445810507feSWaiman Long chain_block_buckets[bucket] = offset; 3446810507feSWaiman Long } 3447810507feSWaiman Long 3448810507feSWaiman Long /* 3449810507feSWaiman Long * Only the first block in the list can be deleted. 3450810507feSWaiman Long * 3451810507feSWaiman Long * For the variable size bucket[0], the first block (the largest one) is 3452810507feSWaiman Long * returned, broken up and put back into the pool. So if a chain block of 3453810507feSWaiman Long * length > MAX_CHAIN_BUCKETS is ever used and zapped, it will just be 3454810507feSWaiman Long * queued up after the primordial chain block and never be used until the 3455810507feSWaiman Long * hlock entries in the primordial chain block is almost used up. That 3456810507feSWaiman Long * causes fragmentation and reduce allocation efficiency. That can be 3457810507feSWaiman Long * monitored by looking at the "large chain blocks" number in lockdep_stats. 3458810507feSWaiman Long */ 3459810507feSWaiman Long static inline void del_chain_block(int bucket, int size, int next) 3460810507feSWaiman Long { 3461810507feSWaiman Long nr_free_chain_hlocks -= size; 3462810507feSWaiman Long chain_block_buckets[bucket] = next; 3463810507feSWaiman Long 3464810507feSWaiman Long if (!bucket) 3465810507feSWaiman Long nr_large_chain_blocks--; 3466810507feSWaiman Long } 3467810507feSWaiman Long 3468810507feSWaiman Long static void init_chain_block_buckets(void) 3469810507feSWaiman Long { 3470810507feSWaiman Long int i; 3471810507feSWaiman Long 3472810507feSWaiman Long for (i = 0; i < MAX_CHAIN_BUCKETS; i++) 3473810507feSWaiman Long chain_block_buckets[i] = -1; 3474810507feSWaiman Long 3475810507feSWaiman Long add_chain_block(0, ARRAY_SIZE(chain_hlocks)); 3476810507feSWaiman Long } 3477810507feSWaiman Long 3478810507feSWaiman Long /* 3479810507feSWaiman Long * Return offset of a chain block of the right size or -1 if not found. 3480810507feSWaiman Long * 3481810507feSWaiman Long * Fairly simple worst-fit allocator with the addition of a number of size 3482810507feSWaiman Long * specific free lists. 3483810507feSWaiman Long */ 3484810507feSWaiman Long static int alloc_chain_hlocks(int req) 3485810507feSWaiman Long { 3486810507feSWaiman Long int bucket, curr, size; 3487810507feSWaiman Long 3488810507feSWaiman Long /* 3489810507feSWaiman Long * We rely on the MSB to act as an escape bit to denote freelist 3490810507feSWaiman Long * pointers. Make sure this bit isn't set in 'normal' class_idx usage. 3491810507feSWaiman Long */ 3492810507feSWaiman Long BUILD_BUG_ON((MAX_LOCKDEP_KEYS-1) & CHAIN_BLK_FLAG); 3493810507feSWaiman Long 3494810507feSWaiman Long init_data_structures_once(); 3495810507feSWaiman Long 3496810507feSWaiman Long if (nr_free_chain_hlocks < req) 3497810507feSWaiman Long return -1; 3498810507feSWaiman Long 3499810507feSWaiman Long /* 3500810507feSWaiman Long * We require a minimum of 2 (u16) entries to encode a freelist 3501810507feSWaiman Long * 'pointer'. 3502810507feSWaiman Long */ 3503810507feSWaiman Long req = max(req, 2); 3504810507feSWaiman Long bucket = size_to_bucket(req); 3505810507feSWaiman Long curr = chain_block_buckets[bucket]; 3506810507feSWaiman Long 3507810507feSWaiman Long if (bucket) { 3508810507feSWaiman Long if (curr >= 0) { 3509810507feSWaiman Long del_chain_block(bucket, req, chain_block_next(curr)); 3510810507feSWaiman Long return curr; 3511810507feSWaiman Long } 3512810507feSWaiman Long /* Try bucket 0 */ 3513810507feSWaiman Long curr = chain_block_buckets[0]; 3514810507feSWaiman Long } 3515810507feSWaiman Long 3516810507feSWaiman Long /* 3517810507feSWaiman Long * The variable sized freelist is sorted by size; the first entry is 3518810507feSWaiman Long * the largest. Use it if it fits. 3519810507feSWaiman Long */ 3520810507feSWaiman Long if (curr >= 0) { 3521810507feSWaiman Long size = chain_block_size(curr); 3522810507feSWaiman Long if (likely(size >= req)) { 3523810507feSWaiman Long del_chain_block(0, size, chain_block_next(curr)); 3524bca4104bSPeter Zijlstra if (size > req) 3525810507feSWaiman Long add_chain_block(curr + req, size - req); 3526810507feSWaiman Long return curr; 3527810507feSWaiman Long } 3528810507feSWaiman Long } 3529810507feSWaiman Long 3530810507feSWaiman Long /* 3531810507feSWaiman Long * Last resort, split a block in a larger sized bucket. 3532810507feSWaiman Long */ 3533810507feSWaiman Long for (size = MAX_CHAIN_BUCKETS; size > req; size--) { 3534810507feSWaiman Long bucket = size_to_bucket(size); 3535810507feSWaiman Long curr = chain_block_buckets[bucket]; 3536810507feSWaiman Long if (curr < 0) 3537810507feSWaiman Long continue; 3538810507feSWaiman Long 3539810507feSWaiman Long del_chain_block(bucket, size, chain_block_next(curr)); 3540810507feSWaiman Long add_chain_block(curr + req, size - req); 3541810507feSWaiman Long return curr; 3542810507feSWaiman Long } 3543810507feSWaiman Long 3544810507feSWaiman Long return -1; 3545810507feSWaiman Long } 3546810507feSWaiman Long 3547810507feSWaiman Long static inline void free_chain_hlocks(int base, int size) 3548810507feSWaiman Long { 3549810507feSWaiman Long add_chain_block(base, max(size, 2)); 3550810507feSWaiman Long } 35518eddac3fSPeter Zijlstra 35528eddac3fSPeter Zijlstra struct lock_class *lock_chain_get_class(struct lock_chain *chain, int i) 35538eddac3fSPeter Zijlstra { 3554f611e8cfSBoqun Feng u16 chain_hlock = chain_hlocks[chain->base + i]; 3555f611e8cfSBoqun Feng unsigned int class_idx = chain_hlock_class_idx(chain_hlock); 3556f611e8cfSBoqun Feng 355728df029dSCheng Jui Wang return lock_classes + class_idx; 35588eddac3fSPeter Zijlstra } 35598eddac3fSPeter Zijlstra 35608eddac3fSPeter Zijlstra /* 35619e4e7554SIngo Molnar * Returns the index of the first held_lock of the current chain 35629e4e7554SIngo Molnar */ 35639e4e7554SIngo Molnar static inline int get_first_held_lock(struct task_struct *curr, 35649e4e7554SIngo Molnar struct held_lock *hlock) 35659e4e7554SIngo Molnar { 35669e4e7554SIngo Molnar int i; 35679e4e7554SIngo Molnar struct held_lock *hlock_curr; 35689e4e7554SIngo Molnar 35699e4e7554SIngo Molnar for (i = curr->lockdep_depth - 1; i >= 0; i--) { 35709e4e7554SIngo Molnar hlock_curr = curr->held_locks + i; 35719e4e7554SIngo Molnar if (hlock_curr->irq_context != hlock->irq_context) 35729e4e7554SIngo Molnar break; 35739e4e7554SIngo Molnar 35749e4e7554SIngo Molnar } 35759e4e7554SIngo Molnar 35769e4e7554SIngo Molnar return ++i; 35779e4e7554SIngo Molnar } 35789e4e7554SIngo Molnar 35795c8a010cSBorislav Petkov #ifdef CONFIG_DEBUG_LOCKDEP 35809e4e7554SIngo Molnar /* 358139e2e173SAlfredo Alvarez Fernandez * Returns the next chain_key iteration 358239e2e173SAlfredo Alvarez Fernandez */ 3583f611e8cfSBoqun Feng static u64 print_chain_key_iteration(u16 hlock_id, u64 chain_key) 358439e2e173SAlfredo Alvarez Fernandez { 3585f611e8cfSBoqun Feng u64 new_chain_key = iterate_chain_key(chain_key, hlock_id); 358639e2e173SAlfredo Alvarez Fernandez 3587f611e8cfSBoqun Feng printk(" hlock_id:%d -> chain_key:%016Lx", 3588f611e8cfSBoqun Feng (unsigned int)hlock_id, 358939e2e173SAlfredo Alvarez Fernandez (unsigned long long)new_chain_key); 359039e2e173SAlfredo Alvarez Fernandez return new_chain_key; 359139e2e173SAlfredo Alvarez Fernandez } 359239e2e173SAlfredo Alvarez Fernandez 359339e2e173SAlfredo Alvarez Fernandez static void 359439e2e173SAlfredo Alvarez Fernandez print_chain_keys_held_locks(struct task_struct *curr, struct held_lock *hlock_next) 359539e2e173SAlfredo Alvarez Fernandez { 359639e2e173SAlfredo Alvarez Fernandez struct held_lock *hlock; 3597f6ec8829SYuyang Du u64 chain_key = INITIAL_CHAIN_KEY; 359839e2e173SAlfredo Alvarez Fernandez int depth = curr->lockdep_depth; 3599834494b2SYuyang Du int i = get_first_held_lock(curr, hlock_next); 360039e2e173SAlfredo Alvarez Fernandez 3601834494b2SYuyang Du printk("depth: %u (irq_context %u)\n", depth - i + 1, 3602834494b2SYuyang Du hlock_next->irq_context); 3603834494b2SYuyang Du for (; i < depth; i++) { 360439e2e173SAlfredo Alvarez Fernandez hlock = curr->held_locks + i; 3605f611e8cfSBoqun Feng chain_key = print_chain_key_iteration(hlock_id(hlock), chain_key); 360639e2e173SAlfredo Alvarez Fernandez 360739e2e173SAlfredo Alvarez Fernandez print_lock(hlock); 360839e2e173SAlfredo Alvarez Fernandez } 360939e2e173SAlfredo Alvarez Fernandez 3610f611e8cfSBoqun Feng print_chain_key_iteration(hlock_id(hlock_next), chain_key); 361139e2e173SAlfredo Alvarez Fernandez print_lock(hlock_next); 361239e2e173SAlfredo Alvarez Fernandez } 361339e2e173SAlfredo Alvarez Fernandez 361439e2e173SAlfredo Alvarez Fernandez static void print_chain_keys_chain(struct lock_chain *chain) 361539e2e173SAlfredo Alvarez Fernandez { 361639e2e173SAlfredo Alvarez Fernandez int i; 3617f6ec8829SYuyang Du u64 chain_key = INITIAL_CHAIN_KEY; 3618f611e8cfSBoqun Feng u16 hlock_id; 361939e2e173SAlfredo Alvarez Fernandez 362039e2e173SAlfredo Alvarez Fernandez printk("depth: %u\n", chain->depth); 362139e2e173SAlfredo Alvarez Fernandez for (i = 0; i < chain->depth; i++) { 3622f611e8cfSBoqun Feng hlock_id = chain_hlocks[chain->base + i]; 3623f611e8cfSBoqun Feng chain_key = print_chain_key_iteration(hlock_id, chain_key); 362439e2e173SAlfredo Alvarez Fernandez 3625eb1cfd09SKent Overstreet print_lock_name(NULL, lock_classes + chain_hlock_class_idx(hlock_id)); 362639e2e173SAlfredo Alvarez Fernandez printk("\n"); 362739e2e173SAlfredo Alvarez Fernandez } 362839e2e173SAlfredo Alvarez Fernandez } 362939e2e173SAlfredo Alvarez Fernandez 363039e2e173SAlfredo Alvarez Fernandez static void print_collision(struct task_struct *curr, 363139e2e173SAlfredo Alvarez Fernandez struct held_lock *hlock_next, 363239e2e173SAlfredo Alvarez Fernandez struct lock_chain *chain) 363339e2e173SAlfredo Alvarez Fernandez { 3634*59cd94efSJohn Ogness nbcon_cpu_emergency_enter(); 3635*59cd94efSJohn Ogness 3636681fbec8SPaul E. McKenney pr_warn("\n"); 3637a5dd63efSPaul E. McKenney pr_warn("============================\n"); 3638a5dd63efSPaul E. McKenney pr_warn("WARNING: chain_key collision\n"); 363939e2e173SAlfredo Alvarez Fernandez print_kernel_ident(); 3640a5dd63efSPaul E. McKenney pr_warn("----------------------------\n"); 3641681fbec8SPaul E. McKenney pr_warn("%s/%d: ", current->comm, task_pid_nr(current)); 3642681fbec8SPaul E. McKenney pr_warn("Hash chain already cached but the contents don't match!\n"); 364339e2e173SAlfredo Alvarez Fernandez 3644681fbec8SPaul E. McKenney pr_warn("Held locks:"); 364539e2e173SAlfredo Alvarez Fernandez print_chain_keys_held_locks(curr, hlock_next); 364639e2e173SAlfredo Alvarez Fernandez 3647681fbec8SPaul E. McKenney pr_warn("Locks in cached chain:"); 364839e2e173SAlfredo Alvarez Fernandez print_chain_keys_chain(chain); 364939e2e173SAlfredo Alvarez Fernandez 3650681fbec8SPaul E. McKenney pr_warn("\nstack backtrace:\n"); 365139e2e173SAlfredo Alvarez Fernandez dump_stack(); 3652*59cd94efSJohn Ogness 3653*59cd94efSJohn Ogness nbcon_cpu_emergency_exit(); 365439e2e173SAlfredo Alvarez Fernandez } 36555c8a010cSBorislav Petkov #endif 365639e2e173SAlfredo Alvarez Fernandez 365739e2e173SAlfredo Alvarez Fernandez /* 36589e4e7554SIngo Molnar * Checks whether the chain and the current held locks are consistent 36599e4e7554SIngo Molnar * in depth and also in content. If they are not it most likely means 36609e4e7554SIngo Molnar * that there was a collision during the calculation of the chain_key. 36619e4e7554SIngo Molnar * Returns: 0 not passed, 1 passed 36629e4e7554SIngo Molnar */ 36639e4e7554SIngo Molnar static int check_no_collision(struct task_struct *curr, 36649e4e7554SIngo Molnar struct held_lock *hlock, 36659e4e7554SIngo Molnar struct lock_chain *chain) 36669e4e7554SIngo Molnar { 36679e4e7554SIngo Molnar #ifdef CONFIG_DEBUG_LOCKDEP 36689e4e7554SIngo Molnar int i, j, id; 36699e4e7554SIngo Molnar 36709e4e7554SIngo Molnar i = get_first_held_lock(curr, hlock); 36719e4e7554SIngo Molnar 367239e2e173SAlfredo Alvarez Fernandez if (DEBUG_LOCKS_WARN_ON(chain->depth != curr->lockdep_depth - (i - 1))) { 367339e2e173SAlfredo Alvarez Fernandez print_collision(curr, hlock, chain); 36749e4e7554SIngo Molnar return 0; 367539e2e173SAlfredo Alvarez Fernandez } 36769e4e7554SIngo Molnar 36779e4e7554SIngo Molnar for (j = 0; j < chain->depth - 1; j++, i++) { 3678f611e8cfSBoqun Feng id = hlock_id(&curr->held_locks[i]); 36799e4e7554SIngo Molnar 368039e2e173SAlfredo Alvarez Fernandez if (DEBUG_LOCKS_WARN_ON(chain_hlocks[chain->base + j] != id)) { 368139e2e173SAlfredo Alvarez Fernandez print_collision(curr, hlock, chain); 36829e4e7554SIngo Molnar return 0; 36839e4e7554SIngo Molnar } 368439e2e173SAlfredo Alvarez Fernandez } 36859e4e7554SIngo Molnar #endif 36869e4e7554SIngo Molnar return 1; 36879e4e7554SIngo Molnar } 36889e4e7554SIngo Molnar 36899e4e7554SIngo Molnar /* 36902212684aSBart Van Assche * Given an index that is >= -1, return the index of the next lock chain. 36912212684aSBart Van Assche * Return -2 if there is no next lock chain. 36922212684aSBart Van Assche */ 36932212684aSBart Van Assche long lockdep_next_lockchain(long i) 36942212684aSBart Van Assche { 3695de4643a7SBart Van Assche i = find_next_bit(lock_chains_in_use, ARRAY_SIZE(lock_chains), i + 1); 3696de4643a7SBart Van Assche return i < ARRAY_SIZE(lock_chains) ? i : -2; 36972212684aSBart Van Assche } 36982212684aSBart Van Assche 36992212684aSBart Van Assche unsigned long lock_chain_count(void) 37002212684aSBart Van Assche { 3701de4643a7SBart Van Assche return bitmap_weight(lock_chains_in_use, ARRAY_SIZE(lock_chains)); 3702de4643a7SBart Van Assche } 3703de4643a7SBart Van Assche 3704de4643a7SBart Van Assche /* Must be called with the graph lock held. */ 3705de4643a7SBart Van Assche static struct lock_chain *alloc_lock_chain(void) 3706de4643a7SBart Van Assche { 3707de4643a7SBart Van Assche int idx = find_first_zero_bit(lock_chains_in_use, 3708de4643a7SBart Van Assche ARRAY_SIZE(lock_chains)); 3709de4643a7SBart Van Assche 3710de4643a7SBart Van Assche if (unlikely(idx >= ARRAY_SIZE(lock_chains))) 3711de4643a7SBart Van Assche return NULL; 3712de4643a7SBart Van Assche __set_bit(idx, lock_chains_in_use); 3713de4643a7SBart Van Assche return lock_chains + idx; 37142212684aSBart Van Assche } 37152212684aSBart Van Assche 37162212684aSBart Van Assche /* 3717545c23f2SByungchul Park * Adds a dependency chain into chain hashtable. And must be called with 3718545c23f2SByungchul Park * graph_lock held. 3719545c23f2SByungchul Park * 3720545c23f2SByungchul Park * Return 0 if fail, and graph_lock is released. 3721545c23f2SByungchul Park * Return 1 if succeed, with graph_lock held. 37228eddac3fSPeter Zijlstra */ 3723545c23f2SByungchul Park static inline int add_chain_cache(struct task_struct *curr, 37248eddac3fSPeter Zijlstra struct held_lock *hlock, 37258eddac3fSPeter Zijlstra u64 chain_key) 37268eddac3fSPeter Zijlstra { 3727a63f38ccSAndrew Morton struct hlist_head *hash_head = chainhashentry(chain_key); 37288eddac3fSPeter Zijlstra struct lock_chain *chain; 37298eddac3fSPeter Zijlstra int i, j; 37308eddac3fSPeter Zijlstra 37318eddac3fSPeter Zijlstra /* 3732527af3eaSBart Van Assche * The caller must hold the graph lock, ensure we've got IRQs 37338eddac3fSPeter Zijlstra * disabled to make this an IRQ-safe lock.. for recursion reasons 37348eddac3fSPeter Zijlstra * lockdep won't complain about its own locking errors. 37358eddac3fSPeter Zijlstra */ 3736248efb21SPeter Zijlstra if (lockdep_assert_locked()) 37378eddac3fSPeter Zijlstra return 0; 37389e4e7554SIngo Molnar 3739de4643a7SBart Van Assche chain = alloc_lock_chain(); 3740de4643a7SBart Van Assche if (!chain) { 37418eddac3fSPeter Zijlstra if (!debug_locks_off_graph_unlock()) 37428eddac3fSPeter Zijlstra return 0; 37438eddac3fSPeter Zijlstra 3744*59cd94efSJohn Ogness nbcon_cpu_emergency_enter(); 37458eddac3fSPeter Zijlstra print_lockdep_off("BUG: MAX_LOCKDEP_CHAINS too low!"); 37468eddac3fSPeter Zijlstra dump_stack(); 3747*59cd94efSJohn Ogness nbcon_cpu_emergency_exit(); 37488eddac3fSPeter Zijlstra return 0; 37498eddac3fSPeter Zijlstra } 37508eddac3fSPeter Zijlstra chain->chain_key = chain_key; 37518eddac3fSPeter Zijlstra chain->irq_context = hlock->irq_context; 37529e4e7554SIngo Molnar i = get_first_held_lock(curr, hlock); 37538eddac3fSPeter Zijlstra chain->depth = curr->lockdep_depth + 1 - i; 375475dd602aSPeter Zijlstra 375575dd602aSPeter Zijlstra BUILD_BUG_ON((1UL << 24) <= ARRAY_SIZE(chain_hlocks)); 375675dd602aSPeter Zijlstra BUILD_BUG_ON((1UL << 6) <= ARRAY_SIZE(curr->held_locks)); 375775dd602aSPeter Zijlstra BUILD_BUG_ON((1UL << 8*sizeof(chain_hlocks[0])) <= ARRAY_SIZE(lock_classes)); 375875dd602aSPeter Zijlstra 3759810507feSWaiman Long j = alloc_chain_hlocks(chain->depth); 3760810507feSWaiman Long if (j < 0) { 3761f9af456aSByungchul Park if (!debug_locks_off_graph_unlock()) 376275dd602aSPeter Zijlstra return 0; 376375dd602aSPeter Zijlstra 3764*59cd94efSJohn Ogness nbcon_cpu_emergency_enter(); 376575dd602aSPeter Zijlstra print_lockdep_off("BUG: MAX_LOCKDEP_CHAIN_HLOCKS too low!"); 376675dd602aSPeter Zijlstra dump_stack(); 3767*59cd94efSJohn Ogness nbcon_cpu_emergency_exit(); 376875dd602aSPeter Zijlstra return 0; 376975dd602aSPeter Zijlstra } 377075dd602aSPeter Zijlstra 3771810507feSWaiman Long chain->base = j; 3772810507feSWaiman Long for (j = 0; j < chain->depth - 1; j++, i++) { 3773f611e8cfSBoqun Feng int lock_id = hlock_id(curr->held_locks + i); 3774810507feSWaiman Long 3775810507feSWaiman Long chain_hlocks[chain->base + j] = lock_id; 3776810507feSWaiman Long } 3777f611e8cfSBoqun Feng chain_hlocks[chain->base + j] = hlock_id(hlock); 3778a63f38ccSAndrew Morton hlist_add_head_rcu(&chain->entry, hash_head); 37798eddac3fSPeter Zijlstra debug_atomic_inc(chain_lookup_misses); 3780b3b9c187SWaiman Long inc_chains(chain->irq_context); 37818eddac3fSPeter Zijlstra 37828eddac3fSPeter Zijlstra return 1; 37838eddac3fSPeter Zijlstra } 37848eddac3fSPeter Zijlstra 3785545c23f2SByungchul Park /* 3786a0b0fd53SBart Van Assche * Look up a dependency chain. Must be called with either the graph lock or 3787a0b0fd53SBart Van Assche * the RCU read lock held. 3788545c23f2SByungchul Park */ 3789545c23f2SByungchul Park static inline struct lock_chain *lookup_chain_cache(u64 chain_key) 3790545c23f2SByungchul Park { 3791545c23f2SByungchul Park struct hlist_head *hash_head = chainhashentry(chain_key); 3792545c23f2SByungchul Park struct lock_chain *chain; 3793545c23f2SByungchul Park 3794545c23f2SByungchul Park hlist_for_each_entry_rcu(chain, hash_head, entry) { 3795a0b0fd53SBart Van Assche if (READ_ONCE(chain->chain_key) == chain_key) { 3796545c23f2SByungchul Park debug_atomic_inc(chain_lookup_hits); 3797545c23f2SByungchul Park return chain; 3798545c23f2SByungchul Park } 3799545c23f2SByungchul Park } 3800545c23f2SByungchul Park return NULL; 3801545c23f2SByungchul Park } 3802545c23f2SByungchul Park 3803545c23f2SByungchul Park /* 3804545c23f2SByungchul Park * If the key is not present yet in dependency chain cache then 3805545c23f2SByungchul Park * add it and return 1 - in this case the new dependency chain is 3806545c23f2SByungchul Park * validated. If the key is already hashed, return 0. 3807545c23f2SByungchul Park * (On return with 1 graph_lock is held.) 3808545c23f2SByungchul Park */ 3809545c23f2SByungchul Park static inline int lookup_chain_cache_add(struct task_struct *curr, 3810545c23f2SByungchul Park struct held_lock *hlock, 3811545c23f2SByungchul Park u64 chain_key) 3812545c23f2SByungchul Park { 3813545c23f2SByungchul Park struct lock_class *class = hlock_class(hlock); 3814545c23f2SByungchul Park struct lock_chain *chain = lookup_chain_cache(chain_key); 3815545c23f2SByungchul Park 3816545c23f2SByungchul Park if (chain) { 3817545c23f2SByungchul Park cache_hit: 3818545c23f2SByungchul Park if (!check_no_collision(curr, hlock, chain)) 3819545c23f2SByungchul Park return 0; 3820545c23f2SByungchul Park 3821545c23f2SByungchul Park if (very_verbose(class)) { 3822545c23f2SByungchul Park printk("\nhash chain already cached, key: " 382304860d48SBorislav Petkov "%016Lx tail class: [%px] %s\n", 3824545c23f2SByungchul Park (unsigned long long)chain_key, 3825545c23f2SByungchul Park class->key, class->name); 3826545c23f2SByungchul Park } 3827545c23f2SByungchul Park 3828545c23f2SByungchul Park return 0; 3829545c23f2SByungchul Park } 3830545c23f2SByungchul Park 3831545c23f2SByungchul Park if (very_verbose(class)) { 383204860d48SBorislav Petkov printk("\nnew hash chain, key: %016Lx tail class: [%px] %s\n", 3833545c23f2SByungchul Park (unsigned long long)chain_key, class->key, class->name); 3834545c23f2SByungchul Park } 3835545c23f2SByungchul Park 3836545c23f2SByungchul Park if (!graph_lock()) 3837545c23f2SByungchul Park return 0; 3838545c23f2SByungchul Park 3839545c23f2SByungchul Park /* 3840545c23f2SByungchul Park * We have to walk the chain again locked - to avoid duplicates: 3841545c23f2SByungchul Park */ 3842545c23f2SByungchul Park chain = lookup_chain_cache(chain_key); 3843545c23f2SByungchul Park if (chain) { 3844545c23f2SByungchul Park graph_unlock(); 3845545c23f2SByungchul Park goto cache_hit; 3846545c23f2SByungchul Park } 3847545c23f2SByungchul Park 3848545c23f2SByungchul Park if (!add_chain_cache(curr, hlock, chain_key)) 3849545c23f2SByungchul Park return 0; 3850545c23f2SByungchul Park 3851545c23f2SByungchul Park return 1; 3852545c23f2SByungchul Park } 3853545c23f2SByungchul Park 38540b9fc8ecSYuyang Du static int validate_chain(struct task_struct *curr, 38550b9fc8ecSYuyang Du struct held_lock *hlock, 38560b9fc8ecSYuyang Du int chain_head, u64 chain_key) 38578eddac3fSPeter Zijlstra { 38588eddac3fSPeter Zijlstra /* 38598eddac3fSPeter Zijlstra * Trylock needs to maintain the stack of held locks, but it 38608eddac3fSPeter Zijlstra * does not add new dependencies, because trylock can be done 38618eddac3fSPeter Zijlstra * in any order. 38628eddac3fSPeter Zijlstra * 38638eddac3fSPeter Zijlstra * We look up the chain_key and do the O(N^2) check and update of 38648eddac3fSPeter Zijlstra * the dependencies only if this is a new dependency chain. 3865545c23f2SByungchul Park * (If lookup_chain_cache_add() return with 1 it acquires 38668eddac3fSPeter Zijlstra * graph_lock for us) 38678eddac3fSPeter Zijlstra */ 3868fb9edbe9SOleg Nesterov if (!hlock->trylock && hlock->check && 3869545c23f2SByungchul Park lookup_chain_cache_add(curr, hlock, chain_key)) { 38708eddac3fSPeter Zijlstra /* 38718eddac3fSPeter Zijlstra * Check whether last held lock: 38728eddac3fSPeter Zijlstra * 38738eddac3fSPeter Zijlstra * - is irq-safe, if this lock is irq-unsafe 38748eddac3fSPeter Zijlstra * - is softirq-safe, if this lock is hardirq-unsafe 38758eddac3fSPeter Zijlstra * 38768eddac3fSPeter Zijlstra * And check whether the new lock's dependency graph 387731a490e5SYuyang Du * could lead back to the previous lock: 38788eddac3fSPeter Zijlstra * 387931a490e5SYuyang Du * - within the current held-lock stack 388031a490e5SYuyang Du * - across our accumulated lock dependency records 388131a490e5SYuyang Du * 388231a490e5SYuyang Du * any of these scenarios could lead to a deadlock. 388331a490e5SYuyang Du */ 388431a490e5SYuyang Du /* 388531a490e5SYuyang Du * The simple case: does the current hold the same lock 388631a490e5SYuyang Du * already? 38878eddac3fSPeter Zijlstra */ 38884609c4f9SYuyang Du int ret = check_deadlock(curr, hlock); 38898eddac3fSPeter Zijlstra 38908eddac3fSPeter Zijlstra if (!ret) 38918eddac3fSPeter Zijlstra return 0; 38928eddac3fSPeter Zijlstra /* 38938eddac3fSPeter Zijlstra * Add dependency only if this lock is not the head 3894d61fc96aSBoqun Feng * of the chain, and if the new lock introduces no more 3895d61fc96aSBoqun Feng * lock dependency (because we already hold a lock with the 3896d61fc96aSBoqun Feng * same lock class) nor deadlock (because the nest_lock 3897d61fc96aSBoqun Feng * serializes nesting locks), see the comments for 3898d61fc96aSBoqun Feng * check_deadlock(). 38998eddac3fSPeter Zijlstra */ 3900545c23f2SByungchul Park if (!chain_head && ret != 2) { 39018eddac3fSPeter Zijlstra if (!check_prevs_add(curr, hlock)) 39028eddac3fSPeter Zijlstra return 0; 3903545c23f2SByungchul Park } 3904545c23f2SByungchul Park 39058eddac3fSPeter Zijlstra graph_unlock(); 3906545c23f2SByungchul Park } else { 3907545c23f2SByungchul Park /* after lookup_chain_cache_add(): */ 39088eddac3fSPeter Zijlstra if (unlikely(!debug_locks)) 39098eddac3fSPeter Zijlstra return 0; 3910545c23f2SByungchul Park } 39118eddac3fSPeter Zijlstra 39128eddac3fSPeter Zijlstra return 1; 39138eddac3fSPeter Zijlstra } 39148eddac3fSPeter Zijlstra #else 39158eddac3fSPeter Zijlstra static inline int validate_chain(struct task_struct *curr, 39160b9fc8ecSYuyang Du struct held_lock *hlock, 39178eddac3fSPeter Zijlstra int chain_head, u64 chain_key) 39188eddac3fSPeter Zijlstra { 39198eddac3fSPeter Zijlstra return 1; 39208eddac3fSPeter Zijlstra } 3921810507feSWaiman Long 3922810507feSWaiman Long static void init_chain_block_buckets(void) { } 3923e7a38f63SYuyang Du #endif /* CONFIG_PROVE_LOCKING */ 39248eddac3fSPeter Zijlstra 39258eddac3fSPeter Zijlstra /* 39268eddac3fSPeter Zijlstra * We are building curr_chain_key incrementally, so double-check 39278eddac3fSPeter Zijlstra * it from scratch, to make sure that it's done correctly: 39288eddac3fSPeter Zijlstra */ 39298eddac3fSPeter Zijlstra static void check_chain_key(struct task_struct *curr) 39308eddac3fSPeter Zijlstra { 39318eddac3fSPeter Zijlstra #ifdef CONFIG_DEBUG_LOCKDEP 39328eddac3fSPeter Zijlstra struct held_lock *hlock, *prev_hlock = NULL; 39335f18ab5cSAlfredo Alvarez Fernandez unsigned int i; 3934f6ec8829SYuyang Du u64 chain_key = INITIAL_CHAIN_KEY; 39358eddac3fSPeter Zijlstra 39368eddac3fSPeter Zijlstra for (i = 0; i < curr->lockdep_depth; i++) { 39378eddac3fSPeter Zijlstra hlock = curr->held_locks + i; 39388eddac3fSPeter Zijlstra if (chain_key != hlock->prev_chain_key) { 39398eddac3fSPeter Zijlstra debug_locks_off(); 39408eddac3fSPeter Zijlstra /* 39418eddac3fSPeter Zijlstra * We got mighty confused, our chain keys don't match 39428eddac3fSPeter Zijlstra * with what we expect, someone trample on our task state? 39438eddac3fSPeter Zijlstra */ 39448eddac3fSPeter Zijlstra WARN(1, "hm#1, depth: %u [%u], %016Lx != %016Lx\n", 39458eddac3fSPeter Zijlstra curr->lockdep_depth, i, 39468eddac3fSPeter Zijlstra (unsigned long long)chain_key, 39478eddac3fSPeter Zijlstra (unsigned long long)hlock->prev_chain_key); 39488eddac3fSPeter Zijlstra return; 39498eddac3fSPeter Zijlstra } 395001bb6f0aSYuyang Du 39518eddac3fSPeter Zijlstra /* 395201bb6f0aSYuyang Du * hlock->class_idx can't go beyond MAX_LOCKDEP_KEYS, but is 395301bb6f0aSYuyang Du * it registered lock class index? 39548eddac3fSPeter Zijlstra */ 395501bb6f0aSYuyang Du if (DEBUG_LOCKS_WARN_ON(!test_bit(hlock->class_idx, lock_classes_in_use))) 39568eddac3fSPeter Zijlstra return; 39578eddac3fSPeter Zijlstra 39588eddac3fSPeter Zijlstra if (prev_hlock && (prev_hlock->irq_context != 39598eddac3fSPeter Zijlstra hlock->irq_context)) 3960f6ec8829SYuyang Du chain_key = INITIAL_CHAIN_KEY; 3961f611e8cfSBoqun Feng chain_key = iterate_chain_key(chain_key, hlock_id(hlock)); 39628eddac3fSPeter Zijlstra prev_hlock = hlock; 39638eddac3fSPeter Zijlstra } 39648eddac3fSPeter Zijlstra if (chain_key != curr->curr_chain_key) { 39658eddac3fSPeter Zijlstra debug_locks_off(); 39668eddac3fSPeter Zijlstra /* 39678eddac3fSPeter Zijlstra * More smoking hash instead of calculating it, damn see these 39688eddac3fSPeter Zijlstra * numbers float.. I bet that a pink elephant stepped on my memory. 39698eddac3fSPeter Zijlstra */ 39708eddac3fSPeter Zijlstra WARN(1, "hm#2, depth: %u [%u], %016Lx != %016Lx\n", 39718eddac3fSPeter Zijlstra curr->lockdep_depth, i, 39728eddac3fSPeter Zijlstra (unsigned long long)chain_key, 39738eddac3fSPeter Zijlstra (unsigned long long)curr->curr_chain_key); 39748eddac3fSPeter Zijlstra } 39758eddac3fSPeter Zijlstra #endif 39768eddac3fSPeter Zijlstra } 39778eddac3fSPeter Zijlstra 397830a35f79SArnd Bergmann #ifdef CONFIG_PROVE_LOCKING 39790d2cc3b3SFrederic Weisbecker static int mark_lock(struct task_struct *curr, struct held_lock *this, 39800d2cc3b3SFrederic Weisbecker enum lock_usage_bit new_bit); 39810d2cc3b3SFrederic Weisbecker 3982f7c1c6b3SYuyang Du static void print_usage_bug_scenario(struct held_lock *lock) 39838eddac3fSPeter Zijlstra { 39848eddac3fSPeter Zijlstra struct lock_class *class = hlock_class(lock); 39858eddac3fSPeter Zijlstra 39868eddac3fSPeter Zijlstra printk(" Possible unsafe locking scenario:\n\n"); 39878eddac3fSPeter Zijlstra printk(" CPU0\n"); 39888eddac3fSPeter Zijlstra printk(" ----\n"); 39898eddac3fSPeter Zijlstra printk(" lock("); 3990eb1cfd09SKent Overstreet __print_lock_name(lock, class); 3991f943fe0fSDmitry Vyukov printk(KERN_CONT ");\n"); 39928eddac3fSPeter Zijlstra printk(" <Interrupt>\n"); 39938eddac3fSPeter Zijlstra printk(" lock("); 3994eb1cfd09SKent Overstreet __print_lock_name(lock, class); 3995f943fe0fSDmitry Vyukov printk(KERN_CONT ");\n"); 39968eddac3fSPeter Zijlstra printk("\n *** DEADLOCK ***\n\n"); 39978eddac3fSPeter Zijlstra } 39988eddac3fSPeter Zijlstra 3999f7c1c6b3SYuyang Du static void 40008eddac3fSPeter Zijlstra print_usage_bug(struct task_struct *curr, struct held_lock *this, 40018eddac3fSPeter Zijlstra enum lock_usage_bit prev_bit, enum lock_usage_bit new_bit) 40028eddac3fSPeter Zijlstra { 40037f82e631SPeter Zijlstra if (!debug_locks_off() || debug_locks_silent) 4004f7c1c6b3SYuyang Du return; 40058eddac3fSPeter Zijlstra 4006*59cd94efSJohn Ogness nbcon_cpu_emergency_enter(); 4007*59cd94efSJohn Ogness 4008681fbec8SPaul E. McKenney pr_warn("\n"); 4009a5dd63efSPaul E. McKenney pr_warn("================================\n"); 4010a5dd63efSPaul E. McKenney pr_warn("WARNING: inconsistent lock state\n"); 40118eddac3fSPeter Zijlstra print_kernel_ident(); 4012a5dd63efSPaul E. McKenney pr_warn("--------------------------------\n"); 40138eddac3fSPeter Zijlstra 4014681fbec8SPaul E. McKenney pr_warn("inconsistent {%s} -> {%s} usage.\n", 40158eddac3fSPeter Zijlstra usage_str[prev_bit], usage_str[new_bit]); 40168eddac3fSPeter Zijlstra 4017681fbec8SPaul E. McKenney pr_warn("%s/%d [HC%u[%lu]:SC%u[%lu]:HE%u:SE%u] takes:\n", 40188eddac3fSPeter Zijlstra curr->comm, task_pid_nr(curr), 4019f9ad4a5fSPeter Zijlstra lockdep_hardirq_context(), hardirq_count() >> HARDIRQ_SHIFT, 4020ef996916SPeter Zijlstra lockdep_softirq_context(curr), softirq_count() >> SOFTIRQ_SHIFT, 4021f9ad4a5fSPeter Zijlstra lockdep_hardirqs_enabled(), 4022ef996916SPeter Zijlstra lockdep_softirqs_enabled(curr)); 40238eddac3fSPeter Zijlstra print_lock(this); 40248eddac3fSPeter Zijlstra 4025681fbec8SPaul E. McKenney pr_warn("{%s} state was registered at:\n", usage_str[prev_bit]); 402612593b74SBart Van Assche print_lock_trace(hlock_class(this)->usage_traces[prev_bit], 1); 40278eddac3fSPeter Zijlstra 40288eddac3fSPeter Zijlstra print_irqtrace_events(curr); 4029681fbec8SPaul E. McKenney pr_warn("\nother info that might help us debug this:\n"); 40308eddac3fSPeter Zijlstra print_usage_bug_scenario(this); 40318eddac3fSPeter Zijlstra 40328eddac3fSPeter Zijlstra lockdep_print_held_locks(curr); 40338eddac3fSPeter Zijlstra 4034681fbec8SPaul E. McKenney pr_warn("\nstack backtrace:\n"); 40358eddac3fSPeter Zijlstra dump_stack(); 4036*59cd94efSJohn Ogness 4037*59cd94efSJohn Ogness nbcon_cpu_emergency_exit(); 40388eddac3fSPeter Zijlstra } 40398eddac3fSPeter Zijlstra 40408eddac3fSPeter Zijlstra /* 40418eddac3fSPeter Zijlstra * Print out an error if an invalid bit is set: 40428eddac3fSPeter Zijlstra */ 40438eddac3fSPeter Zijlstra static inline int 40448eddac3fSPeter Zijlstra valid_state(struct task_struct *curr, struct held_lock *this, 40458eddac3fSPeter Zijlstra enum lock_usage_bit new_bit, enum lock_usage_bit bad_bit) 40468eddac3fSPeter Zijlstra { 4047f7c1c6b3SYuyang Du if (unlikely(hlock_class(this)->usage_mask & (1 << bad_bit))) { 40487f82e631SPeter Zijlstra graph_unlock(); 4049f7c1c6b3SYuyang Du print_usage_bug(curr, this, bad_bit, new_bit); 4050f7c1c6b3SYuyang Du return 0; 4051f7c1c6b3SYuyang Du } 40528eddac3fSPeter Zijlstra return 1; 40538eddac3fSPeter Zijlstra } 40548eddac3fSPeter Zijlstra 40558eddac3fSPeter Zijlstra 40568eddac3fSPeter Zijlstra /* 40578eddac3fSPeter Zijlstra * print irq inversion bug: 40588eddac3fSPeter Zijlstra */ 4059f7c1c6b3SYuyang Du static void 40608eddac3fSPeter Zijlstra print_irq_inversion_bug(struct task_struct *curr, 40618eddac3fSPeter Zijlstra struct lock_list *root, struct lock_list *other, 40628eddac3fSPeter Zijlstra struct held_lock *this, int forwards, 40638eddac3fSPeter Zijlstra const char *irqclass) 40648eddac3fSPeter Zijlstra { 40658eddac3fSPeter Zijlstra struct lock_list *entry = other; 40668eddac3fSPeter Zijlstra struct lock_list *middle = NULL; 40678eddac3fSPeter Zijlstra int depth; 40688eddac3fSPeter Zijlstra 40698eddac3fSPeter Zijlstra if (!debug_locks_off_graph_unlock() || debug_locks_silent) 4070f7c1c6b3SYuyang Du return; 40718eddac3fSPeter Zijlstra 4072*59cd94efSJohn Ogness nbcon_cpu_emergency_enter(); 4073*59cd94efSJohn Ogness 4074681fbec8SPaul E. McKenney pr_warn("\n"); 4075a5dd63efSPaul E. McKenney pr_warn("========================================================\n"); 4076a5dd63efSPaul E. McKenney pr_warn("WARNING: possible irq lock inversion dependency detected\n"); 40778eddac3fSPeter Zijlstra print_kernel_ident(); 4078a5dd63efSPaul E. McKenney pr_warn("--------------------------------------------------------\n"); 4079681fbec8SPaul E. McKenney pr_warn("%s/%d just changed the state of lock:\n", 40808eddac3fSPeter Zijlstra curr->comm, task_pid_nr(curr)); 40818eddac3fSPeter Zijlstra print_lock(this); 40828eddac3fSPeter Zijlstra if (forwards) 4083681fbec8SPaul E. McKenney pr_warn("but this lock took another, %s-unsafe lock in the past:\n", irqclass); 40848eddac3fSPeter Zijlstra else 4085681fbec8SPaul E. McKenney pr_warn("but this lock was taken by another, %s-safe lock in the past:\n", irqclass); 4086eb1cfd09SKent Overstreet print_lock_name(NULL, other->class); 4087681fbec8SPaul E. McKenney pr_warn("\n\nand interrupts could create inverse lock ordering between them.\n\n"); 40888eddac3fSPeter Zijlstra 4089681fbec8SPaul E. McKenney pr_warn("\nother info that might help us debug this:\n"); 40908eddac3fSPeter Zijlstra 40918eddac3fSPeter Zijlstra /* Find a middle lock (if one exists) */ 40928eddac3fSPeter Zijlstra depth = get_lock_depth(other); 40938eddac3fSPeter Zijlstra do { 40948eddac3fSPeter Zijlstra if (depth == 0 && (entry != root)) { 4095681fbec8SPaul E. McKenney pr_warn("lockdep:%s bad path found in chain graph\n", __func__); 40968eddac3fSPeter Zijlstra break; 40978eddac3fSPeter Zijlstra } 40988eddac3fSPeter Zijlstra middle = entry; 40998eddac3fSPeter Zijlstra entry = get_lock_parent(entry); 41008eddac3fSPeter Zijlstra depth--; 41018eddac3fSPeter Zijlstra } while (entry && entry != root && (depth >= 0)); 41028eddac3fSPeter Zijlstra if (forwards) 41038eddac3fSPeter Zijlstra print_irq_lock_scenario(root, other, 41048eddac3fSPeter Zijlstra middle ? middle->class : root->class, other->class); 41058eddac3fSPeter Zijlstra else 41068eddac3fSPeter Zijlstra print_irq_lock_scenario(other, root, 41078eddac3fSPeter Zijlstra middle ? middle->class : other->class, root->class); 41088eddac3fSPeter Zijlstra 41098eddac3fSPeter Zijlstra lockdep_print_held_locks(curr); 41108eddac3fSPeter Zijlstra 4111681fbec8SPaul E. McKenney pr_warn("\nthe shortest dependencies between 2nd lock and 1st lock:\n"); 411212593b74SBart Van Assche root->trace = save_trace(); 411312593b74SBart Van Assche if (!root->trace) 4114*59cd94efSJohn Ogness goto out; 41158eddac3fSPeter Zijlstra print_shortest_lock_dependencies(other, root); 41168eddac3fSPeter Zijlstra 4117681fbec8SPaul E. McKenney pr_warn("\nstack backtrace:\n"); 41188eddac3fSPeter Zijlstra dump_stack(); 4119*59cd94efSJohn Ogness out: 4120*59cd94efSJohn Ogness nbcon_cpu_emergency_exit(); 41218eddac3fSPeter Zijlstra } 41228eddac3fSPeter Zijlstra 41238eddac3fSPeter Zijlstra /* 41248eddac3fSPeter Zijlstra * Prove that in the forwards-direction subgraph starting at <this> 41258eddac3fSPeter Zijlstra * there is no lock matching <mask>: 41268eddac3fSPeter Zijlstra */ 41278eddac3fSPeter Zijlstra static int 41288eddac3fSPeter Zijlstra check_usage_forwards(struct task_struct *curr, struct held_lock *this, 4129f08e3888SBoqun Feng enum lock_usage_bit bit) 41308eddac3fSPeter Zijlstra { 4131b11be024SBoqun Feng enum bfs_result ret; 41328eddac3fSPeter Zijlstra struct lock_list root; 41333f649ab7SKees Cook struct lock_list *target_entry; 4134f08e3888SBoqun Feng enum lock_usage_bit read_bit = bit + LOCK_USAGE_READ_MASK; 4135f08e3888SBoqun Feng unsigned usage_mask = lock_flag(bit) | lock_flag(read_bit); 41368eddac3fSPeter Zijlstra 41376971c0f3SBoqun Feng bfs_init_root(&root, this); 4138f08e3888SBoqun Feng ret = find_usage_forwards(&root, usage_mask, &target_entry); 4139b11be024SBoqun Feng if (bfs_error(ret)) { 4140f7c1c6b3SYuyang Du print_bfs_bug(ret); 4141f7c1c6b3SYuyang Du return 0; 4142f7c1c6b3SYuyang Du } 4143b11be024SBoqun Feng if (ret == BFS_RNOMATCH) 4144b11be024SBoqun Feng return 1; 41458eddac3fSPeter Zijlstra 4146f08e3888SBoqun Feng /* Check whether write or read usage is the match */ 4147f08e3888SBoqun Feng if (target_entry->class->usage_mask & lock_flag(bit)) { 4148f7c1c6b3SYuyang Du print_irq_inversion_bug(curr, &root, target_entry, 4149f08e3888SBoqun Feng this, 1, state_name(bit)); 4150f08e3888SBoqun Feng } else { 4151f08e3888SBoqun Feng print_irq_inversion_bug(curr, &root, target_entry, 4152f08e3888SBoqun Feng this, 1, state_name(read_bit)); 4153f08e3888SBoqun Feng } 4154f08e3888SBoqun Feng 4155f7c1c6b3SYuyang Du return 0; 41568eddac3fSPeter Zijlstra } 41578eddac3fSPeter Zijlstra 41588eddac3fSPeter Zijlstra /* 41598eddac3fSPeter Zijlstra * Prove that in the backwards-direction subgraph starting at <this> 41608eddac3fSPeter Zijlstra * there is no lock matching <mask>: 41618eddac3fSPeter Zijlstra */ 41628eddac3fSPeter Zijlstra static int 41638eddac3fSPeter Zijlstra check_usage_backwards(struct task_struct *curr, struct held_lock *this, 4164f08e3888SBoqun Feng enum lock_usage_bit bit) 41658eddac3fSPeter Zijlstra { 4166b11be024SBoqun Feng enum bfs_result ret; 41678eddac3fSPeter Zijlstra struct lock_list root; 41683f649ab7SKees Cook struct lock_list *target_entry; 4169f08e3888SBoqun Feng enum lock_usage_bit read_bit = bit + LOCK_USAGE_READ_MASK; 4170f08e3888SBoqun Feng unsigned usage_mask = lock_flag(bit) | lock_flag(read_bit); 41718eddac3fSPeter Zijlstra 41726971c0f3SBoqun Feng bfs_init_rootb(&root, this); 4173f08e3888SBoqun Feng ret = find_usage_backwards(&root, usage_mask, &target_entry); 4174b11be024SBoqun Feng if (bfs_error(ret)) { 4175f7c1c6b3SYuyang Du print_bfs_bug(ret); 4176f7c1c6b3SYuyang Du return 0; 4177f7c1c6b3SYuyang Du } 4178b11be024SBoqun Feng if (ret == BFS_RNOMATCH) 4179b11be024SBoqun Feng return 1; 41808eddac3fSPeter Zijlstra 4181f08e3888SBoqun Feng /* Check whether write or read usage is the match */ 4182f08e3888SBoqun Feng if (target_entry->class->usage_mask & lock_flag(bit)) { 4183f7c1c6b3SYuyang Du print_irq_inversion_bug(curr, &root, target_entry, 4184f08e3888SBoqun Feng this, 0, state_name(bit)); 4185f08e3888SBoqun Feng } else { 4186f08e3888SBoqun Feng print_irq_inversion_bug(curr, &root, target_entry, 4187f08e3888SBoqun Feng this, 0, state_name(read_bit)); 4188f08e3888SBoqun Feng } 4189f08e3888SBoqun Feng 4190f7c1c6b3SYuyang Du return 0; 41918eddac3fSPeter Zijlstra } 41928eddac3fSPeter Zijlstra 41938eddac3fSPeter Zijlstra void print_irqtrace_events(struct task_struct *curr) 41948eddac3fSPeter Zijlstra { 41950584df9cSMarco Elver const struct irqtrace_events *trace = &curr->irqtrace; 41960584df9cSMarco Elver 4197*59cd94efSJohn Ogness nbcon_cpu_emergency_enter(); 4198*59cd94efSJohn Ogness 41990584df9cSMarco Elver printk("irq event stamp: %u\n", trace->irq_events); 420004860d48SBorislav Petkov printk("hardirqs last enabled at (%u): [<%px>] %pS\n", 42010584df9cSMarco Elver trace->hardirq_enable_event, (void *)trace->hardirq_enable_ip, 42020584df9cSMarco Elver (void *)trace->hardirq_enable_ip); 420304860d48SBorislav Petkov printk("hardirqs last disabled at (%u): [<%px>] %pS\n", 42040584df9cSMarco Elver trace->hardirq_disable_event, (void *)trace->hardirq_disable_ip, 42050584df9cSMarco Elver (void *)trace->hardirq_disable_ip); 420604860d48SBorislav Petkov printk("softirqs last enabled at (%u): [<%px>] %pS\n", 42070584df9cSMarco Elver trace->softirq_enable_event, (void *)trace->softirq_enable_ip, 42080584df9cSMarco Elver (void *)trace->softirq_enable_ip); 420904860d48SBorislav Petkov printk("softirqs last disabled at (%u): [<%px>] %pS\n", 42100584df9cSMarco Elver trace->softirq_disable_event, (void *)trace->softirq_disable_ip, 42110584df9cSMarco Elver (void *)trace->softirq_disable_ip); 4212*59cd94efSJohn Ogness 4213*59cd94efSJohn Ogness nbcon_cpu_emergency_exit(); 42148eddac3fSPeter Zijlstra } 42158eddac3fSPeter Zijlstra 42168eddac3fSPeter Zijlstra static int HARDIRQ_verbose(struct lock_class *class) 42178eddac3fSPeter Zijlstra { 42188eddac3fSPeter Zijlstra #if HARDIRQ_VERBOSE 42198eddac3fSPeter Zijlstra return class_filter(class); 42208eddac3fSPeter Zijlstra #endif 42218eddac3fSPeter Zijlstra return 0; 42228eddac3fSPeter Zijlstra } 42238eddac3fSPeter Zijlstra 42248eddac3fSPeter Zijlstra static int SOFTIRQ_verbose(struct lock_class *class) 42258eddac3fSPeter Zijlstra { 42268eddac3fSPeter Zijlstra #if SOFTIRQ_VERBOSE 42278eddac3fSPeter Zijlstra return class_filter(class); 42288eddac3fSPeter Zijlstra #endif 42298eddac3fSPeter Zijlstra return 0; 42308eddac3fSPeter Zijlstra } 42318eddac3fSPeter Zijlstra 42328eddac3fSPeter Zijlstra static int (*state_verbose_f[])(struct lock_class *class) = { 42338eddac3fSPeter Zijlstra #define LOCKDEP_STATE(__STATE) \ 42348eddac3fSPeter Zijlstra __STATE##_verbose, 42358eddac3fSPeter Zijlstra #include "lockdep_states.h" 42368eddac3fSPeter Zijlstra #undef LOCKDEP_STATE 42378eddac3fSPeter Zijlstra }; 42388eddac3fSPeter Zijlstra 42398eddac3fSPeter Zijlstra static inline int state_verbose(enum lock_usage_bit bit, 42408eddac3fSPeter Zijlstra struct lock_class *class) 42418eddac3fSPeter Zijlstra { 4242c902a1e8SFrederic Weisbecker return state_verbose_f[bit >> LOCK_USAGE_DIR_MASK](class); 42438eddac3fSPeter Zijlstra } 42448eddac3fSPeter Zijlstra 42458eddac3fSPeter Zijlstra typedef int (*check_usage_f)(struct task_struct *, struct held_lock *, 42468eddac3fSPeter Zijlstra enum lock_usage_bit bit, const char *name); 42478eddac3fSPeter Zijlstra 42488eddac3fSPeter Zijlstra static int 42498eddac3fSPeter Zijlstra mark_lock_irq(struct task_struct *curr, struct held_lock *this, 42508eddac3fSPeter Zijlstra enum lock_usage_bit new_bit) 42518eddac3fSPeter Zijlstra { 42528eddac3fSPeter Zijlstra int excl_bit = exclusive_bit(new_bit); 4253bba2a8f1SFrederic Weisbecker int read = new_bit & LOCK_USAGE_READ_MASK; 4254bba2a8f1SFrederic Weisbecker int dir = new_bit & LOCK_USAGE_DIR_MASK; 42558eddac3fSPeter Zijlstra 42568eddac3fSPeter Zijlstra /* 42578eddac3fSPeter Zijlstra * Validate that this particular lock does not have conflicting 42588eddac3fSPeter Zijlstra * usage states. 42598eddac3fSPeter Zijlstra */ 42608eddac3fSPeter Zijlstra if (!valid_state(curr, this, new_bit, excl_bit)) 42618eddac3fSPeter Zijlstra return 0; 42628eddac3fSPeter Zijlstra 42638eddac3fSPeter Zijlstra /* 4264f08e3888SBoqun Feng * Check for read in write conflicts 4265f08e3888SBoqun Feng */ 4266f08e3888SBoqun Feng if (!read && !valid_state(curr, this, new_bit, 4267f08e3888SBoqun Feng excl_bit + LOCK_USAGE_READ_MASK)) 4268f08e3888SBoqun Feng return 0; 4269f08e3888SBoqun Feng 4270f08e3888SBoqun Feng 4271f08e3888SBoqun Feng /* 42728eddac3fSPeter Zijlstra * Validate that the lock dependencies don't have conflicting usage 42738eddac3fSPeter Zijlstra * states. 42748eddac3fSPeter Zijlstra */ 4275f08e3888SBoqun Feng if (dir) { 42768eddac3fSPeter Zijlstra /* 4277f08e3888SBoqun Feng * mark ENABLED has to look backwards -- to ensure no dependee 4278f08e3888SBoqun Feng * has USED_IN state, which, again, would allow recursion deadlocks. 42798eddac3fSPeter Zijlstra */ 4280f08e3888SBoqun Feng if (!check_usage_backwards(curr, this, excl_bit)) 42818eddac3fSPeter Zijlstra return 0; 4282f08e3888SBoqun Feng } else { 4283f08e3888SBoqun Feng /* 4284f08e3888SBoqun Feng * mark USED_IN has to look forwards -- to ensure no dependency 4285f08e3888SBoqun Feng * has ENABLED state, which would allow recursion deadlocks. 4286f08e3888SBoqun Feng */ 4287f08e3888SBoqun Feng if (!check_usage_forwards(curr, this, excl_bit)) 42888eddac3fSPeter Zijlstra return 0; 42898eddac3fSPeter Zijlstra } 42908eddac3fSPeter Zijlstra 42918eddac3fSPeter Zijlstra if (state_verbose(new_bit, hlock_class(this))) 42928eddac3fSPeter Zijlstra return 2; 42938eddac3fSPeter Zijlstra 42948eddac3fSPeter Zijlstra return 1; 42958eddac3fSPeter Zijlstra } 42968eddac3fSPeter Zijlstra 42978eddac3fSPeter Zijlstra /* 42988eddac3fSPeter Zijlstra * Mark all held locks with a usage bit: 42998eddac3fSPeter Zijlstra */ 43008eddac3fSPeter Zijlstra static int 4301436a49aeSFrederic Weisbecker mark_held_locks(struct task_struct *curr, enum lock_usage_bit base_bit) 43028eddac3fSPeter Zijlstra { 43038eddac3fSPeter Zijlstra struct held_lock *hlock; 43048eddac3fSPeter Zijlstra int i; 43058eddac3fSPeter Zijlstra 43068eddac3fSPeter Zijlstra for (i = 0; i < curr->lockdep_depth; i++) { 4307436a49aeSFrederic Weisbecker enum lock_usage_bit hlock_bit = base_bit; 43088eddac3fSPeter Zijlstra hlock = curr->held_locks + i; 43098eddac3fSPeter Zijlstra 43108eddac3fSPeter Zijlstra if (hlock->read) 4311bba2a8f1SFrederic Weisbecker hlock_bit += LOCK_USAGE_READ_MASK; 43128eddac3fSPeter Zijlstra 4313436a49aeSFrederic Weisbecker BUG_ON(hlock_bit >= LOCK_USAGE_STATES); 43148eddac3fSPeter Zijlstra 431534d0ed5eSOleg Nesterov if (!hlock->check) 43168eddac3fSPeter Zijlstra continue; 43178eddac3fSPeter Zijlstra 4318436a49aeSFrederic Weisbecker if (!mark_lock(curr, hlock, hlock_bit)) 43198eddac3fSPeter Zijlstra return 0; 43208eddac3fSPeter Zijlstra } 43218eddac3fSPeter Zijlstra 43228eddac3fSPeter Zijlstra return 1; 43238eddac3fSPeter Zijlstra } 43248eddac3fSPeter Zijlstra 43258eddac3fSPeter Zijlstra /* 43268eddac3fSPeter Zijlstra * Hardirqs will be enabled: 43278eddac3fSPeter Zijlstra */ 4328c86e9b98SPeter Zijlstra static void __trace_hardirqs_on_caller(void) 43298eddac3fSPeter Zijlstra { 43308eddac3fSPeter Zijlstra struct task_struct *curr = current; 43318eddac3fSPeter Zijlstra 43328eddac3fSPeter Zijlstra /* 43338eddac3fSPeter Zijlstra * We are going to turn hardirqs on, so set the 43348eddac3fSPeter Zijlstra * usage bit for all held locks: 43358eddac3fSPeter Zijlstra */ 4336436a49aeSFrederic Weisbecker if (!mark_held_locks(curr, LOCK_ENABLED_HARDIRQ)) 43378eddac3fSPeter Zijlstra return; 43388eddac3fSPeter Zijlstra /* 43398eddac3fSPeter Zijlstra * If we have softirqs enabled, then set the usage 43408eddac3fSPeter Zijlstra * bit for all held locks. (disabled hardirqs prevented 43418eddac3fSPeter Zijlstra * this bit from being set before) 43428eddac3fSPeter Zijlstra */ 43438eddac3fSPeter Zijlstra if (curr->softirqs_enabled) 4344c86e9b98SPeter Zijlstra mark_held_locks(curr, LOCK_ENABLED_SOFTIRQ); 43458eddac3fSPeter Zijlstra } 43468eddac3fSPeter Zijlstra 4347c86e9b98SPeter Zijlstra /** 4348c86e9b98SPeter Zijlstra * lockdep_hardirqs_on_prepare - Prepare for enabling interrupts 4349c86e9b98SPeter Zijlstra * 4350c86e9b98SPeter Zijlstra * Invoked before a possible transition to RCU idle from exit to user or 4351c86e9b98SPeter Zijlstra * guest mode. This ensures that all RCU operations are done before RCU 4352c86e9b98SPeter Zijlstra * stops watching. After the RCU transition lockdep_hardirqs_on() has to be 4353c86e9b98SPeter Zijlstra * invoked to set the final state. 4354c86e9b98SPeter Zijlstra */ 43558b023accSNick Desaulniers void lockdep_hardirqs_on_prepare(void) 43568eddac3fSPeter Zijlstra { 4357859d069eSPeter Zijlstra if (unlikely(!debug_locks)) 43588eddac3fSPeter Zijlstra return; 43598eddac3fSPeter Zijlstra 4360859d069eSPeter Zijlstra /* 4361859d069eSPeter Zijlstra * NMIs do not (and cannot) track lock dependencies, nothing to do. 4362859d069eSPeter Zijlstra */ 4363859d069eSPeter Zijlstra if (unlikely(in_nmi())) 4364859d069eSPeter Zijlstra return; 4365859d069eSPeter Zijlstra 4366f8e48a3dSPeter Zijlstra if (unlikely(this_cpu_read(lockdep_recursion))) 43678eddac3fSPeter Zijlstra return; 43688eddac3fSPeter Zijlstra 4369f9ad4a5fSPeter Zijlstra if (unlikely(lockdep_hardirqs_enabled())) { 43708eddac3fSPeter Zijlstra /* 43718eddac3fSPeter Zijlstra * Neither irq nor preemption are disabled here 43728eddac3fSPeter Zijlstra * so this is racy by nature but losing one hit 43738eddac3fSPeter Zijlstra * in a stat is not a big deal. 43748eddac3fSPeter Zijlstra */ 43758eddac3fSPeter Zijlstra __debug_atomic_inc(redundant_hardirqs_on); 43768eddac3fSPeter Zijlstra return; 43778eddac3fSPeter Zijlstra } 43788eddac3fSPeter Zijlstra 43798eddac3fSPeter Zijlstra /* 43808eddac3fSPeter Zijlstra * We're enabling irqs and according to our state above irqs weren't 43818eddac3fSPeter Zijlstra * already enabled, yet we find the hardware thinks they are in fact 43828eddac3fSPeter Zijlstra * enabled.. someone messed up their IRQ state tracing. 43838eddac3fSPeter Zijlstra */ 43848eddac3fSPeter Zijlstra if (DEBUG_LOCKS_WARN_ON(!irqs_disabled())) 43858eddac3fSPeter Zijlstra return; 43868eddac3fSPeter Zijlstra 43878eddac3fSPeter Zijlstra /* 43888eddac3fSPeter Zijlstra * See the fine text that goes along with this variable definition. 43898eddac3fSPeter Zijlstra */ 4390d671002bSzhengbin if (DEBUG_LOCKS_WARN_ON(early_boot_irqs_disabled)) 43918eddac3fSPeter Zijlstra return; 43928eddac3fSPeter Zijlstra 43938eddac3fSPeter Zijlstra /* 43948eddac3fSPeter Zijlstra * Can't allow enabling interrupts while in an interrupt handler, 43958eddac3fSPeter Zijlstra * that's general bad form and such. Recursion, limited stack etc.. 43968eddac3fSPeter Zijlstra */ 4397f9ad4a5fSPeter Zijlstra if (DEBUG_LOCKS_WARN_ON(lockdep_hardirq_context())) 43988eddac3fSPeter Zijlstra return; 43998eddac3fSPeter Zijlstra 4400c86e9b98SPeter Zijlstra current->hardirq_chain_key = current->curr_chain_key; 4401c86e9b98SPeter Zijlstra 44024d004099SPeter Zijlstra lockdep_recursion_inc(); 4403c86e9b98SPeter Zijlstra __trace_hardirqs_on_caller(); 440410476e63SPeter Zijlstra lockdep_recursion_finish(); 44058eddac3fSPeter Zijlstra } 4406c86e9b98SPeter Zijlstra EXPORT_SYMBOL_GPL(lockdep_hardirqs_on_prepare); 4407c86e9b98SPeter Zijlstra 4408c86e9b98SPeter Zijlstra void noinstr lockdep_hardirqs_on(unsigned long ip) 4409c86e9b98SPeter Zijlstra { 44100584df9cSMarco Elver struct irqtrace_events *trace = ¤t->irqtrace; 4411c86e9b98SPeter Zijlstra 4412859d069eSPeter Zijlstra if (unlikely(!debug_locks)) 4413c86e9b98SPeter Zijlstra return; 4414c86e9b98SPeter Zijlstra 4415859d069eSPeter Zijlstra /* 4416859d069eSPeter Zijlstra * NMIs can happen in the middle of local_irq_{en,dis}able() where the 4417859d069eSPeter Zijlstra * tracking state and hardware state are out of sync. 4418859d069eSPeter Zijlstra * 4419859d069eSPeter Zijlstra * NMIs must save lockdep_hardirqs_enabled() to restore IRQ state from, 4420859d069eSPeter Zijlstra * and not rely on hardware state like normal interrupts. 4421859d069eSPeter Zijlstra */ 4422859d069eSPeter Zijlstra if (unlikely(in_nmi())) { 4423ed004953S[email protected] if (!IS_ENABLED(CONFIG_TRACE_IRQFLAGS_NMI)) 4424ed004953S[email protected] return; 4425ed004953S[email protected] 4426859d069eSPeter Zijlstra /* 4427859d069eSPeter Zijlstra * Skip: 4428859d069eSPeter Zijlstra * - recursion check, because NMI can hit lockdep; 4429859d069eSPeter Zijlstra * - hardware state check, because above; 4430859d069eSPeter Zijlstra * - chain_key check, see lockdep_hardirqs_on_prepare(). 4431859d069eSPeter Zijlstra */ 4432859d069eSPeter Zijlstra goto skip_checks; 4433859d069eSPeter Zijlstra } 4434859d069eSPeter Zijlstra 4435f8e48a3dSPeter Zijlstra if (unlikely(this_cpu_read(lockdep_recursion))) 4436c86e9b98SPeter Zijlstra return; 4437c86e9b98SPeter Zijlstra 4438f9ad4a5fSPeter Zijlstra if (lockdep_hardirqs_enabled()) { 4439c86e9b98SPeter Zijlstra /* 4440c86e9b98SPeter Zijlstra * Neither irq nor preemption are disabled here 4441c86e9b98SPeter Zijlstra * so this is racy by nature but losing one hit 4442c86e9b98SPeter Zijlstra * in a stat is not a big deal. 4443c86e9b98SPeter Zijlstra */ 4444c86e9b98SPeter Zijlstra __debug_atomic_inc(redundant_hardirqs_on); 4445c86e9b98SPeter Zijlstra return; 4446c86e9b98SPeter Zijlstra } 4447c86e9b98SPeter Zijlstra 4448c86e9b98SPeter Zijlstra /* 4449c86e9b98SPeter Zijlstra * We're enabling irqs and according to our state above irqs weren't 4450c86e9b98SPeter Zijlstra * already enabled, yet we find the hardware thinks they are in fact 4451c86e9b98SPeter Zijlstra * enabled.. someone messed up their IRQ state tracing. 4452c86e9b98SPeter Zijlstra */ 4453c86e9b98SPeter Zijlstra if (DEBUG_LOCKS_WARN_ON(!irqs_disabled())) 4454c86e9b98SPeter Zijlstra return; 4455c86e9b98SPeter Zijlstra 4456c86e9b98SPeter Zijlstra /* 4457c86e9b98SPeter Zijlstra * Ensure the lock stack remained unchanged between 4458c86e9b98SPeter Zijlstra * lockdep_hardirqs_on_prepare() and lockdep_hardirqs_on(). 4459c86e9b98SPeter Zijlstra */ 4460c86e9b98SPeter Zijlstra DEBUG_LOCKS_WARN_ON(current->hardirq_chain_key != 4461c86e9b98SPeter Zijlstra current->curr_chain_key); 4462c86e9b98SPeter Zijlstra 4463859d069eSPeter Zijlstra skip_checks: 4464c86e9b98SPeter Zijlstra /* we'll do an OFF -> ON transition: */ 4465fddf9055SPeter Zijlstra __this_cpu_write(hardirqs_enabled, 1); 44660584df9cSMarco Elver trace->hardirq_enable_ip = ip; 44670584df9cSMarco Elver trace->hardirq_enable_event = ++trace->irq_events; 4468c86e9b98SPeter Zijlstra debug_atomic_inc(hardirqs_on_events); 4469c86e9b98SPeter Zijlstra } 4470c86e9b98SPeter Zijlstra EXPORT_SYMBOL_GPL(lockdep_hardirqs_on); 44718eddac3fSPeter Zijlstra 44728eddac3fSPeter Zijlstra /* 44738eddac3fSPeter Zijlstra * Hardirqs were disabled: 44748eddac3fSPeter Zijlstra */ 4475c86e9b98SPeter Zijlstra void noinstr lockdep_hardirqs_off(unsigned long ip) 44768eddac3fSPeter Zijlstra { 4477859d069eSPeter Zijlstra if (unlikely(!debug_locks)) 4478859d069eSPeter Zijlstra return; 44798eddac3fSPeter Zijlstra 4480859d069eSPeter Zijlstra /* 4481859d069eSPeter Zijlstra * Matching lockdep_hardirqs_on(), allow NMIs in the middle of lockdep; 4482859d069eSPeter Zijlstra * they will restore the software state. This ensures the software 4483859d069eSPeter Zijlstra * state is consistent inside NMIs as well. 4484859d069eSPeter Zijlstra */ 4485ed004953S[email protected] if (in_nmi()) { 4486ed004953S[email protected] if (!IS_ENABLED(CONFIG_TRACE_IRQFLAGS_NMI)) 4487ed004953S[email protected] return; 44884d004099SPeter Zijlstra } else if (__this_cpu_read(lockdep_recursion)) 44898eddac3fSPeter Zijlstra return; 44908eddac3fSPeter Zijlstra 44918eddac3fSPeter Zijlstra /* 44928eddac3fSPeter Zijlstra * So we're supposed to get called after you mask local IRQs, but for 44938eddac3fSPeter Zijlstra * some reason the hardware doesn't quite think you did a proper job. 44948eddac3fSPeter Zijlstra */ 44958eddac3fSPeter Zijlstra if (DEBUG_LOCKS_WARN_ON(!irqs_disabled())) 44968eddac3fSPeter Zijlstra return; 44978eddac3fSPeter Zijlstra 4498f9ad4a5fSPeter Zijlstra if (lockdep_hardirqs_enabled()) { 44990584df9cSMarco Elver struct irqtrace_events *trace = ¤t->irqtrace; 45000584df9cSMarco Elver 45018eddac3fSPeter Zijlstra /* 45028eddac3fSPeter Zijlstra * We have done an ON -> OFF transition: 45038eddac3fSPeter Zijlstra */ 4504fddf9055SPeter Zijlstra __this_cpu_write(hardirqs_enabled, 0); 45050584df9cSMarco Elver trace->hardirq_disable_ip = ip; 45060584df9cSMarco Elver trace->hardirq_disable_event = ++trace->irq_events; 45078eddac3fSPeter Zijlstra debug_atomic_inc(hardirqs_off_events); 4508c86e9b98SPeter Zijlstra } else { 45098eddac3fSPeter Zijlstra debug_atomic_inc(redundant_hardirqs_off); 45108eddac3fSPeter Zijlstra } 4511c86e9b98SPeter Zijlstra } 4512c86e9b98SPeter Zijlstra EXPORT_SYMBOL_GPL(lockdep_hardirqs_off); 45138eddac3fSPeter Zijlstra 45148eddac3fSPeter Zijlstra /* 45158eddac3fSPeter Zijlstra * Softirqs will be enabled: 45168eddac3fSPeter Zijlstra */ 45170d38453cSPeter Zijlstra void lockdep_softirqs_on(unsigned long ip) 45188eddac3fSPeter Zijlstra { 45190584df9cSMarco Elver struct irqtrace_events *trace = ¤t->irqtrace; 45208eddac3fSPeter Zijlstra 45214d004099SPeter Zijlstra if (unlikely(!lockdep_enabled())) 45228eddac3fSPeter Zijlstra return; 45238eddac3fSPeter Zijlstra 45248eddac3fSPeter Zijlstra /* 45258eddac3fSPeter Zijlstra * We fancy IRQs being disabled here, see softirq.c, avoids 45268eddac3fSPeter Zijlstra * funny state and nesting things. 45278eddac3fSPeter Zijlstra */ 45288eddac3fSPeter Zijlstra if (DEBUG_LOCKS_WARN_ON(!irqs_disabled())) 45298eddac3fSPeter Zijlstra return; 45308eddac3fSPeter Zijlstra 45310584df9cSMarco Elver if (current->softirqs_enabled) { 45328eddac3fSPeter Zijlstra debug_atomic_inc(redundant_softirqs_on); 45338eddac3fSPeter Zijlstra return; 45348eddac3fSPeter Zijlstra } 45358eddac3fSPeter Zijlstra 45364d004099SPeter Zijlstra lockdep_recursion_inc(); 45378eddac3fSPeter Zijlstra /* 45388eddac3fSPeter Zijlstra * We'll do an OFF -> ON transition: 45398eddac3fSPeter Zijlstra */ 45400584df9cSMarco Elver current->softirqs_enabled = 1; 45410584df9cSMarco Elver trace->softirq_enable_ip = ip; 45420584df9cSMarco Elver trace->softirq_enable_event = ++trace->irq_events; 45438eddac3fSPeter Zijlstra debug_atomic_inc(softirqs_on_events); 45448eddac3fSPeter Zijlstra /* 45458eddac3fSPeter Zijlstra * We are going to turn softirqs on, so set the 45468eddac3fSPeter Zijlstra * usage bit for all held locks, if hardirqs are 45478eddac3fSPeter Zijlstra * enabled too: 45488eddac3fSPeter Zijlstra */ 4549f9ad4a5fSPeter Zijlstra if (lockdep_hardirqs_enabled()) 45500584df9cSMarco Elver mark_held_locks(current, LOCK_ENABLED_SOFTIRQ); 455110476e63SPeter Zijlstra lockdep_recursion_finish(); 45528eddac3fSPeter Zijlstra } 45538eddac3fSPeter Zijlstra 45548eddac3fSPeter Zijlstra /* 45558eddac3fSPeter Zijlstra * Softirqs were disabled: 45568eddac3fSPeter Zijlstra */ 45570d38453cSPeter Zijlstra void lockdep_softirqs_off(unsigned long ip) 45588eddac3fSPeter Zijlstra { 45594d004099SPeter Zijlstra if (unlikely(!lockdep_enabled())) 45608eddac3fSPeter Zijlstra return; 45618eddac3fSPeter Zijlstra 45628eddac3fSPeter Zijlstra /* 45638eddac3fSPeter Zijlstra * We fancy IRQs being disabled here, see softirq.c 45648eddac3fSPeter Zijlstra */ 45658eddac3fSPeter Zijlstra if (DEBUG_LOCKS_WARN_ON(!irqs_disabled())) 45668eddac3fSPeter Zijlstra return; 45678eddac3fSPeter Zijlstra 45680584df9cSMarco Elver if (current->softirqs_enabled) { 45690584df9cSMarco Elver struct irqtrace_events *trace = ¤t->irqtrace; 45700584df9cSMarco Elver 45718eddac3fSPeter Zijlstra /* 45728eddac3fSPeter Zijlstra * We have done an ON -> OFF transition: 45738eddac3fSPeter Zijlstra */ 45740584df9cSMarco Elver current->softirqs_enabled = 0; 45750584df9cSMarco Elver trace->softirq_disable_ip = ip; 45760584df9cSMarco Elver trace->softirq_disable_event = ++trace->irq_events; 45778eddac3fSPeter Zijlstra debug_atomic_inc(softirqs_off_events); 45788eddac3fSPeter Zijlstra /* 45798eddac3fSPeter Zijlstra * Whoops, we wanted softirqs off, so why aren't they? 45808eddac3fSPeter Zijlstra */ 45818eddac3fSPeter Zijlstra DEBUG_LOCKS_WARN_ON(!softirq_count()); 45828eddac3fSPeter Zijlstra } else 45838eddac3fSPeter Zijlstra debug_atomic_inc(redundant_softirqs_off); 45848eddac3fSPeter Zijlstra } 45858eddac3fSPeter Zijlstra 458609180651SYuyang Du static int 458709180651SYuyang Du mark_usage(struct task_struct *curr, struct held_lock *hlock, int check) 45888eddac3fSPeter Zijlstra { 458909180651SYuyang Du if (!check) 459009180651SYuyang Du goto lock_used; 459109180651SYuyang Du 45928eddac3fSPeter Zijlstra /* 45938eddac3fSPeter Zijlstra * If non-trylock use in a hardirq or softirq context, then 45948eddac3fSPeter Zijlstra * mark the lock as used in these contexts: 45958eddac3fSPeter Zijlstra */ 45968eddac3fSPeter Zijlstra if (!hlock->trylock) { 45978eddac3fSPeter Zijlstra if (hlock->read) { 4598f9ad4a5fSPeter Zijlstra if (lockdep_hardirq_context()) 45998eddac3fSPeter Zijlstra if (!mark_lock(curr, hlock, 46008eddac3fSPeter Zijlstra LOCK_USED_IN_HARDIRQ_READ)) 46018eddac3fSPeter Zijlstra return 0; 46028eddac3fSPeter Zijlstra if (curr->softirq_context) 46038eddac3fSPeter Zijlstra if (!mark_lock(curr, hlock, 46048eddac3fSPeter Zijlstra LOCK_USED_IN_SOFTIRQ_READ)) 46058eddac3fSPeter Zijlstra return 0; 46068eddac3fSPeter Zijlstra } else { 4607f9ad4a5fSPeter Zijlstra if (lockdep_hardirq_context()) 46088eddac3fSPeter Zijlstra if (!mark_lock(curr, hlock, LOCK_USED_IN_HARDIRQ)) 46098eddac3fSPeter Zijlstra return 0; 46108eddac3fSPeter Zijlstra if (curr->softirq_context) 46118eddac3fSPeter Zijlstra if (!mark_lock(curr, hlock, LOCK_USED_IN_SOFTIRQ)) 46128eddac3fSPeter Zijlstra return 0; 46138eddac3fSPeter Zijlstra } 46148eddac3fSPeter Zijlstra } 46150471db44SBoqun Feng 46160471db44SBoqun Feng /* 46170471db44SBoqun Feng * For lock_sync(), don't mark the ENABLED usage, since lock_sync() 46180471db44SBoqun Feng * creates no critical section and no extra dependency can be introduced 46190471db44SBoqun Feng * by interrupts 46200471db44SBoqun Feng */ 46210471db44SBoqun Feng if (!hlock->hardirqs_off && !hlock->sync) { 46228eddac3fSPeter Zijlstra if (hlock->read) { 46238eddac3fSPeter Zijlstra if (!mark_lock(curr, hlock, 46248eddac3fSPeter Zijlstra LOCK_ENABLED_HARDIRQ_READ)) 46258eddac3fSPeter Zijlstra return 0; 46268eddac3fSPeter Zijlstra if (curr->softirqs_enabled) 46278eddac3fSPeter Zijlstra if (!mark_lock(curr, hlock, 46288eddac3fSPeter Zijlstra LOCK_ENABLED_SOFTIRQ_READ)) 46298eddac3fSPeter Zijlstra return 0; 46308eddac3fSPeter Zijlstra } else { 46318eddac3fSPeter Zijlstra if (!mark_lock(curr, hlock, 46328eddac3fSPeter Zijlstra LOCK_ENABLED_HARDIRQ)) 46338eddac3fSPeter Zijlstra return 0; 46348eddac3fSPeter Zijlstra if (curr->softirqs_enabled) 46358eddac3fSPeter Zijlstra if (!mark_lock(curr, hlock, 46368eddac3fSPeter Zijlstra LOCK_ENABLED_SOFTIRQ)) 46378eddac3fSPeter Zijlstra return 0; 46388eddac3fSPeter Zijlstra } 46398eddac3fSPeter Zijlstra } 46408eddac3fSPeter Zijlstra 464109180651SYuyang Du lock_used: 464209180651SYuyang Du /* mark it as used: */ 464309180651SYuyang Du if (!mark_lock(curr, hlock, LOCK_USED)) 464409180651SYuyang Du return 0; 464509180651SYuyang Du 46468eddac3fSPeter Zijlstra return 1; 46478eddac3fSPeter Zijlstra } 46488eddac3fSPeter Zijlstra 4649c2469756SBoqun Feng static inline unsigned int task_irq_context(struct task_struct *task) 4650c2469756SBoqun Feng { 4651f9ad4a5fSPeter Zijlstra return LOCK_CHAIN_HARDIRQ_CONTEXT * !!lockdep_hardirq_context() + 4652b3b9c187SWaiman Long LOCK_CHAIN_SOFTIRQ_CONTEXT * !!task->softirq_context; 4653c2469756SBoqun Feng } 4654c2469756SBoqun Feng 46558eddac3fSPeter Zijlstra static int separate_irq_context(struct task_struct *curr, 46568eddac3fSPeter Zijlstra struct held_lock *hlock) 46578eddac3fSPeter Zijlstra { 46588eddac3fSPeter Zijlstra unsigned int depth = curr->lockdep_depth; 46598eddac3fSPeter Zijlstra 46608eddac3fSPeter Zijlstra /* 46618eddac3fSPeter Zijlstra * Keep track of points where we cross into an interrupt context: 46628eddac3fSPeter Zijlstra */ 46638eddac3fSPeter Zijlstra if (depth) { 46648eddac3fSPeter Zijlstra struct held_lock *prev_hlock; 46658eddac3fSPeter Zijlstra 46668eddac3fSPeter Zijlstra prev_hlock = curr->held_locks + depth-1; 46678eddac3fSPeter Zijlstra /* 46688eddac3fSPeter Zijlstra * If we cross into another context, reset the 46698eddac3fSPeter Zijlstra * hash key (this also prevents the checking and the 46708eddac3fSPeter Zijlstra * adding of the dependency to 'prev'): 46718eddac3fSPeter Zijlstra */ 46728eddac3fSPeter Zijlstra if (prev_hlock->irq_context != hlock->irq_context) 46738eddac3fSPeter Zijlstra return 1; 46748eddac3fSPeter Zijlstra } 46758eddac3fSPeter Zijlstra return 0; 46768eddac3fSPeter Zijlstra } 46778eddac3fSPeter Zijlstra 46788eddac3fSPeter Zijlstra /* 46798eddac3fSPeter Zijlstra * Mark a lock with a usage bit, and validate the state transition: 46808eddac3fSPeter Zijlstra */ 46818eddac3fSPeter Zijlstra static int mark_lock(struct task_struct *curr, struct held_lock *this, 46828eddac3fSPeter Zijlstra enum lock_usage_bit new_bit) 46838eddac3fSPeter Zijlstra { 46842bb8945bSPeter Zijlstra unsigned int new_mask, ret = 1; 46858eddac3fSPeter Zijlstra 46864d56330dSYuyang Du if (new_bit >= LOCK_USAGE_STATES) { 46874d56330dSYuyang Du DEBUG_LOCKS_WARN_ON(1); 46884d56330dSYuyang Du return 0; 46894d56330dSYuyang Du } 46904d56330dSYuyang Du 469123870f12S[email protected] if (new_bit == LOCK_USED && this->read) 469223870f12S[email protected] new_bit = LOCK_USED_READ; 469323870f12S[email protected] 469423870f12S[email protected] new_mask = 1 << new_bit; 469523870f12S[email protected] 46968eddac3fSPeter Zijlstra /* 46978eddac3fSPeter Zijlstra * If already set then do not dirty the cacheline, 46988eddac3fSPeter Zijlstra * nor do any checks: 46998eddac3fSPeter Zijlstra */ 47008eddac3fSPeter Zijlstra if (likely(hlock_class(this)->usage_mask & new_mask)) 47018eddac3fSPeter Zijlstra return 1; 47028eddac3fSPeter Zijlstra 47038eddac3fSPeter Zijlstra if (!graph_lock()) 47048eddac3fSPeter Zijlstra return 0; 47058eddac3fSPeter Zijlstra /* 47068eddac3fSPeter Zijlstra * Make sure we didn't race: 47078eddac3fSPeter Zijlstra */ 470823870f12S[email protected] if (unlikely(hlock_class(this)->usage_mask & new_mask)) 470923870f12S[email protected] goto unlock; 47108eddac3fSPeter Zijlstra 47111a393408SPeter Zijlstra if (!hlock_class(this)->usage_mask) 47121a393408SPeter Zijlstra debug_atomic_dec(nr_unused_locks); 47131a393408SPeter Zijlstra 47148eddac3fSPeter Zijlstra hlock_class(this)->usage_mask |= new_mask; 47158eddac3fSPeter Zijlstra 47162bb8945bSPeter Zijlstra if (new_bit < LOCK_TRACE_STATES) { 471712593b74SBart Van Assche if (!(hlock_class(this)->usage_traces[new_bit] = save_trace())) 47188eddac3fSPeter Zijlstra return 0; 47198eddac3fSPeter Zijlstra } 47208eddac3fSPeter Zijlstra 47211a393408SPeter Zijlstra if (new_bit < LOCK_USED) { 47228eddac3fSPeter Zijlstra ret = mark_lock_irq(curr, this, new_bit); 47238eddac3fSPeter Zijlstra if (!ret) 47248eddac3fSPeter Zijlstra return 0; 47258eddac3fSPeter Zijlstra } 47268eddac3fSPeter Zijlstra 472723870f12S[email protected] unlock: 47288eddac3fSPeter Zijlstra graph_unlock(); 47298eddac3fSPeter Zijlstra 47308eddac3fSPeter Zijlstra /* 47318eddac3fSPeter Zijlstra * We must printk outside of the graph_lock: 47328eddac3fSPeter Zijlstra */ 47338eddac3fSPeter Zijlstra if (ret == 2) { 4734*59cd94efSJohn Ogness nbcon_cpu_emergency_enter(); 47358eddac3fSPeter Zijlstra printk("\nmarked lock as {%s}:\n", usage_str[new_bit]); 47368eddac3fSPeter Zijlstra print_lock(this); 47378eddac3fSPeter Zijlstra print_irqtrace_events(curr); 47388eddac3fSPeter Zijlstra dump_stack(); 4739*59cd94efSJohn Ogness nbcon_cpu_emergency_exit(); 47408eddac3fSPeter Zijlstra } 47418eddac3fSPeter Zijlstra 47428eddac3fSPeter Zijlstra return ret; 47438eddac3fSPeter Zijlstra } 47448eddac3fSPeter Zijlstra 47459a019db0SPeter Zijlstra static inline short task_wait_context(struct task_struct *curr) 47469a019db0SPeter Zijlstra { 47479a019db0SPeter Zijlstra /* 47489a019db0SPeter Zijlstra * Set appropriate wait type for the context; for IRQs we have to take 47499a019db0SPeter Zijlstra * into account force_irqthread as that is implied by PREEMPT_RT. 47509a019db0SPeter Zijlstra */ 4751f9ad4a5fSPeter Zijlstra if (lockdep_hardirq_context()) { 47529a019db0SPeter Zijlstra /* 47539a019db0SPeter Zijlstra * Check if force_irqthreads will run us threaded. 47549a019db0SPeter Zijlstra */ 47559a019db0SPeter Zijlstra if (curr->hardirq_threaded || curr->irq_config) 47569a019db0SPeter Zijlstra return LD_WAIT_CONFIG; 47579a019db0SPeter Zijlstra 47589a019db0SPeter Zijlstra return LD_WAIT_SPIN; 47599a019db0SPeter Zijlstra } else if (curr->softirq_context) { 47609a019db0SPeter Zijlstra /* 47619a019db0SPeter Zijlstra * Softirqs are always threaded. 47629a019db0SPeter Zijlstra */ 47639a019db0SPeter Zijlstra return LD_WAIT_CONFIG; 47649a019db0SPeter Zijlstra } 47659a019db0SPeter Zijlstra 47669a019db0SPeter Zijlstra return LD_WAIT_MAX; 47679a019db0SPeter Zijlstra } 47689a019db0SPeter Zijlstra 4769de8f5e4fSPeter Zijlstra static int 4770de8f5e4fSPeter Zijlstra print_lock_invalid_wait_context(struct task_struct *curr, 4771de8f5e4fSPeter Zijlstra struct held_lock *hlock) 4772de8f5e4fSPeter Zijlstra { 47739a019db0SPeter Zijlstra short curr_inner; 47749a019db0SPeter Zijlstra 4775de8f5e4fSPeter Zijlstra if (!debug_locks_off()) 4776de8f5e4fSPeter Zijlstra return 0; 4777de8f5e4fSPeter Zijlstra if (debug_locks_silent) 4778de8f5e4fSPeter Zijlstra return 0; 4779de8f5e4fSPeter Zijlstra 4780*59cd94efSJohn Ogness nbcon_cpu_emergency_enter(); 4781*59cd94efSJohn Ogness 4782de8f5e4fSPeter Zijlstra pr_warn("\n"); 4783de8f5e4fSPeter Zijlstra pr_warn("=============================\n"); 4784de8f5e4fSPeter Zijlstra pr_warn("[ BUG: Invalid wait context ]\n"); 4785de8f5e4fSPeter Zijlstra print_kernel_ident(); 4786de8f5e4fSPeter Zijlstra pr_warn("-----------------------------\n"); 4787de8f5e4fSPeter Zijlstra 4788de8f5e4fSPeter Zijlstra pr_warn("%s/%d is trying to lock:\n", curr->comm, task_pid_nr(curr)); 4789de8f5e4fSPeter Zijlstra print_lock(hlock); 4790de8f5e4fSPeter Zijlstra 4791de8f5e4fSPeter Zijlstra pr_warn("other info that might help us debug this:\n"); 47929a019db0SPeter Zijlstra 47939a019db0SPeter Zijlstra curr_inner = task_wait_context(curr); 47949a019db0SPeter Zijlstra pr_warn("context-{%d:%d}\n", curr_inner, curr_inner); 47959a019db0SPeter Zijlstra 4796de8f5e4fSPeter Zijlstra lockdep_print_held_locks(curr); 4797de8f5e4fSPeter Zijlstra 4798de8f5e4fSPeter Zijlstra pr_warn("stack backtrace:\n"); 4799de8f5e4fSPeter Zijlstra dump_stack(); 4800de8f5e4fSPeter Zijlstra 4801*59cd94efSJohn Ogness nbcon_cpu_emergency_exit(); 4802*59cd94efSJohn Ogness 4803de8f5e4fSPeter Zijlstra return 0; 4804de8f5e4fSPeter Zijlstra } 4805de8f5e4fSPeter Zijlstra 4806de8f5e4fSPeter Zijlstra /* 4807de8f5e4fSPeter Zijlstra * Verify the wait_type context. 4808de8f5e4fSPeter Zijlstra * 4809a2e05dddSZhouyi Zhou * This check validates we take locks in the right wait-type order; that is it 4810de8f5e4fSPeter Zijlstra * ensures that we do not take mutexes inside spinlocks and do not attempt to 4811de8f5e4fSPeter Zijlstra * acquire spinlocks inside raw_spinlocks and the sort. 4812de8f5e4fSPeter Zijlstra * 4813de8f5e4fSPeter Zijlstra * The entire thing is slightly more complex because of RCU, RCU is a lock that 4814de8f5e4fSPeter Zijlstra * can be taken from (pretty much) any context but also has constraints. 4815de8f5e4fSPeter Zijlstra * However when taken in a stricter environment the RCU lock does not loosen 4816de8f5e4fSPeter Zijlstra * the constraints. 4817de8f5e4fSPeter Zijlstra * 4818de8f5e4fSPeter Zijlstra * Therefore we must look for the strictest environment in the lock stack and 4819de8f5e4fSPeter Zijlstra * compare that to the lock we're trying to acquire. 4820de8f5e4fSPeter Zijlstra */ 4821de8f5e4fSPeter Zijlstra static int check_wait_context(struct task_struct *curr, struct held_lock *next) 4822de8f5e4fSPeter Zijlstra { 4823dfd5e3f5SPeter Zijlstra u8 next_inner = hlock_class(next)->wait_type_inner; 4824dfd5e3f5SPeter Zijlstra u8 next_outer = hlock_class(next)->wait_type_outer; 4825dfd5e3f5SPeter Zijlstra u8 curr_inner; 4826de8f5e4fSPeter Zijlstra int depth; 4827de8f5e4fSPeter Zijlstra 4828f8b298ccSPeter Zijlstra if (!next_inner || next->trylock) 4829de8f5e4fSPeter Zijlstra return 0; 4830de8f5e4fSPeter Zijlstra 4831de8f5e4fSPeter Zijlstra if (!next_outer) 4832de8f5e4fSPeter Zijlstra next_outer = next_inner; 4833de8f5e4fSPeter Zijlstra 4834de8f5e4fSPeter Zijlstra /* 4835de8f5e4fSPeter Zijlstra * Find start of current irq_context.. 4836de8f5e4fSPeter Zijlstra */ 4837de8f5e4fSPeter Zijlstra for (depth = curr->lockdep_depth - 1; depth >= 0; depth--) { 4838de8f5e4fSPeter Zijlstra struct held_lock *prev = curr->held_locks + depth; 4839de8f5e4fSPeter Zijlstra if (prev->irq_context != next->irq_context) 4840de8f5e4fSPeter Zijlstra break; 4841de8f5e4fSPeter Zijlstra } 4842de8f5e4fSPeter Zijlstra depth++; 4843de8f5e4fSPeter Zijlstra 48449a019db0SPeter Zijlstra curr_inner = task_wait_context(curr); 4845de8f5e4fSPeter Zijlstra 4846de8f5e4fSPeter Zijlstra for (; depth < curr->lockdep_depth; depth++) { 4847de8f5e4fSPeter Zijlstra struct held_lock *prev = curr->held_locks + depth; 48480cce06baSPeter Zijlstra struct lock_class *class = hlock_class(prev); 48490cce06baSPeter Zijlstra u8 prev_inner = class->wait_type_inner; 4850de8f5e4fSPeter Zijlstra 4851de8f5e4fSPeter Zijlstra if (prev_inner) { 4852de8f5e4fSPeter Zijlstra /* 4853de8f5e4fSPeter Zijlstra * We can have a bigger inner than a previous one 4854de8f5e4fSPeter Zijlstra * when outer is smaller than inner, as with RCU. 4855de8f5e4fSPeter Zijlstra * 4856de8f5e4fSPeter Zijlstra * Also due to trylocks. 4857de8f5e4fSPeter Zijlstra */ 4858de8f5e4fSPeter Zijlstra curr_inner = min(curr_inner, prev_inner); 48590cce06baSPeter Zijlstra 48600cce06baSPeter Zijlstra /* 48610cce06baSPeter Zijlstra * Allow override for annotations -- this is typically 48620cce06baSPeter Zijlstra * only valid/needed for code that only exists when 48630cce06baSPeter Zijlstra * CONFIG_PREEMPT_RT=n. 48640cce06baSPeter Zijlstra */ 48650cce06baSPeter Zijlstra if (unlikely(class->lock_type == LD_LOCK_WAIT_OVERRIDE)) 48660cce06baSPeter Zijlstra curr_inner = prev_inner; 4867de8f5e4fSPeter Zijlstra } 4868de8f5e4fSPeter Zijlstra } 4869de8f5e4fSPeter Zijlstra 4870de8f5e4fSPeter Zijlstra if (next_outer > curr_inner) 4871de8f5e4fSPeter Zijlstra return print_lock_invalid_wait_context(curr, next); 4872de8f5e4fSPeter Zijlstra 4873de8f5e4fSPeter Zijlstra return 0; 4874de8f5e4fSPeter Zijlstra } 4875de8f5e4fSPeter Zijlstra 487630a35f79SArnd Bergmann #else /* CONFIG_PROVE_LOCKING */ 4877886532aeSArnd Bergmann 4878886532aeSArnd Bergmann static inline int 4879886532aeSArnd Bergmann mark_usage(struct task_struct *curr, struct held_lock *hlock, int check) 4880886532aeSArnd Bergmann { 4881886532aeSArnd Bergmann return 1; 4882886532aeSArnd Bergmann } 4883886532aeSArnd Bergmann 4884886532aeSArnd Bergmann static inline unsigned int task_irq_context(struct task_struct *task) 4885886532aeSArnd Bergmann { 4886886532aeSArnd Bergmann return 0; 4887886532aeSArnd Bergmann } 4888886532aeSArnd Bergmann 4889886532aeSArnd Bergmann static inline int separate_irq_context(struct task_struct *curr, 4890886532aeSArnd Bergmann struct held_lock *hlock) 4891886532aeSArnd Bergmann { 4892886532aeSArnd Bergmann return 0; 4893886532aeSArnd Bergmann } 4894886532aeSArnd Bergmann 4895de8f5e4fSPeter Zijlstra static inline int check_wait_context(struct task_struct *curr, 4896de8f5e4fSPeter Zijlstra struct held_lock *next) 4897de8f5e4fSPeter Zijlstra { 4898de8f5e4fSPeter Zijlstra return 0; 4899de8f5e4fSPeter Zijlstra } 4900de8f5e4fSPeter Zijlstra 490130a35f79SArnd Bergmann #endif /* CONFIG_PROVE_LOCKING */ 4902886532aeSArnd Bergmann 49038eddac3fSPeter Zijlstra /* 49048eddac3fSPeter Zijlstra * Initialize a lock instance's lock-class mapping info: 49058eddac3fSPeter Zijlstra */ 4906dfd5e3f5SPeter Zijlstra void lockdep_init_map_type(struct lockdep_map *lock, const char *name, 4907de8f5e4fSPeter Zijlstra struct lock_class_key *key, int subclass, 4908dfd5e3f5SPeter Zijlstra u8 inner, u8 outer, u8 lock_type) 49098eddac3fSPeter Zijlstra { 49108eddac3fSPeter Zijlstra int i; 49118eddac3fSPeter Zijlstra 49128eddac3fSPeter Zijlstra for (i = 0; i < NR_LOCKDEP_CACHING_CLASSES; i++) 49138eddac3fSPeter Zijlstra lock->class_cache[i] = NULL; 49148eddac3fSPeter Zijlstra 49158eddac3fSPeter Zijlstra #ifdef CONFIG_LOCK_STAT 49168eddac3fSPeter Zijlstra lock->cpu = raw_smp_processor_id(); 49178eddac3fSPeter Zijlstra #endif 49188eddac3fSPeter Zijlstra 49198eddac3fSPeter Zijlstra /* 49208eddac3fSPeter Zijlstra * Can't be having no nameless bastards around this place! 49218eddac3fSPeter Zijlstra */ 49228eddac3fSPeter Zijlstra if (DEBUG_LOCKS_WARN_ON(!name)) { 49238eddac3fSPeter Zijlstra lock->name = "NULL"; 49248eddac3fSPeter Zijlstra return; 49258eddac3fSPeter Zijlstra } 49268eddac3fSPeter Zijlstra 49278eddac3fSPeter Zijlstra lock->name = name; 49288eddac3fSPeter Zijlstra 4929de8f5e4fSPeter Zijlstra lock->wait_type_outer = outer; 4930de8f5e4fSPeter Zijlstra lock->wait_type_inner = inner; 4931dfd5e3f5SPeter Zijlstra lock->lock_type = lock_type; 4932de8f5e4fSPeter Zijlstra 49338eddac3fSPeter Zijlstra /* 49348eddac3fSPeter Zijlstra * No key, no joy, we need to hash something. 49358eddac3fSPeter Zijlstra */ 49368eddac3fSPeter Zijlstra if (DEBUG_LOCKS_WARN_ON(!key)) 49378eddac3fSPeter Zijlstra return; 49388eddac3fSPeter Zijlstra /* 4939108c1485SBart Van Assche * Sanity check, the lock-class key must either have been allocated 4940108c1485SBart Van Assche * statically or must have been registered as a dynamic key. 49418eddac3fSPeter Zijlstra */ 4942108c1485SBart Van Assche if (!static_obj(key) && !is_dynamic_key(key)) { 4943108c1485SBart Van Assche if (debug_locks) 4944108c1485SBart Van Assche printk(KERN_ERR "BUG: key %px has not been registered!\n", key); 49458eddac3fSPeter Zijlstra DEBUG_LOCKS_WARN_ON(1); 49468eddac3fSPeter Zijlstra return; 49478eddac3fSPeter Zijlstra } 49488eddac3fSPeter Zijlstra lock->key = key; 49498eddac3fSPeter Zijlstra 49508eddac3fSPeter Zijlstra if (unlikely(!debug_locks)) 49518eddac3fSPeter Zijlstra return; 49528eddac3fSPeter Zijlstra 495335a9393cSPeter Zijlstra if (subclass) { 495435a9393cSPeter Zijlstra unsigned long flags; 495535a9393cSPeter Zijlstra 49564d004099SPeter Zijlstra if (DEBUG_LOCKS_WARN_ON(!lockdep_enabled())) 495735a9393cSPeter Zijlstra return; 495835a9393cSPeter Zijlstra 495935a9393cSPeter Zijlstra raw_local_irq_save(flags); 49604d004099SPeter Zijlstra lockdep_recursion_inc(); 49618eddac3fSPeter Zijlstra register_lock_class(lock, subclass, 1); 496210476e63SPeter Zijlstra lockdep_recursion_finish(); 496335a9393cSPeter Zijlstra raw_local_irq_restore(flags); 496435a9393cSPeter Zijlstra } 49658eddac3fSPeter Zijlstra } 4966dfd5e3f5SPeter Zijlstra EXPORT_SYMBOL_GPL(lockdep_init_map_type); 49678eddac3fSPeter Zijlstra 49688eddac3fSPeter Zijlstra struct lock_class_key __lockdep_no_validate__; 49698eddac3fSPeter Zijlstra EXPORT_SYMBOL_GPL(__lockdep_no_validate__); 49708eddac3fSPeter Zijlstra 49711a616c2fSKent Overstreet struct lock_class_key __lockdep_no_track__; 49721a616c2fSKent Overstreet EXPORT_SYMBOL_GPL(__lockdep_no_track__); 49731a616c2fSKent Overstreet 4974eb1cfd09SKent Overstreet #ifdef CONFIG_PROVE_LOCKING 4975eb1cfd09SKent Overstreet void lockdep_set_lock_cmp_fn(struct lockdep_map *lock, lock_cmp_fn cmp_fn, 4976eb1cfd09SKent Overstreet lock_print_fn print_fn) 4977eb1cfd09SKent Overstreet { 4978eb1cfd09SKent Overstreet struct lock_class *class = lock->class_cache[0]; 4979eb1cfd09SKent Overstreet unsigned long flags; 4980eb1cfd09SKent Overstreet 4981eb1cfd09SKent Overstreet raw_local_irq_save(flags); 4982eb1cfd09SKent Overstreet lockdep_recursion_inc(); 4983eb1cfd09SKent Overstreet 4984eb1cfd09SKent Overstreet if (!class) 4985eb1cfd09SKent Overstreet class = register_lock_class(lock, 0, 0); 4986eb1cfd09SKent Overstreet 4987eb1cfd09SKent Overstreet if (class) { 4988eb1cfd09SKent Overstreet WARN_ON(class->cmp_fn && class->cmp_fn != cmp_fn); 4989eb1cfd09SKent Overstreet WARN_ON(class->print_fn && class->print_fn != print_fn); 4990eb1cfd09SKent Overstreet 4991eb1cfd09SKent Overstreet class->cmp_fn = cmp_fn; 4992eb1cfd09SKent Overstreet class->print_fn = print_fn; 4993eb1cfd09SKent Overstreet } 4994eb1cfd09SKent Overstreet 4995eb1cfd09SKent Overstreet lockdep_recursion_finish(); 4996eb1cfd09SKent Overstreet raw_local_irq_restore(flags); 4997eb1cfd09SKent Overstreet } 4998eb1cfd09SKent Overstreet EXPORT_SYMBOL_GPL(lockdep_set_lock_cmp_fn); 4999eb1cfd09SKent Overstreet #endif 5000eb1cfd09SKent Overstreet 5001f7c1c6b3SYuyang Du static void 50028eddac3fSPeter Zijlstra print_lock_nested_lock_not_held(struct task_struct *curr, 50038b023accSNick Desaulniers struct held_lock *hlock) 50048eddac3fSPeter Zijlstra { 50058eddac3fSPeter Zijlstra if (!debug_locks_off()) 5006f7c1c6b3SYuyang Du return; 50078eddac3fSPeter Zijlstra if (debug_locks_silent) 5008f7c1c6b3SYuyang Du return; 50098eddac3fSPeter Zijlstra 5010*59cd94efSJohn Ogness nbcon_cpu_emergency_enter(); 5011*59cd94efSJohn Ogness 5012681fbec8SPaul E. McKenney pr_warn("\n"); 5013a5dd63efSPaul E. McKenney pr_warn("==================================\n"); 5014a5dd63efSPaul E. McKenney pr_warn("WARNING: Nested lock was not taken\n"); 50158eddac3fSPeter Zijlstra print_kernel_ident(); 5016a5dd63efSPaul E. McKenney pr_warn("----------------------------------\n"); 50178eddac3fSPeter Zijlstra 5018681fbec8SPaul E. McKenney pr_warn("%s/%d is trying to lock:\n", curr->comm, task_pid_nr(curr)); 50198eddac3fSPeter Zijlstra print_lock(hlock); 50208eddac3fSPeter Zijlstra 5021681fbec8SPaul E. McKenney pr_warn("\nbut this task is not holding:\n"); 5022681fbec8SPaul E. McKenney pr_warn("%s\n", hlock->nest_lock->name); 50238eddac3fSPeter Zijlstra 5024681fbec8SPaul E. McKenney pr_warn("\nstack backtrace:\n"); 50258eddac3fSPeter Zijlstra dump_stack(); 50268eddac3fSPeter Zijlstra 5027681fbec8SPaul E. McKenney pr_warn("\nother info that might help us debug this:\n"); 50288eddac3fSPeter Zijlstra lockdep_print_held_locks(curr); 50298eddac3fSPeter Zijlstra 5030681fbec8SPaul E. McKenney pr_warn("\nstack backtrace:\n"); 50318eddac3fSPeter Zijlstra dump_stack(); 5032*59cd94efSJohn Ogness 5033*59cd94efSJohn Ogness nbcon_cpu_emergency_exit(); 50348eddac3fSPeter Zijlstra } 50358eddac3fSPeter Zijlstra 503608f36ff6SMatthew Wilcox static int __lock_is_held(const struct lockdep_map *lock, int read); 50378eddac3fSPeter Zijlstra 50388eddac3fSPeter Zijlstra /* 50398eddac3fSPeter Zijlstra * This gets called for every mutex_lock*()/spin_lock*() operation. 50408eddac3fSPeter Zijlstra * We maintain the dependency maps and validate the locking attempt: 50418ee10862SWaiman Long * 50428ee10862SWaiman Long * The callers must make sure that IRQs are disabled before calling it, 50438ee10862SWaiman Long * otherwise we could get an interrupt which would want to take locks, 50448ee10862SWaiman Long * which would end up in lockdep again. 50458eddac3fSPeter Zijlstra */ 50468eddac3fSPeter Zijlstra static int __lock_acquire(struct lockdep_map *lock, unsigned int subclass, 50478eddac3fSPeter Zijlstra int trylock, int read, int check, int hardirqs_off, 50488eddac3fSPeter Zijlstra struct lockdep_map *nest_lock, unsigned long ip, 50490471db44SBoqun Feng int references, int pin_count, int sync) 50508eddac3fSPeter Zijlstra { 50518eddac3fSPeter Zijlstra struct task_struct *curr = current; 50528eddac3fSPeter Zijlstra struct lock_class *class = NULL; 50538eddac3fSPeter Zijlstra struct held_lock *hlock; 50545f18ab5cSAlfredo Alvarez Fernandez unsigned int depth; 50558eddac3fSPeter Zijlstra int chain_head = 0; 50568eddac3fSPeter Zijlstra int class_idx; 50578eddac3fSPeter Zijlstra u64 chain_key; 50588eddac3fSPeter Zijlstra 50598eddac3fSPeter Zijlstra if (unlikely(!debug_locks)) 50608eddac3fSPeter Zijlstra return 0; 50618eddac3fSPeter Zijlstra 50621a616c2fSKent Overstreet if (unlikely(lock->key == &__lockdep_no_track__)) 50631a616c2fSKent Overstreet return 0; 50641a616c2fSKent Overstreet 5065fb9edbe9SOleg Nesterov if (!prove_locking || lock->key == &__lockdep_no_validate__) 5066fb9edbe9SOleg Nesterov check = 0; 50678eddac3fSPeter Zijlstra 50688eddac3fSPeter Zijlstra if (subclass < NR_LOCKDEP_CACHING_CLASSES) 50698eddac3fSPeter Zijlstra class = lock->class_cache[subclass]; 50708eddac3fSPeter Zijlstra /* 50718eddac3fSPeter Zijlstra * Not cached? 50728eddac3fSPeter Zijlstra */ 50738eddac3fSPeter Zijlstra if (unlikely(!class)) { 50748eddac3fSPeter Zijlstra class = register_lock_class(lock, subclass, 0); 50758eddac3fSPeter Zijlstra if (!class) 50768eddac3fSPeter Zijlstra return 0; 50778eddac3fSPeter Zijlstra } 50788ca2b56cSWaiman Long 50798ca2b56cSWaiman Long debug_class_ops_inc(class); 50808ca2b56cSWaiman Long 50818eddac3fSPeter Zijlstra if (very_verbose(class)) { 5082*59cd94efSJohn Ogness nbcon_cpu_emergency_enter(); 508304860d48SBorislav Petkov printk("\nacquire class [%px] %s", class->key, class->name); 50848eddac3fSPeter Zijlstra if (class->name_version > 1) 5085f943fe0fSDmitry Vyukov printk(KERN_CONT "#%d", class->name_version); 5086f943fe0fSDmitry Vyukov printk(KERN_CONT "\n"); 50878eddac3fSPeter Zijlstra dump_stack(); 5088*59cd94efSJohn Ogness nbcon_cpu_emergency_exit(); 50898eddac3fSPeter Zijlstra } 50908eddac3fSPeter Zijlstra 50918eddac3fSPeter Zijlstra /* 50928eddac3fSPeter Zijlstra * Add the lock to the list of currently held locks. 50938eddac3fSPeter Zijlstra * (we dont increase the depth just yet, up until the 50948eddac3fSPeter Zijlstra * dependency checks are done) 50958eddac3fSPeter Zijlstra */ 50968eddac3fSPeter Zijlstra depth = curr->lockdep_depth; 50978eddac3fSPeter Zijlstra /* 50988eddac3fSPeter Zijlstra * Ran out of static storage for our per-task lock stack again have we? 50998eddac3fSPeter Zijlstra */ 51008eddac3fSPeter Zijlstra if (DEBUG_LOCKS_WARN_ON(depth >= MAX_LOCK_DEPTH)) 51018eddac3fSPeter Zijlstra return 0; 51028eddac3fSPeter Zijlstra 510301bb6f0aSYuyang Du class_idx = class - lock_classes; 51048eddac3fSPeter Zijlstra 51050471db44SBoqun Feng if (depth && !sync) { 51060471db44SBoqun Feng /* we're holding locks and the new held lock is not a sync */ 51078eddac3fSPeter Zijlstra hlock = curr->held_locks + depth - 1; 51088eddac3fSPeter Zijlstra if (hlock->class_idx == class_idx && nest_lock) { 5109d9349850SImre Deak if (!references) 5110d9349850SImre Deak references++; 51117fb4a2ceSPeter Zijlstra 5112d9349850SImre Deak if (!hlock->references) 51138eddac3fSPeter Zijlstra hlock->references++; 5114d9349850SImre Deak 5115d9349850SImre Deak hlock->references += references; 5116d9349850SImre Deak 5117d9349850SImre Deak /* Overflow */ 5118d9349850SImre Deak if (DEBUG_LOCKS_WARN_ON(hlock->references < references)) 5119d9349850SImre Deak return 0; 51208eddac3fSPeter Zijlstra 51218c8889d8SImre Deak return 2; 51228eddac3fSPeter Zijlstra } 51238eddac3fSPeter Zijlstra } 51248eddac3fSPeter Zijlstra 51258eddac3fSPeter Zijlstra hlock = curr->held_locks + depth; 51268eddac3fSPeter Zijlstra /* 51278eddac3fSPeter Zijlstra * Plain impossible, we just registered it and checked it weren't no 51288eddac3fSPeter Zijlstra * NULL like.. I bet this mushroom I ate was good! 51298eddac3fSPeter Zijlstra */ 51308eddac3fSPeter Zijlstra if (DEBUG_LOCKS_WARN_ON(!class)) 51318eddac3fSPeter Zijlstra return 0; 51328eddac3fSPeter Zijlstra hlock->class_idx = class_idx; 51338eddac3fSPeter Zijlstra hlock->acquire_ip = ip; 51348eddac3fSPeter Zijlstra hlock->instance = lock; 51358eddac3fSPeter Zijlstra hlock->nest_lock = nest_lock; 5136c2469756SBoqun Feng hlock->irq_context = task_irq_context(curr); 51378eddac3fSPeter Zijlstra hlock->trylock = trylock; 51388eddac3fSPeter Zijlstra hlock->read = read; 51398eddac3fSPeter Zijlstra hlock->check = check; 51400471db44SBoqun Feng hlock->sync = !!sync; 51418eddac3fSPeter Zijlstra hlock->hardirqs_off = !!hardirqs_off; 51428eddac3fSPeter Zijlstra hlock->references = references; 51438eddac3fSPeter Zijlstra #ifdef CONFIG_LOCK_STAT 51448eddac3fSPeter Zijlstra hlock->waittime_stamp = 0; 51458eddac3fSPeter Zijlstra hlock->holdtime_stamp = lockstat_clock(); 51468eddac3fSPeter Zijlstra #endif 514721199f27SPeter Zijlstra hlock->pin_count = pin_count; 51488eddac3fSPeter Zijlstra 5149de8f5e4fSPeter Zijlstra if (check_wait_context(curr, hlock)) 5150de8f5e4fSPeter Zijlstra return 0; 5151de8f5e4fSPeter Zijlstra 515209180651SYuyang Du /* Initialize the lock usage bit */ 515309180651SYuyang Du if (!mark_usage(curr, hlock, check)) 51548eddac3fSPeter Zijlstra return 0; 51558eddac3fSPeter Zijlstra 51568eddac3fSPeter Zijlstra /* 51578eddac3fSPeter Zijlstra * Calculate the chain hash: it's the combined hash of all the 51588eddac3fSPeter Zijlstra * lock keys along the dependency chain. We save the hash value 51598eddac3fSPeter Zijlstra * at every step so that we can get the current hash easily 51608eddac3fSPeter Zijlstra * after unlock. The chain hash is then used to cache dependency 51618eddac3fSPeter Zijlstra * results. 51628eddac3fSPeter Zijlstra * 51638eddac3fSPeter Zijlstra * The 'key ID' is what is the most compact key value to drive 51648eddac3fSPeter Zijlstra * the hash, not class->key. 51658eddac3fSPeter Zijlstra */ 51668eddac3fSPeter Zijlstra /* 516701bb6f0aSYuyang Du * Whoops, we did it again.. class_idx is invalid. 51688eddac3fSPeter Zijlstra */ 516901bb6f0aSYuyang Du if (DEBUG_LOCKS_WARN_ON(!test_bit(class_idx, lock_classes_in_use))) 51708eddac3fSPeter Zijlstra return 0; 51718eddac3fSPeter Zijlstra 51728eddac3fSPeter Zijlstra chain_key = curr->curr_chain_key; 51738eddac3fSPeter Zijlstra if (!depth) { 51748eddac3fSPeter Zijlstra /* 51758eddac3fSPeter Zijlstra * How can we have a chain hash when we ain't got no keys?! 51768eddac3fSPeter Zijlstra */ 5177f6ec8829SYuyang Du if (DEBUG_LOCKS_WARN_ON(chain_key != INITIAL_CHAIN_KEY)) 51788eddac3fSPeter Zijlstra return 0; 51798eddac3fSPeter Zijlstra chain_head = 1; 51808eddac3fSPeter Zijlstra } 51818eddac3fSPeter Zijlstra 51828eddac3fSPeter Zijlstra hlock->prev_chain_key = chain_key; 51838eddac3fSPeter Zijlstra if (separate_irq_context(curr, hlock)) { 5184f6ec8829SYuyang Du chain_key = INITIAL_CHAIN_KEY; 51858eddac3fSPeter Zijlstra chain_head = 1; 51868eddac3fSPeter Zijlstra } 5187f611e8cfSBoqun Feng chain_key = iterate_chain_key(chain_key, hlock_id(hlock)); 51888eddac3fSPeter Zijlstra 5189f7c1c6b3SYuyang Du if (nest_lock && !__lock_is_held(nest_lock, -1)) { 51908b023accSNick Desaulniers print_lock_nested_lock_not_held(curr, hlock); 5191f7c1c6b3SYuyang Du return 0; 5192f7c1c6b3SYuyang Du } 51938eddac3fSPeter Zijlstra 5194a0b0fd53SBart Van Assche if (!debug_locks_silent) { 5195a0b0fd53SBart Van Assche WARN_ON_ONCE(depth && !hlock_class(hlock - 1)->key); 5196a0b0fd53SBart Van Assche WARN_ON_ONCE(!hlock_class(hlock)->key); 5197a0b0fd53SBart Van Assche } 5198a0b0fd53SBart Van Assche 51990b9fc8ecSYuyang Du if (!validate_chain(curr, hlock, chain_head, chain_key)) 52008eddac3fSPeter Zijlstra return 0; 52018eddac3fSPeter Zijlstra 52020471db44SBoqun Feng /* For lock_sync(), we are done here since no actual critical section */ 52030471db44SBoqun Feng if (hlock->sync) 52040471db44SBoqun Feng return 1; 52050471db44SBoqun Feng 52068eddac3fSPeter Zijlstra curr->curr_chain_key = chain_key; 52078eddac3fSPeter Zijlstra curr->lockdep_depth++; 52088eddac3fSPeter Zijlstra check_chain_key(curr); 52098eddac3fSPeter Zijlstra #ifdef CONFIG_DEBUG_LOCKDEP 52108eddac3fSPeter Zijlstra if (unlikely(!debug_locks)) 52118eddac3fSPeter Zijlstra return 0; 52128eddac3fSPeter Zijlstra #endif 52138eddac3fSPeter Zijlstra if (unlikely(curr->lockdep_depth >= MAX_LOCK_DEPTH)) { 52148eddac3fSPeter Zijlstra debug_locks_off(); 5215*59cd94efSJohn Ogness nbcon_cpu_emergency_enter(); 52168eddac3fSPeter Zijlstra print_lockdep_off("BUG: MAX_LOCK_DEPTH too low!"); 52178eddac3fSPeter Zijlstra printk(KERN_DEBUG "depth: %i max: %lu!\n", 52188eddac3fSPeter Zijlstra curr->lockdep_depth, MAX_LOCK_DEPTH); 52198eddac3fSPeter Zijlstra 52208eddac3fSPeter Zijlstra lockdep_print_held_locks(current); 52218eddac3fSPeter Zijlstra debug_show_all_locks(); 52228eddac3fSPeter Zijlstra dump_stack(); 5223*59cd94efSJohn Ogness nbcon_cpu_emergency_exit(); 52248eddac3fSPeter Zijlstra 52258eddac3fSPeter Zijlstra return 0; 52268eddac3fSPeter Zijlstra } 52278eddac3fSPeter Zijlstra 52288eddac3fSPeter Zijlstra if (unlikely(curr->lockdep_depth > max_lockdep_depth)) 52298eddac3fSPeter Zijlstra max_lockdep_depth = curr->lockdep_depth; 52308eddac3fSPeter Zijlstra 52318eddac3fSPeter Zijlstra return 1; 52328eddac3fSPeter Zijlstra } 52338eddac3fSPeter Zijlstra 5234f7c1c6b3SYuyang Du static void print_unlock_imbalance_bug(struct task_struct *curr, 5235f7c1c6b3SYuyang Du struct lockdep_map *lock, 52368eddac3fSPeter Zijlstra unsigned long ip) 52378eddac3fSPeter Zijlstra { 52388eddac3fSPeter Zijlstra if (!debug_locks_off()) 5239f7c1c6b3SYuyang Du return; 52408eddac3fSPeter Zijlstra if (debug_locks_silent) 5241f7c1c6b3SYuyang Du return; 52428eddac3fSPeter Zijlstra 5243*59cd94efSJohn Ogness nbcon_cpu_emergency_enter(); 5244*59cd94efSJohn Ogness 5245681fbec8SPaul E. McKenney pr_warn("\n"); 5246a5dd63efSPaul E. McKenney pr_warn("=====================================\n"); 5247a5dd63efSPaul E. McKenney pr_warn("WARNING: bad unlock balance detected!\n"); 52488eddac3fSPeter Zijlstra print_kernel_ident(); 5249a5dd63efSPaul E. McKenney pr_warn("-------------------------------------\n"); 5250681fbec8SPaul E. McKenney pr_warn("%s/%d is trying to release lock (", 52518eddac3fSPeter Zijlstra curr->comm, task_pid_nr(curr)); 52528eddac3fSPeter Zijlstra print_lockdep_cache(lock); 5253681fbec8SPaul E. McKenney pr_cont(") at:\n"); 52542062a4e8SDmitry Safonov print_ip_sym(KERN_WARNING, ip); 5255681fbec8SPaul E. McKenney pr_warn("but there are no more locks to release!\n"); 5256681fbec8SPaul E. McKenney pr_warn("\nother info that might help us debug this:\n"); 52578eddac3fSPeter Zijlstra lockdep_print_held_locks(curr); 52588eddac3fSPeter Zijlstra 5259681fbec8SPaul E. McKenney pr_warn("\nstack backtrace:\n"); 52608eddac3fSPeter Zijlstra dump_stack(); 5261*59cd94efSJohn Ogness 5262*59cd94efSJohn Ogness nbcon_cpu_emergency_exit(); 52638eddac3fSPeter Zijlstra } 52648eddac3fSPeter Zijlstra 5265c86e9b98SPeter Zijlstra static noinstr int match_held_lock(const struct held_lock *hlock, 526608f36ff6SMatthew Wilcox const struct lockdep_map *lock) 52678eddac3fSPeter Zijlstra { 52688eddac3fSPeter Zijlstra if (hlock->instance == lock) 52698eddac3fSPeter Zijlstra return 1; 52708eddac3fSPeter Zijlstra 52718eddac3fSPeter Zijlstra if (hlock->references) { 527208f36ff6SMatthew Wilcox const struct lock_class *class = lock->class_cache[0]; 52738eddac3fSPeter Zijlstra 52748eddac3fSPeter Zijlstra if (!class) 52758eddac3fSPeter Zijlstra class = look_up_lock_class(lock, 0); 52768eddac3fSPeter Zijlstra 52778eddac3fSPeter Zijlstra /* 52788eddac3fSPeter Zijlstra * If look_up_lock_class() failed to find a class, we're trying 52798eddac3fSPeter Zijlstra * to test if we hold a lock that has never yet been acquired. 52808eddac3fSPeter Zijlstra * Clearly if the lock hasn't been acquired _ever_, we're not 52818eddac3fSPeter Zijlstra * holding it either, so report failure. 52828eddac3fSPeter Zijlstra */ 528364f29d1bSMatthew Wilcox if (!class) 52848eddac3fSPeter Zijlstra return 0; 52858eddac3fSPeter Zijlstra 52868eddac3fSPeter Zijlstra /* 52878eddac3fSPeter Zijlstra * References, but not a lock we're actually ref-counting? 52888eddac3fSPeter Zijlstra * State got messed up, follow the sites that change ->references 52898eddac3fSPeter Zijlstra * and try to make sense of it. 52908eddac3fSPeter Zijlstra */ 52918eddac3fSPeter Zijlstra if (DEBUG_LOCKS_WARN_ON(!hlock->nest_lock)) 52928eddac3fSPeter Zijlstra return 0; 52938eddac3fSPeter Zijlstra 529401bb6f0aSYuyang Du if (hlock->class_idx == class - lock_classes) 52958eddac3fSPeter Zijlstra return 1; 52968eddac3fSPeter Zijlstra } 52978eddac3fSPeter Zijlstra 52988eddac3fSPeter Zijlstra return 0; 52998eddac3fSPeter Zijlstra } 53008eddac3fSPeter Zijlstra 530141c2c5b8SJ. R. Okajima /* @depth must not be zero */ 530241c2c5b8SJ. R. Okajima static struct held_lock *find_held_lock(struct task_struct *curr, 530341c2c5b8SJ. R. Okajima struct lockdep_map *lock, 530441c2c5b8SJ. R. Okajima unsigned int depth, int *idx) 530541c2c5b8SJ. R. Okajima { 530641c2c5b8SJ. R. Okajima struct held_lock *ret, *hlock, *prev_hlock; 530741c2c5b8SJ. R. Okajima int i; 530841c2c5b8SJ. R. Okajima 530941c2c5b8SJ. R. Okajima i = depth - 1; 531041c2c5b8SJ. R. Okajima hlock = curr->held_locks + i; 531141c2c5b8SJ. R. Okajima ret = hlock; 531241c2c5b8SJ. R. Okajima if (match_held_lock(hlock, lock)) 531341c2c5b8SJ. R. Okajima goto out; 531441c2c5b8SJ. R. Okajima 531541c2c5b8SJ. R. Okajima ret = NULL; 531641c2c5b8SJ. R. Okajima for (i--, prev_hlock = hlock--; 531741c2c5b8SJ. R. Okajima i >= 0; 531841c2c5b8SJ. R. Okajima i--, prev_hlock = hlock--) { 531941c2c5b8SJ. R. Okajima /* 532041c2c5b8SJ. R. Okajima * We must not cross into another context: 532141c2c5b8SJ. R. Okajima */ 532241c2c5b8SJ. R. Okajima if (prev_hlock->irq_context != hlock->irq_context) { 532341c2c5b8SJ. R. Okajima ret = NULL; 532441c2c5b8SJ. R. Okajima break; 532541c2c5b8SJ. R. Okajima } 532641c2c5b8SJ. R. Okajima if (match_held_lock(hlock, lock)) { 532741c2c5b8SJ. R. Okajima ret = hlock; 532841c2c5b8SJ. R. Okajima break; 532941c2c5b8SJ. R. Okajima } 533041c2c5b8SJ. R. Okajima } 533141c2c5b8SJ. R. Okajima 533241c2c5b8SJ. R. Okajima out: 533341c2c5b8SJ. R. Okajima *idx = i; 533441c2c5b8SJ. R. Okajima return ret; 533541c2c5b8SJ. R. Okajima } 533641c2c5b8SJ. R. Okajima 5337e969970bSJ. R. Okajima static int reacquire_held_locks(struct task_struct *curr, unsigned int depth, 53388c8889d8SImre Deak int idx, unsigned int *merged) 5339e969970bSJ. R. Okajima { 5340e969970bSJ. R. Okajima struct held_lock *hlock; 53418c8889d8SImre Deak int first_idx = idx; 5342e969970bSJ. R. Okajima 53438ee10862SWaiman Long if (DEBUG_LOCKS_WARN_ON(!irqs_disabled())) 53448ee10862SWaiman Long return 0; 53458ee10862SWaiman Long 5346e969970bSJ. R. Okajima for (hlock = curr->held_locks + idx; idx < depth; idx++, hlock++) { 53478c8889d8SImre Deak switch (__lock_acquire(hlock->instance, 5348e969970bSJ. R. Okajima hlock_class(hlock)->subclass, 5349e969970bSJ. R. Okajima hlock->trylock, 5350e969970bSJ. R. Okajima hlock->read, hlock->check, 5351e969970bSJ. R. Okajima hlock->hardirqs_off, 5352e969970bSJ. R. Okajima hlock->nest_lock, hlock->acquire_ip, 53530471db44SBoqun Feng hlock->references, hlock->pin_count, 0)) { 53548c8889d8SImre Deak case 0: 5355e969970bSJ. R. Okajima return 1; 53568c8889d8SImre Deak case 1: 53578c8889d8SImre Deak break; 53588c8889d8SImre Deak case 2: 53598c8889d8SImre Deak *merged += (idx == first_idx); 53608c8889d8SImre Deak break; 53618c8889d8SImre Deak default: 53628c8889d8SImre Deak WARN_ON(1); 53638c8889d8SImre Deak return 0; 53648c8889d8SImre Deak } 5365e969970bSJ. R. Okajima } 5366e969970bSJ. R. Okajima return 0; 5367e969970bSJ. R. Okajima } 5368e969970bSJ. R. Okajima 53698eddac3fSPeter Zijlstra static int 53708eddac3fSPeter Zijlstra __lock_set_class(struct lockdep_map *lock, const char *name, 53718eddac3fSPeter Zijlstra struct lock_class_key *key, unsigned int subclass, 53728eddac3fSPeter Zijlstra unsigned long ip) 53738eddac3fSPeter Zijlstra { 53748eddac3fSPeter Zijlstra struct task_struct *curr = current; 53758c8889d8SImre Deak unsigned int depth, merged = 0; 537641c2c5b8SJ. R. Okajima struct held_lock *hlock; 53778eddac3fSPeter Zijlstra struct lock_class *class; 53788eddac3fSPeter Zijlstra int i; 53798eddac3fSPeter Zijlstra 5380513e1073SWaiman Long if (unlikely(!debug_locks)) 5381513e1073SWaiman Long return 0; 5382513e1073SWaiman Long 53838eddac3fSPeter Zijlstra depth = curr->lockdep_depth; 53848eddac3fSPeter Zijlstra /* 53858eddac3fSPeter Zijlstra * This function is about (re)setting the class of a held lock, 53868eddac3fSPeter Zijlstra * yet we're not actually holding any locks. Naughty user! 53878eddac3fSPeter Zijlstra */ 53888eddac3fSPeter Zijlstra if (DEBUG_LOCKS_WARN_ON(!depth)) 53898eddac3fSPeter Zijlstra return 0; 53908eddac3fSPeter Zijlstra 539141c2c5b8SJ. R. Okajima hlock = find_held_lock(curr, lock, depth, &i); 5392f7c1c6b3SYuyang Du if (!hlock) { 5393f7c1c6b3SYuyang Du print_unlock_imbalance_bug(curr, lock, ip); 5394f7c1c6b3SYuyang Du return 0; 5395f7c1c6b3SYuyang Du } 53968eddac3fSPeter Zijlstra 5397eae6d58dSPeter Zijlstra lockdep_init_map_type(lock, name, key, 0, 5398de8f5e4fSPeter Zijlstra lock->wait_type_inner, 5399eae6d58dSPeter Zijlstra lock->wait_type_outer, 5400eae6d58dSPeter Zijlstra lock->lock_type); 54018eddac3fSPeter Zijlstra class = register_lock_class(lock, subclass, 0); 540201bb6f0aSYuyang Du hlock->class_idx = class - lock_classes; 54038eddac3fSPeter Zijlstra 54048eddac3fSPeter Zijlstra curr->lockdep_depth = i; 54058eddac3fSPeter Zijlstra curr->curr_chain_key = hlock->prev_chain_key; 54068eddac3fSPeter Zijlstra 54078c8889d8SImre Deak if (reacquire_held_locks(curr, depth, i, &merged)) 54088eddac3fSPeter Zijlstra return 0; 54098eddac3fSPeter Zijlstra 54108eddac3fSPeter Zijlstra /* 54118eddac3fSPeter Zijlstra * I took it apart and put it back together again, except now I have 54128eddac3fSPeter Zijlstra * these 'spare' parts.. where shall I put them. 54138eddac3fSPeter Zijlstra */ 54148c8889d8SImre Deak if (DEBUG_LOCKS_WARN_ON(curr->lockdep_depth != depth - merged)) 54158eddac3fSPeter Zijlstra return 0; 54168eddac3fSPeter Zijlstra return 1; 54178eddac3fSPeter Zijlstra } 54188eddac3fSPeter Zijlstra 54196419c4afSJ. R. Okajima static int __lock_downgrade(struct lockdep_map *lock, unsigned long ip) 54206419c4afSJ. R. Okajima { 54216419c4afSJ. R. Okajima struct task_struct *curr = current; 54228c8889d8SImre Deak unsigned int depth, merged = 0; 54236419c4afSJ. R. Okajima struct held_lock *hlock; 54246419c4afSJ. R. Okajima int i; 54256419c4afSJ. R. Okajima 542671492580SWaiman Long if (unlikely(!debug_locks)) 542771492580SWaiman Long return 0; 542871492580SWaiman Long 54296419c4afSJ. R. Okajima depth = curr->lockdep_depth; 54306419c4afSJ. R. Okajima /* 54316419c4afSJ. R. Okajima * This function is about (re)setting the class of a held lock, 54326419c4afSJ. R. Okajima * yet we're not actually holding any locks. Naughty user! 54336419c4afSJ. R. Okajima */ 54346419c4afSJ. R. Okajima if (DEBUG_LOCKS_WARN_ON(!depth)) 54356419c4afSJ. R. Okajima return 0; 54366419c4afSJ. R. Okajima 54376419c4afSJ. R. Okajima hlock = find_held_lock(curr, lock, depth, &i); 5438f7c1c6b3SYuyang Du if (!hlock) { 5439f7c1c6b3SYuyang Du print_unlock_imbalance_bug(curr, lock, ip); 5440f7c1c6b3SYuyang Du return 0; 5441f7c1c6b3SYuyang Du } 54426419c4afSJ. R. Okajima 54436419c4afSJ. R. Okajima curr->lockdep_depth = i; 54446419c4afSJ. R. Okajima curr->curr_chain_key = hlock->prev_chain_key; 54456419c4afSJ. R. Okajima 54466419c4afSJ. R. Okajima WARN(hlock->read, "downgrading a read lock"); 54476419c4afSJ. R. Okajima hlock->read = 1; 54486419c4afSJ. R. Okajima hlock->acquire_ip = ip; 54496419c4afSJ. R. Okajima 54508c8889d8SImre Deak if (reacquire_held_locks(curr, depth, i, &merged)) 54518c8889d8SImre Deak return 0; 54528c8889d8SImre Deak 54538c8889d8SImre Deak /* Merging can't happen with unchanged classes.. */ 54548c8889d8SImre Deak if (DEBUG_LOCKS_WARN_ON(merged)) 54556419c4afSJ. R. Okajima return 0; 54566419c4afSJ. R. Okajima 54576419c4afSJ. R. Okajima /* 54586419c4afSJ. R. Okajima * I took it apart and put it back together again, except now I have 54596419c4afSJ. R. Okajima * these 'spare' parts.. where shall I put them. 54606419c4afSJ. R. Okajima */ 54616419c4afSJ. R. Okajima if (DEBUG_LOCKS_WARN_ON(curr->lockdep_depth != depth)) 54626419c4afSJ. R. Okajima return 0; 54638c8889d8SImre Deak 54646419c4afSJ. R. Okajima return 1; 54656419c4afSJ. R. Okajima } 54666419c4afSJ. R. Okajima 54678eddac3fSPeter Zijlstra /* 5468c759bc47SDan Carpenter * Remove the lock from the list of currently held locks - this gets 5469e0f56fd7SPeter Zijlstra * called on mutex_unlock()/spin_unlock*() (or on a failed 5470e0f56fd7SPeter Zijlstra * mutex_lock_interruptible()). 54718eddac3fSPeter Zijlstra */ 54728eddac3fSPeter Zijlstra static int 5473b4adfe8eSYuyang Du __lock_release(struct lockdep_map *lock, unsigned long ip) 54748eddac3fSPeter Zijlstra { 5475e0f56fd7SPeter Zijlstra struct task_struct *curr = current; 54768c8889d8SImre Deak unsigned int depth, merged = 1; 547741c2c5b8SJ. R. Okajima struct held_lock *hlock; 5478e966eaeeSIngo Molnar int i; 54798eddac3fSPeter Zijlstra 5480e0f56fd7SPeter Zijlstra if (unlikely(!debug_locks)) 5481e0f56fd7SPeter Zijlstra return 0; 5482e0f56fd7SPeter Zijlstra 54838eddac3fSPeter Zijlstra depth = curr->lockdep_depth; 54848eddac3fSPeter Zijlstra /* 54858eddac3fSPeter Zijlstra * So we're all set to release this lock.. wait what lock? We don't 54868eddac3fSPeter Zijlstra * own any locks, you've been drinking again? 54878eddac3fSPeter Zijlstra */ 5488dd471efeSKobe Wu if (depth <= 0) { 5489f7c1c6b3SYuyang Du print_unlock_imbalance_bug(curr, lock, ip); 5490f7c1c6b3SYuyang Du return 0; 5491f7c1c6b3SYuyang Du } 54928eddac3fSPeter Zijlstra 5493e0f56fd7SPeter Zijlstra /* 5494e0f56fd7SPeter Zijlstra * Check whether the lock exists in the current stack 5495e0f56fd7SPeter Zijlstra * of held locks: 5496e0f56fd7SPeter Zijlstra */ 549741c2c5b8SJ. R. Okajima hlock = find_held_lock(curr, lock, depth, &i); 5498f7c1c6b3SYuyang Du if (!hlock) { 5499f7c1c6b3SYuyang Du print_unlock_imbalance_bug(curr, lock, ip); 5500f7c1c6b3SYuyang Du return 0; 5501f7c1c6b3SYuyang Du } 55028eddac3fSPeter Zijlstra 55038eddac3fSPeter Zijlstra if (hlock->instance == lock) 55048eddac3fSPeter Zijlstra lock_release_holdtime(hlock); 55058eddac3fSPeter Zijlstra 5506a24fc60dSPeter Zijlstra WARN(hlock->pin_count, "releasing a pinned lock\n"); 5507a24fc60dSPeter Zijlstra 55088eddac3fSPeter Zijlstra if (hlock->references) { 55098eddac3fSPeter Zijlstra hlock->references--; 55108eddac3fSPeter Zijlstra if (hlock->references) { 55118eddac3fSPeter Zijlstra /* 55128eddac3fSPeter Zijlstra * We had, and after removing one, still have 55138eddac3fSPeter Zijlstra * references, the current lock stack is still 55148eddac3fSPeter Zijlstra * valid. We're done! 55158eddac3fSPeter Zijlstra */ 55168eddac3fSPeter Zijlstra return 1; 55178eddac3fSPeter Zijlstra } 55188eddac3fSPeter Zijlstra } 55198eddac3fSPeter Zijlstra 55208eddac3fSPeter Zijlstra /* 55218eddac3fSPeter Zijlstra * We have the right lock to unlock, 'hlock' points to it. 55228eddac3fSPeter Zijlstra * Now we remove it from the stack, and add back the other 55238eddac3fSPeter Zijlstra * entries (if any), recalculating the hash along the way: 55248eddac3fSPeter Zijlstra */ 55258eddac3fSPeter Zijlstra 55268eddac3fSPeter Zijlstra curr->lockdep_depth = i; 55278eddac3fSPeter Zijlstra curr->curr_chain_key = hlock->prev_chain_key; 55288eddac3fSPeter Zijlstra 5529ce52a18dSWaiman Long /* 5530ce52a18dSWaiman Long * The most likely case is when the unlock is on the innermost 5531ce52a18dSWaiman Long * lock. In this case, we are done! 5532ce52a18dSWaiman Long */ 5533ce52a18dSWaiman Long if (i == depth-1) 5534ce52a18dSWaiman Long return 1; 5535ce52a18dSWaiman Long 55368c8889d8SImre Deak if (reacquire_held_locks(curr, depth, i + 1, &merged)) 55378eddac3fSPeter Zijlstra return 0; 55388eddac3fSPeter Zijlstra 55398eddac3fSPeter Zijlstra /* 55408eddac3fSPeter Zijlstra * We had N bottles of beer on the wall, we drank one, but now 55418eddac3fSPeter Zijlstra * there's not N-1 bottles of beer left on the wall... 55428c8889d8SImre Deak * Pouring two of the bottles together is acceptable. 55438eddac3fSPeter Zijlstra */ 55448c8889d8SImre Deak DEBUG_LOCKS_WARN_ON(curr->lockdep_depth != depth - merged); 5545e0f56fd7SPeter Zijlstra 5546ce52a18dSWaiman Long /* 5547ce52a18dSWaiman Long * Since reacquire_held_locks() would have called check_chain_key() 5548ce52a18dSWaiman Long * indirectly via __lock_acquire(), we don't need to do it again 5549ce52a18dSWaiman Long * on return. 5550ce52a18dSWaiman Long */ 5551ce52a18dSWaiman Long return 0; 55528eddac3fSPeter Zijlstra } 55538eddac3fSPeter Zijlstra 5554c86e9b98SPeter Zijlstra static __always_inline 55552f43c602SMasami Hiramatsu int __lock_is_held(const struct lockdep_map *lock, int read) 55568eddac3fSPeter Zijlstra { 55578eddac3fSPeter Zijlstra struct task_struct *curr = current; 55588eddac3fSPeter Zijlstra int i; 55598eddac3fSPeter Zijlstra 55608eddac3fSPeter Zijlstra for (i = 0; i < curr->lockdep_depth; i++) { 55618eddac3fSPeter Zijlstra struct held_lock *hlock = curr->held_locks + i; 55628eddac3fSPeter Zijlstra 5563f8319483SPeter Zijlstra if (match_held_lock(hlock, lock)) { 55642507003aSSebastian Andrzej Siewior if (read == -1 || !!hlock->read == read) 5565f8cfa466SShuah Khan return LOCK_STATE_HELD; 5566f8319483SPeter Zijlstra 5567f8cfa466SShuah Khan return LOCK_STATE_NOT_HELD; 5568f8319483SPeter Zijlstra } 55698eddac3fSPeter Zijlstra } 55708eddac3fSPeter Zijlstra 5571f8cfa466SShuah Khan return LOCK_STATE_NOT_HELD; 55728eddac3fSPeter Zijlstra } 55738eddac3fSPeter Zijlstra 5574e7904a28SPeter Zijlstra static struct pin_cookie __lock_pin_lock(struct lockdep_map *lock) 5575e7904a28SPeter Zijlstra { 5576e7904a28SPeter Zijlstra struct pin_cookie cookie = NIL_COOKIE; 5577e7904a28SPeter Zijlstra struct task_struct *curr = current; 5578e7904a28SPeter Zijlstra int i; 5579e7904a28SPeter Zijlstra 5580e7904a28SPeter Zijlstra if (unlikely(!debug_locks)) 5581e7904a28SPeter Zijlstra return cookie; 5582e7904a28SPeter Zijlstra 5583e7904a28SPeter Zijlstra for (i = 0; i < curr->lockdep_depth; i++) { 5584e7904a28SPeter Zijlstra struct held_lock *hlock = curr->held_locks + i; 5585e7904a28SPeter Zijlstra 5586e7904a28SPeter Zijlstra if (match_held_lock(hlock, lock)) { 5587e7904a28SPeter Zijlstra /* 5588e7904a28SPeter Zijlstra * Grab 16bits of randomness; this is sufficient to not 5589e7904a28SPeter Zijlstra * be guessable and still allows some pin nesting in 5590e7904a28SPeter Zijlstra * our u32 pin_count. 5591e7904a28SPeter Zijlstra */ 55924051a817SSebastian Andrzej Siewior cookie.val = 1 + (sched_clock() & 0xffff); 5593e7904a28SPeter Zijlstra hlock->pin_count += cookie.val; 5594e7904a28SPeter Zijlstra return cookie; 5595e7904a28SPeter Zijlstra } 5596e7904a28SPeter Zijlstra } 5597e7904a28SPeter Zijlstra 5598e7904a28SPeter Zijlstra WARN(1, "pinning an unheld lock\n"); 5599e7904a28SPeter Zijlstra return cookie; 5600e7904a28SPeter Zijlstra } 5601e7904a28SPeter Zijlstra 5602e7904a28SPeter Zijlstra static void __lock_repin_lock(struct lockdep_map *lock, struct pin_cookie cookie) 5603a24fc60dSPeter Zijlstra { 5604a24fc60dSPeter Zijlstra struct task_struct *curr = current; 5605a24fc60dSPeter Zijlstra int i; 5606a24fc60dSPeter Zijlstra 5607a24fc60dSPeter Zijlstra if (unlikely(!debug_locks)) 5608a24fc60dSPeter Zijlstra return; 5609a24fc60dSPeter Zijlstra 5610a24fc60dSPeter Zijlstra for (i = 0; i < curr->lockdep_depth; i++) { 5611a24fc60dSPeter Zijlstra struct held_lock *hlock = curr->held_locks + i; 5612a24fc60dSPeter Zijlstra 5613a24fc60dSPeter Zijlstra if (match_held_lock(hlock, lock)) { 5614e7904a28SPeter Zijlstra hlock->pin_count += cookie.val; 5615a24fc60dSPeter Zijlstra return; 5616a24fc60dSPeter Zijlstra } 5617a24fc60dSPeter Zijlstra } 5618a24fc60dSPeter Zijlstra 5619a24fc60dSPeter Zijlstra WARN(1, "pinning an unheld lock\n"); 5620a24fc60dSPeter Zijlstra } 5621a24fc60dSPeter Zijlstra 5622e7904a28SPeter Zijlstra static void __lock_unpin_lock(struct lockdep_map *lock, struct pin_cookie cookie) 5623a24fc60dSPeter Zijlstra { 5624a24fc60dSPeter Zijlstra struct task_struct *curr = current; 5625a24fc60dSPeter Zijlstra int i; 5626a24fc60dSPeter Zijlstra 5627a24fc60dSPeter Zijlstra if (unlikely(!debug_locks)) 5628a24fc60dSPeter Zijlstra return; 5629a24fc60dSPeter Zijlstra 5630a24fc60dSPeter Zijlstra for (i = 0; i < curr->lockdep_depth; i++) { 5631a24fc60dSPeter Zijlstra struct held_lock *hlock = curr->held_locks + i; 5632a24fc60dSPeter Zijlstra 5633a24fc60dSPeter Zijlstra if (match_held_lock(hlock, lock)) { 5634a24fc60dSPeter Zijlstra if (WARN(!hlock->pin_count, "unpinning an unpinned lock\n")) 5635a24fc60dSPeter Zijlstra return; 5636a24fc60dSPeter Zijlstra 5637e7904a28SPeter Zijlstra hlock->pin_count -= cookie.val; 5638e7904a28SPeter Zijlstra 5639e7904a28SPeter Zijlstra if (WARN((int)hlock->pin_count < 0, "pin count corrupted\n")) 5640e7904a28SPeter Zijlstra hlock->pin_count = 0; 5641e7904a28SPeter Zijlstra 5642a24fc60dSPeter Zijlstra return; 5643a24fc60dSPeter Zijlstra } 5644a24fc60dSPeter Zijlstra } 5645a24fc60dSPeter Zijlstra 5646a24fc60dSPeter Zijlstra WARN(1, "unpinning an unheld lock\n"); 5647a24fc60dSPeter Zijlstra } 5648a24fc60dSPeter Zijlstra 56498eddac3fSPeter Zijlstra /* 56508eddac3fSPeter Zijlstra * Check whether we follow the irq-flags state precisely: 56518eddac3fSPeter Zijlstra */ 565277ca93a6SPeter Zijlstra static noinstr void check_flags(unsigned long flags) 56538eddac3fSPeter Zijlstra { 565430a35f79SArnd Bergmann #if defined(CONFIG_PROVE_LOCKING) && defined(CONFIG_DEBUG_LOCKDEP) 56558eddac3fSPeter Zijlstra if (!debug_locks) 56568eddac3fSPeter Zijlstra return; 56578eddac3fSPeter Zijlstra 565877ca93a6SPeter Zijlstra /* Get the warning out.. */ 565977ca93a6SPeter Zijlstra instrumentation_begin(); 566077ca93a6SPeter Zijlstra 56618eddac3fSPeter Zijlstra if (irqs_disabled_flags(flags)) { 5662f9ad4a5fSPeter Zijlstra if (DEBUG_LOCKS_WARN_ON(lockdep_hardirqs_enabled())) { 56638eddac3fSPeter Zijlstra printk("possible reason: unannotated irqs-off.\n"); 56648eddac3fSPeter Zijlstra } 56658eddac3fSPeter Zijlstra } else { 5666f9ad4a5fSPeter Zijlstra if (DEBUG_LOCKS_WARN_ON(!lockdep_hardirqs_enabled())) { 56678eddac3fSPeter Zijlstra printk("possible reason: unannotated irqs-on.\n"); 56688eddac3fSPeter Zijlstra } 56698eddac3fSPeter Zijlstra } 56708eddac3fSPeter Zijlstra 56710c1d7a2cSThomas Gleixner #ifndef CONFIG_PREEMPT_RT 56728eddac3fSPeter Zijlstra /* 56738eddac3fSPeter Zijlstra * We dont accurately track softirq state in e.g. 56748eddac3fSPeter Zijlstra * hardirq contexts (such as on 4KSTACKS), so only 56758eddac3fSPeter Zijlstra * check if not in hardirq contexts: 56768eddac3fSPeter Zijlstra */ 56778eddac3fSPeter Zijlstra if (!hardirq_count()) { 56788eddac3fSPeter Zijlstra if (softirq_count()) { 56798eddac3fSPeter Zijlstra /* like the above, but with softirqs */ 56808eddac3fSPeter Zijlstra DEBUG_LOCKS_WARN_ON(current->softirqs_enabled); 56818eddac3fSPeter Zijlstra } else { 56828eddac3fSPeter Zijlstra /* lick the above, does it taste good? */ 56838eddac3fSPeter Zijlstra DEBUG_LOCKS_WARN_ON(!current->softirqs_enabled); 56848eddac3fSPeter Zijlstra } 56858eddac3fSPeter Zijlstra } 56860c1d7a2cSThomas Gleixner #endif 56878eddac3fSPeter Zijlstra 56888eddac3fSPeter Zijlstra if (!debug_locks) 56898eddac3fSPeter Zijlstra print_irqtrace_events(current); 569077ca93a6SPeter Zijlstra 569177ca93a6SPeter Zijlstra instrumentation_end(); 56928eddac3fSPeter Zijlstra #endif 56938eddac3fSPeter Zijlstra } 56948eddac3fSPeter Zijlstra 56958eddac3fSPeter Zijlstra void lock_set_class(struct lockdep_map *lock, const char *name, 56968eddac3fSPeter Zijlstra struct lock_class_key *key, unsigned int subclass, 56978eddac3fSPeter Zijlstra unsigned long ip) 56988eddac3fSPeter Zijlstra { 56998eddac3fSPeter Zijlstra unsigned long flags; 57008eddac3fSPeter Zijlstra 57014d004099SPeter Zijlstra if (unlikely(!lockdep_enabled())) 57028eddac3fSPeter Zijlstra return; 57038eddac3fSPeter Zijlstra 57048eddac3fSPeter Zijlstra raw_local_irq_save(flags); 57054d004099SPeter Zijlstra lockdep_recursion_inc(); 57068eddac3fSPeter Zijlstra check_flags(flags); 57078eddac3fSPeter Zijlstra if (__lock_set_class(lock, name, key, subclass, ip)) 57088eddac3fSPeter Zijlstra check_chain_key(current); 570910476e63SPeter Zijlstra lockdep_recursion_finish(); 57108eddac3fSPeter Zijlstra raw_local_irq_restore(flags); 57118eddac3fSPeter Zijlstra } 57128eddac3fSPeter Zijlstra EXPORT_SYMBOL_GPL(lock_set_class); 57138eddac3fSPeter Zijlstra 57146419c4afSJ. R. Okajima void lock_downgrade(struct lockdep_map *lock, unsigned long ip) 57156419c4afSJ. R. Okajima { 57166419c4afSJ. R. Okajima unsigned long flags; 57176419c4afSJ. R. Okajima 57184d004099SPeter Zijlstra if (unlikely(!lockdep_enabled())) 57196419c4afSJ. R. Okajima return; 57206419c4afSJ. R. Okajima 57216419c4afSJ. R. Okajima raw_local_irq_save(flags); 57224d004099SPeter Zijlstra lockdep_recursion_inc(); 57236419c4afSJ. R. Okajima check_flags(flags); 57246419c4afSJ. R. Okajima if (__lock_downgrade(lock, ip)) 57256419c4afSJ. R. Okajima check_chain_key(current); 572610476e63SPeter Zijlstra lockdep_recursion_finish(); 57276419c4afSJ. R. Okajima raw_local_irq_restore(flags); 57286419c4afSJ. R. Okajima } 57296419c4afSJ. R. Okajima EXPORT_SYMBOL_GPL(lock_downgrade); 57306419c4afSJ. R. Okajima 5731f6f48e18SPeter Zijlstra /* NMI context !!! */ 5732f6f48e18SPeter Zijlstra static void verify_lock_unused(struct lockdep_map *lock, struct held_lock *hlock, int subclass) 5733f6f48e18SPeter Zijlstra { 5734f6f48e18SPeter Zijlstra #ifdef CONFIG_PROVE_LOCKING 5735f6f48e18SPeter Zijlstra struct lock_class *class = look_up_lock_class(lock, subclass); 573623870f12S[email protected] unsigned long mask = LOCKF_USED; 5737f6f48e18SPeter Zijlstra 5738f6f48e18SPeter Zijlstra /* if it doesn't have a class (yet), it certainly hasn't been used yet */ 5739f6f48e18SPeter Zijlstra if (!class) 5740f6f48e18SPeter Zijlstra return; 5741f6f48e18SPeter Zijlstra 574223870f12S[email protected] /* 574323870f12S[email protected] * READ locks only conflict with USED, such that if we only ever use 574423870f12S[email protected] * READ locks, there is no deadlock possible -- RCU. 574523870f12S[email protected] */ 574623870f12S[email protected] if (!hlock->read) 574723870f12S[email protected] mask |= LOCKF_USED_READ; 574823870f12S[email protected] 574923870f12S[email protected] if (!(class->usage_mask & mask)) 5750f6f48e18SPeter Zijlstra return; 5751f6f48e18SPeter Zijlstra 5752f6f48e18SPeter Zijlstra hlock->class_idx = class - lock_classes; 5753f6f48e18SPeter Zijlstra 5754f6f48e18SPeter Zijlstra print_usage_bug(current, hlock, LOCK_USED, LOCK_USAGE_STATES); 5755f6f48e18SPeter Zijlstra #endif 5756f6f48e18SPeter Zijlstra } 5757f6f48e18SPeter Zijlstra 5758f6f48e18SPeter Zijlstra static bool lockdep_nmi(void) 5759f6f48e18SPeter Zijlstra { 57604d004099SPeter Zijlstra if (raw_cpu_read(lockdep_recursion)) 5761f6f48e18SPeter Zijlstra return false; 5762f6f48e18SPeter Zijlstra 5763f6f48e18SPeter Zijlstra if (!in_nmi()) 5764f6f48e18SPeter Zijlstra return false; 5765f6f48e18SPeter Zijlstra 5766f6f48e18SPeter Zijlstra return true; 5767f6f48e18SPeter Zijlstra } 5768f6f48e18SPeter Zijlstra 57698eddac3fSPeter Zijlstra /* 5770e9181886SBoqun Feng * read_lock() is recursive if: 5771e9181886SBoqun Feng * 1. We force lockdep think this way in selftests or 5772e9181886SBoqun Feng * 2. The implementation is not queued read/write lock or 5773e9181886SBoqun Feng * 3. The locker is at an in_interrupt() context. 5774e9181886SBoqun Feng */ 5775e9181886SBoqun Feng bool read_lock_is_recursive(void) 5776e9181886SBoqun Feng { 5777e9181886SBoqun Feng return force_read_lock_recursive || 5778e9181886SBoqun Feng !IS_ENABLED(CONFIG_QUEUED_RWLOCKS) || 5779e9181886SBoqun Feng in_interrupt(); 5780e9181886SBoqun Feng } 5781e9181886SBoqun Feng EXPORT_SYMBOL_GPL(read_lock_is_recursive); 5782e9181886SBoqun Feng 5783e9181886SBoqun Feng /* 57848eddac3fSPeter Zijlstra * We are not always called with irqs disabled - do that here, 57858eddac3fSPeter Zijlstra * and also avoid lockdep recursion: 57868eddac3fSPeter Zijlstra */ 57878eddac3fSPeter Zijlstra void lock_acquire(struct lockdep_map *lock, unsigned int subclass, 57888eddac3fSPeter Zijlstra int trylock, int read, int check, 57898eddac3fSPeter Zijlstra struct lockdep_map *nest_lock, unsigned long ip) 57908eddac3fSPeter Zijlstra { 57918eddac3fSPeter Zijlstra unsigned long flags; 57928eddac3fSPeter Zijlstra 5793eb1f0023SPeter Zijlstra trace_lock_acquire(lock, subclass, trylock, read, check, nest_lock, ip); 5794eb1f0023SPeter Zijlstra 57954d004099SPeter Zijlstra if (!debug_locks) 57964d004099SPeter Zijlstra return; 57974d004099SPeter Zijlstra 57984d004099SPeter Zijlstra if (unlikely(!lockdep_enabled())) { 5799f6f48e18SPeter Zijlstra /* XXX allow trylock from NMI ?!? */ 5800f6f48e18SPeter Zijlstra if (lockdep_nmi() && !trylock) { 5801f6f48e18SPeter Zijlstra struct held_lock hlock; 5802f6f48e18SPeter Zijlstra 5803f6f48e18SPeter Zijlstra hlock.acquire_ip = ip; 5804f6f48e18SPeter Zijlstra hlock.instance = lock; 5805f6f48e18SPeter Zijlstra hlock.nest_lock = nest_lock; 5806f6f48e18SPeter Zijlstra hlock.irq_context = 2; // XXX 5807f6f48e18SPeter Zijlstra hlock.trylock = trylock; 5808f6f48e18SPeter Zijlstra hlock.read = read; 5809f6f48e18SPeter Zijlstra hlock.check = check; 5810f6f48e18SPeter Zijlstra hlock.hardirqs_off = true; 5811f6f48e18SPeter Zijlstra hlock.references = 0; 5812f6f48e18SPeter Zijlstra 5813f6f48e18SPeter Zijlstra verify_lock_unused(lock, &hlock, subclass); 5814f6f48e18SPeter Zijlstra } 58158eddac3fSPeter Zijlstra return; 5816f6f48e18SPeter Zijlstra } 58178eddac3fSPeter Zijlstra 58188eddac3fSPeter Zijlstra raw_local_irq_save(flags); 58198eddac3fSPeter Zijlstra check_flags(flags); 58208eddac3fSPeter Zijlstra 58214d004099SPeter Zijlstra lockdep_recursion_inc(); 58228eddac3fSPeter Zijlstra __lock_acquire(lock, subclass, trylock, read, check, 58230471db44SBoqun Feng irqs_disabled_flags(flags), nest_lock, ip, 0, 0, 0); 582410476e63SPeter Zijlstra lockdep_recursion_finish(); 58258eddac3fSPeter Zijlstra raw_local_irq_restore(flags); 58268eddac3fSPeter Zijlstra } 58278eddac3fSPeter Zijlstra EXPORT_SYMBOL_GPL(lock_acquire); 58288eddac3fSPeter Zijlstra 58295facae4fSQian Cai void lock_release(struct lockdep_map *lock, unsigned long ip) 58308eddac3fSPeter Zijlstra { 58318eddac3fSPeter Zijlstra unsigned long flags; 58328eddac3fSPeter Zijlstra 5833eb1f0023SPeter Zijlstra trace_lock_release(lock, ip); 5834eb1f0023SPeter Zijlstra 58351a616c2fSKent Overstreet if (unlikely(!lockdep_enabled() || 58361a616c2fSKent Overstreet lock->key == &__lockdep_no_track__)) 58378eddac3fSPeter Zijlstra return; 58388eddac3fSPeter Zijlstra 58398eddac3fSPeter Zijlstra raw_local_irq_save(flags); 58408eddac3fSPeter Zijlstra check_flags(flags); 5841eb1f0023SPeter Zijlstra 58424d004099SPeter Zijlstra lockdep_recursion_inc(); 5843b4adfe8eSYuyang Du if (__lock_release(lock, ip)) 5844e0f56fd7SPeter Zijlstra check_chain_key(current); 584510476e63SPeter Zijlstra lockdep_recursion_finish(); 58468eddac3fSPeter Zijlstra raw_local_irq_restore(flags); 58478eddac3fSPeter Zijlstra } 58488eddac3fSPeter Zijlstra EXPORT_SYMBOL_GPL(lock_release); 58498eddac3fSPeter Zijlstra 58502f1f043eSBoqun Feng /* 58512f1f043eSBoqun Feng * lock_sync() - A special annotation for synchronize_{s,}rcu()-like API. 58522f1f043eSBoqun Feng * 58532f1f043eSBoqun Feng * No actual critical section is created by the APIs annotated with this: these 58542f1f043eSBoqun Feng * APIs are used to wait for one or multiple critical sections (on other CPUs 58552f1f043eSBoqun Feng * or threads), and it means that calling these APIs inside these critical 58562f1f043eSBoqun Feng * sections is potential deadlock. 58572f1f043eSBoqun Feng */ 58582f1f043eSBoqun Feng void lock_sync(struct lockdep_map *lock, unsigned subclass, int read, 58592f1f043eSBoqun Feng int check, struct lockdep_map *nest_lock, unsigned long ip) 58602f1f043eSBoqun Feng { 58612f1f043eSBoqun Feng unsigned long flags; 58622f1f043eSBoqun Feng 58632f1f043eSBoqun Feng if (unlikely(!lockdep_enabled())) 58642f1f043eSBoqun Feng return; 58652f1f043eSBoqun Feng 58662f1f043eSBoqun Feng raw_local_irq_save(flags); 58672f1f043eSBoqun Feng check_flags(flags); 58682f1f043eSBoqun Feng 58692f1f043eSBoqun Feng lockdep_recursion_inc(); 58700471db44SBoqun Feng __lock_acquire(lock, subclass, 0, read, check, 58710471db44SBoqun Feng irqs_disabled_flags(flags), nest_lock, ip, 0, 0, 1); 58722f1f043eSBoqun Feng check_chain_key(current); 58732f1f043eSBoqun Feng lockdep_recursion_finish(); 58742f1f043eSBoqun Feng raw_local_irq_restore(flags); 58752f1f043eSBoqun Feng } 58762f1f043eSBoqun Feng EXPORT_SYMBOL_GPL(lock_sync); 58772f1f043eSBoqun Feng 5878c86e9b98SPeter Zijlstra noinstr int lock_is_held_type(const struct lockdep_map *lock, int read) 58798eddac3fSPeter Zijlstra { 58808eddac3fSPeter Zijlstra unsigned long flags; 5881f8cfa466SShuah Khan int ret = LOCK_STATE_NOT_HELD; 58828eddac3fSPeter Zijlstra 58833e31f947SShuah Khan /* 58843e31f947SShuah Khan * Avoid false negative lockdep_assert_held() and 58853e31f947SShuah Khan * lockdep_assert_not_held(). 58863e31f947SShuah Khan */ 58874d004099SPeter Zijlstra if (unlikely(!lockdep_enabled())) 5888f8cfa466SShuah Khan return LOCK_STATE_UNKNOWN; 58898eddac3fSPeter Zijlstra 58908eddac3fSPeter Zijlstra raw_local_irq_save(flags); 58918eddac3fSPeter Zijlstra check_flags(flags); 58928eddac3fSPeter Zijlstra 58934d004099SPeter Zijlstra lockdep_recursion_inc(); 5894f8319483SPeter Zijlstra ret = __lock_is_held(lock, read); 589510476e63SPeter Zijlstra lockdep_recursion_finish(); 58968eddac3fSPeter Zijlstra raw_local_irq_restore(flags); 58978eddac3fSPeter Zijlstra 58988eddac3fSPeter Zijlstra return ret; 58998eddac3fSPeter Zijlstra } 5900f8319483SPeter Zijlstra EXPORT_SYMBOL_GPL(lock_is_held_type); 59012f43c602SMasami Hiramatsu NOKPROBE_SYMBOL(lock_is_held_type); 59028eddac3fSPeter Zijlstra 5903e7904a28SPeter Zijlstra struct pin_cookie lock_pin_lock(struct lockdep_map *lock) 5904a24fc60dSPeter Zijlstra { 5905e7904a28SPeter Zijlstra struct pin_cookie cookie = NIL_COOKIE; 5906a24fc60dSPeter Zijlstra unsigned long flags; 5907a24fc60dSPeter Zijlstra 59084d004099SPeter Zijlstra if (unlikely(!lockdep_enabled())) 5909e7904a28SPeter Zijlstra return cookie; 5910a24fc60dSPeter Zijlstra 5911a24fc60dSPeter Zijlstra raw_local_irq_save(flags); 5912a24fc60dSPeter Zijlstra check_flags(flags); 5913a24fc60dSPeter Zijlstra 59144d004099SPeter Zijlstra lockdep_recursion_inc(); 5915e7904a28SPeter Zijlstra cookie = __lock_pin_lock(lock); 591610476e63SPeter Zijlstra lockdep_recursion_finish(); 5917a24fc60dSPeter Zijlstra raw_local_irq_restore(flags); 5918e7904a28SPeter Zijlstra 5919e7904a28SPeter Zijlstra return cookie; 5920a24fc60dSPeter Zijlstra } 5921a24fc60dSPeter Zijlstra EXPORT_SYMBOL_GPL(lock_pin_lock); 5922a24fc60dSPeter Zijlstra 5923e7904a28SPeter Zijlstra void lock_repin_lock(struct lockdep_map *lock, struct pin_cookie cookie) 5924a24fc60dSPeter Zijlstra { 5925a24fc60dSPeter Zijlstra unsigned long flags; 5926a24fc60dSPeter Zijlstra 59274d004099SPeter Zijlstra if (unlikely(!lockdep_enabled())) 5928a24fc60dSPeter Zijlstra return; 5929a24fc60dSPeter Zijlstra 5930a24fc60dSPeter Zijlstra raw_local_irq_save(flags); 5931a24fc60dSPeter Zijlstra check_flags(flags); 5932a24fc60dSPeter Zijlstra 59334d004099SPeter Zijlstra lockdep_recursion_inc(); 5934e7904a28SPeter Zijlstra __lock_repin_lock(lock, cookie); 593510476e63SPeter Zijlstra lockdep_recursion_finish(); 5936e7904a28SPeter Zijlstra raw_local_irq_restore(flags); 5937e7904a28SPeter Zijlstra } 5938e7904a28SPeter Zijlstra EXPORT_SYMBOL_GPL(lock_repin_lock); 5939e7904a28SPeter Zijlstra 5940e7904a28SPeter Zijlstra void lock_unpin_lock(struct lockdep_map *lock, struct pin_cookie cookie) 5941e7904a28SPeter Zijlstra { 5942e7904a28SPeter Zijlstra unsigned long flags; 5943e7904a28SPeter Zijlstra 59444d004099SPeter Zijlstra if (unlikely(!lockdep_enabled())) 5945e7904a28SPeter Zijlstra return; 5946e7904a28SPeter Zijlstra 5947e7904a28SPeter Zijlstra raw_local_irq_save(flags); 5948e7904a28SPeter Zijlstra check_flags(flags); 5949e7904a28SPeter Zijlstra 59504d004099SPeter Zijlstra lockdep_recursion_inc(); 5951e7904a28SPeter Zijlstra __lock_unpin_lock(lock, cookie); 595210476e63SPeter Zijlstra lockdep_recursion_finish(); 5953a24fc60dSPeter Zijlstra raw_local_irq_restore(flags); 5954a24fc60dSPeter Zijlstra } 5955a24fc60dSPeter Zijlstra EXPORT_SYMBOL_GPL(lock_unpin_lock); 5956a24fc60dSPeter Zijlstra 59578eddac3fSPeter Zijlstra #ifdef CONFIG_LOCK_STAT 5958f7c1c6b3SYuyang Du static void print_lock_contention_bug(struct task_struct *curr, 5959f7c1c6b3SYuyang Du struct lockdep_map *lock, 59608eddac3fSPeter Zijlstra unsigned long ip) 59618eddac3fSPeter Zijlstra { 59628eddac3fSPeter Zijlstra if (!debug_locks_off()) 5963f7c1c6b3SYuyang Du return; 59648eddac3fSPeter Zijlstra if (debug_locks_silent) 5965f7c1c6b3SYuyang Du return; 59668eddac3fSPeter Zijlstra 5967*59cd94efSJohn Ogness nbcon_cpu_emergency_enter(); 5968*59cd94efSJohn Ogness 5969681fbec8SPaul E. McKenney pr_warn("\n"); 5970a5dd63efSPaul E. McKenney pr_warn("=================================\n"); 5971a5dd63efSPaul E. McKenney pr_warn("WARNING: bad contention detected!\n"); 59728eddac3fSPeter Zijlstra print_kernel_ident(); 5973a5dd63efSPaul E. McKenney pr_warn("---------------------------------\n"); 5974681fbec8SPaul E. McKenney pr_warn("%s/%d is trying to contend lock (", 59758eddac3fSPeter Zijlstra curr->comm, task_pid_nr(curr)); 59768eddac3fSPeter Zijlstra print_lockdep_cache(lock); 5977681fbec8SPaul E. McKenney pr_cont(") at:\n"); 59782062a4e8SDmitry Safonov print_ip_sym(KERN_WARNING, ip); 5979681fbec8SPaul E. McKenney pr_warn("but there are no locks held!\n"); 5980681fbec8SPaul E. McKenney pr_warn("\nother info that might help us debug this:\n"); 59818eddac3fSPeter Zijlstra lockdep_print_held_locks(curr); 59828eddac3fSPeter Zijlstra 5983681fbec8SPaul E. McKenney pr_warn("\nstack backtrace:\n"); 59848eddac3fSPeter Zijlstra dump_stack(); 5985*59cd94efSJohn Ogness 5986*59cd94efSJohn Ogness nbcon_cpu_emergency_exit(); 59878eddac3fSPeter Zijlstra } 59888eddac3fSPeter Zijlstra 59898eddac3fSPeter Zijlstra static void 59908eddac3fSPeter Zijlstra __lock_contended(struct lockdep_map *lock, unsigned long ip) 59918eddac3fSPeter Zijlstra { 59928eddac3fSPeter Zijlstra struct task_struct *curr = current; 599341c2c5b8SJ. R. Okajima struct held_lock *hlock; 59948eddac3fSPeter Zijlstra struct lock_class_stats *stats; 59958eddac3fSPeter Zijlstra unsigned int depth; 59968eddac3fSPeter Zijlstra int i, contention_point, contending_point; 59978eddac3fSPeter Zijlstra 59988eddac3fSPeter Zijlstra depth = curr->lockdep_depth; 59998eddac3fSPeter Zijlstra /* 60008eddac3fSPeter Zijlstra * Whee, we contended on this lock, except it seems we're not 60018eddac3fSPeter Zijlstra * actually trying to acquire anything much at all.. 60028eddac3fSPeter Zijlstra */ 60038eddac3fSPeter Zijlstra if (DEBUG_LOCKS_WARN_ON(!depth)) 60048eddac3fSPeter Zijlstra return; 60058eddac3fSPeter Zijlstra 6006ff9bf4b3SKent Overstreet if (unlikely(lock->key == &__lockdep_no_track__)) 6007ff9bf4b3SKent Overstreet return; 6008ff9bf4b3SKent Overstreet 600941c2c5b8SJ. R. Okajima hlock = find_held_lock(curr, lock, depth, &i); 601041c2c5b8SJ. R. Okajima if (!hlock) { 60118eddac3fSPeter Zijlstra print_lock_contention_bug(curr, lock, ip); 60128eddac3fSPeter Zijlstra return; 601341c2c5b8SJ. R. Okajima } 60148eddac3fSPeter Zijlstra 60158eddac3fSPeter Zijlstra if (hlock->instance != lock) 60168eddac3fSPeter Zijlstra return; 60178eddac3fSPeter Zijlstra 60188eddac3fSPeter Zijlstra hlock->waittime_stamp = lockstat_clock(); 60198eddac3fSPeter Zijlstra 60208eddac3fSPeter Zijlstra contention_point = lock_point(hlock_class(hlock)->contention_point, ip); 60218eddac3fSPeter Zijlstra contending_point = lock_point(hlock_class(hlock)->contending_point, 60228eddac3fSPeter Zijlstra lock->ip); 60238eddac3fSPeter Zijlstra 60248eddac3fSPeter Zijlstra stats = get_lock_stats(hlock_class(hlock)); 60258eddac3fSPeter Zijlstra if (contention_point < LOCKSTAT_POINTS) 60268eddac3fSPeter Zijlstra stats->contention_point[contention_point]++; 60278eddac3fSPeter Zijlstra if (contending_point < LOCKSTAT_POINTS) 60288eddac3fSPeter Zijlstra stats->contending_point[contending_point]++; 60298eddac3fSPeter Zijlstra if (lock->cpu != smp_processor_id()) 60308eddac3fSPeter Zijlstra stats->bounces[bounce_contended + !!hlock->read]++; 60318eddac3fSPeter Zijlstra } 60328eddac3fSPeter Zijlstra 60338eddac3fSPeter Zijlstra static void 60348eddac3fSPeter Zijlstra __lock_acquired(struct lockdep_map *lock, unsigned long ip) 60358eddac3fSPeter Zijlstra { 60368eddac3fSPeter Zijlstra struct task_struct *curr = current; 603741c2c5b8SJ. R. Okajima struct held_lock *hlock; 60388eddac3fSPeter Zijlstra struct lock_class_stats *stats; 60398eddac3fSPeter Zijlstra unsigned int depth; 60408eddac3fSPeter Zijlstra u64 now, waittime = 0; 60418eddac3fSPeter Zijlstra int i, cpu; 60428eddac3fSPeter Zijlstra 60438eddac3fSPeter Zijlstra depth = curr->lockdep_depth; 60448eddac3fSPeter Zijlstra /* 60458eddac3fSPeter Zijlstra * Yay, we acquired ownership of this lock we didn't try to 60468eddac3fSPeter Zijlstra * acquire, how the heck did that happen? 60478eddac3fSPeter Zijlstra */ 60488eddac3fSPeter Zijlstra if (DEBUG_LOCKS_WARN_ON(!depth)) 60498eddac3fSPeter Zijlstra return; 60508eddac3fSPeter Zijlstra 6051ff9bf4b3SKent Overstreet if (unlikely(lock->key == &__lockdep_no_track__)) 6052ff9bf4b3SKent Overstreet return; 6053ff9bf4b3SKent Overstreet 605441c2c5b8SJ. R. Okajima hlock = find_held_lock(curr, lock, depth, &i); 605541c2c5b8SJ. R. Okajima if (!hlock) { 60568eddac3fSPeter Zijlstra print_lock_contention_bug(curr, lock, _RET_IP_); 60578eddac3fSPeter Zijlstra return; 605841c2c5b8SJ. R. Okajima } 60598eddac3fSPeter Zijlstra 60608eddac3fSPeter Zijlstra if (hlock->instance != lock) 60618eddac3fSPeter Zijlstra return; 60628eddac3fSPeter Zijlstra 60638eddac3fSPeter Zijlstra cpu = smp_processor_id(); 60648eddac3fSPeter Zijlstra if (hlock->waittime_stamp) { 60658eddac3fSPeter Zijlstra now = lockstat_clock(); 60668eddac3fSPeter Zijlstra waittime = now - hlock->waittime_stamp; 60678eddac3fSPeter Zijlstra hlock->holdtime_stamp = now; 60688eddac3fSPeter Zijlstra } 60698eddac3fSPeter Zijlstra 60708eddac3fSPeter Zijlstra stats = get_lock_stats(hlock_class(hlock)); 60718eddac3fSPeter Zijlstra if (waittime) { 60728eddac3fSPeter Zijlstra if (hlock->read) 60738eddac3fSPeter Zijlstra lock_time_inc(&stats->read_waittime, waittime); 60748eddac3fSPeter Zijlstra else 60758eddac3fSPeter Zijlstra lock_time_inc(&stats->write_waittime, waittime); 60768eddac3fSPeter Zijlstra } 60778eddac3fSPeter Zijlstra if (lock->cpu != cpu) 60788eddac3fSPeter Zijlstra stats->bounces[bounce_acquired + !!hlock->read]++; 60798eddac3fSPeter Zijlstra 60808eddac3fSPeter Zijlstra lock->cpu = cpu; 60818eddac3fSPeter Zijlstra lock->ip = ip; 60828eddac3fSPeter Zijlstra } 60838eddac3fSPeter Zijlstra 60848eddac3fSPeter Zijlstra void lock_contended(struct lockdep_map *lock, unsigned long ip) 60858eddac3fSPeter Zijlstra { 60868eddac3fSPeter Zijlstra unsigned long flags; 60878eddac3fSPeter Zijlstra 608889e70d5cSLeo Yan trace_lock_contended(lock, ip); 6089eb1f0023SPeter Zijlstra 60904d004099SPeter Zijlstra if (unlikely(!lock_stat || !lockdep_enabled())) 60918eddac3fSPeter Zijlstra return; 60928eddac3fSPeter Zijlstra 60938eddac3fSPeter Zijlstra raw_local_irq_save(flags); 60948eddac3fSPeter Zijlstra check_flags(flags); 60954d004099SPeter Zijlstra lockdep_recursion_inc(); 60968eddac3fSPeter Zijlstra __lock_contended(lock, ip); 609710476e63SPeter Zijlstra lockdep_recursion_finish(); 60988eddac3fSPeter Zijlstra raw_local_irq_restore(flags); 60998eddac3fSPeter Zijlstra } 61008eddac3fSPeter Zijlstra EXPORT_SYMBOL_GPL(lock_contended); 61018eddac3fSPeter Zijlstra 61028eddac3fSPeter Zijlstra void lock_acquired(struct lockdep_map *lock, unsigned long ip) 61038eddac3fSPeter Zijlstra { 61048eddac3fSPeter Zijlstra unsigned long flags; 61058eddac3fSPeter Zijlstra 610689e70d5cSLeo Yan trace_lock_acquired(lock, ip); 6107eb1f0023SPeter Zijlstra 61084d004099SPeter Zijlstra if (unlikely(!lock_stat || !lockdep_enabled())) 61098eddac3fSPeter Zijlstra return; 61108eddac3fSPeter Zijlstra 61118eddac3fSPeter Zijlstra raw_local_irq_save(flags); 61128eddac3fSPeter Zijlstra check_flags(flags); 61134d004099SPeter Zijlstra lockdep_recursion_inc(); 61148eddac3fSPeter Zijlstra __lock_acquired(lock, ip); 611510476e63SPeter Zijlstra lockdep_recursion_finish(); 61168eddac3fSPeter Zijlstra raw_local_irq_restore(flags); 61178eddac3fSPeter Zijlstra } 61188eddac3fSPeter Zijlstra EXPORT_SYMBOL_GPL(lock_acquired); 61198eddac3fSPeter Zijlstra #endif 61208eddac3fSPeter Zijlstra 61218eddac3fSPeter Zijlstra /* 61228eddac3fSPeter Zijlstra * Used by the testsuite, sanitize the validator state 61238eddac3fSPeter Zijlstra * after a simulated failure: 61248eddac3fSPeter Zijlstra */ 61258eddac3fSPeter Zijlstra 61268eddac3fSPeter Zijlstra void lockdep_reset(void) 61278eddac3fSPeter Zijlstra { 61288eddac3fSPeter Zijlstra unsigned long flags; 61298eddac3fSPeter Zijlstra int i; 61308eddac3fSPeter Zijlstra 61318eddac3fSPeter Zijlstra raw_local_irq_save(flags); 6132e196e479SYuyang Du lockdep_init_task(current); 61338eddac3fSPeter Zijlstra memset(current->held_locks, 0, MAX_LOCK_DEPTH*sizeof(struct held_lock)); 61348eddac3fSPeter Zijlstra nr_hardirq_chains = 0; 61358eddac3fSPeter Zijlstra nr_softirq_chains = 0; 61368eddac3fSPeter Zijlstra nr_process_chains = 0; 61378eddac3fSPeter Zijlstra debug_locks = 1; 61388eddac3fSPeter Zijlstra for (i = 0; i < CHAINHASH_SIZE; i++) 6139a63f38ccSAndrew Morton INIT_HLIST_HEAD(chainhash_table + i); 61408eddac3fSPeter Zijlstra raw_local_irq_restore(flags); 61418eddac3fSPeter Zijlstra } 61428eddac3fSPeter Zijlstra 6143a0b0fd53SBart Van Assche /* Remove a class from a lock chain. Must be called with the graph lock held. */ 6144de4643a7SBart Van Assche static void remove_class_from_lock_chain(struct pending_free *pf, 6145de4643a7SBart Van Assche struct lock_chain *chain, 6146a0b0fd53SBart Van Assche struct lock_class *class) 6147a0b0fd53SBart Van Assche { 6148a0b0fd53SBart Van Assche #ifdef CONFIG_PROVE_LOCKING 6149a0b0fd53SBart Van Assche int i; 6150a0b0fd53SBart Van Assche 6151a0b0fd53SBart Van Assche for (i = chain->base; i < chain->base + chain->depth; i++) { 6152f611e8cfSBoqun Feng if (chain_hlock_class_idx(chain_hlocks[i]) != class - lock_classes) 6153a0b0fd53SBart Van Assche continue; 6154a0b0fd53SBart Van Assche /* 6155a0b0fd53SBart Van Assche * Each lock class occurs at most once in a lock chain so once 6156a0b0fd53SBart Van Assche * we found a match we can break out of this loop. 6157a0b0fd53SBart Van Assche */ 6158836bd74bSWaiman Long goto free_lock_chain; 6159a0b0fd53SBart Van Assche } 6160a0b0fd53SBart Van Assche /* Since the chain has not been modified, return. */ 6161a0b0fd53SBart Van Assche return; 6162a0b0fd53SBart Van Assche 6163836bd74bSWaiman Long free_lock_chain: 6164810507feSWaiman Long free_chain_hlocks(chain->base, chain->depth); 6165a0b0fd53SBart Van Assche /* Overwrite the chain key for concurrent RCU readers. */ 6166836bd74bSWaiman Long WRITE_ONCE(chain->chain_key, INITIAL_CHAIN_KEY); 6167b3b9c187SWaiman Long dec_chains(chain->irq_context); 6168b3b9c187SWaiman Long 6169a0b0fd53SBart Van Assche /* 6170a0b0fd53SBart Van Assche * Note: calling hlist_del_rcu() from inside a 6171a0b0fd53SBart Van Assche * hlist_for_each_entry_rcu() loop is safe. 6172a0b0fd53SBart Van Assche */ 6173a0b0fd53SBart Van Assche hlist_del_rcu(&chain->entry); 6174de4643a7SBart Van Assche __set_bit(chain - lock_chains, pf->lock_chains_being_freed); 6175797b82ebSWaiman Long nr_zapped_lock_chains++; 6176a0b0fd53SBart Van Assche #endif 6177a0b0fd53SBart Van Assche } 6178a0b0fd53SBart Van Assche 6179a0b0fd53SBart Van Assche /* Must be called with the graph lock held. */ 6180de4643a7SBart Van Assche static void remove_class_from_lock_chains(struct pending_free *pf, 6181de4643a7SBart Van Assche struct lock_class *class) 6182a0b0fd53SBart Van Assche { 6183a0b0fd53SBart Van Assche struct lock_chain *chain; 6184a0b0fd53SBart Van Assche struct hlist_head *head; 6185a0b0fd53SBart Van Assche int i; 6186a0b0fd53SBart Van Assche 6187a0b0fd53SBart Van Assche for (i = 0; i < ARRAY_SIZE(chainhash_table); i++) { 6188a0b0fd53SBart Van Assche head = chainhash_table + i; 6189a0b0fd53SBart Van Assche hlist_for_each_entry_rcu(chain, head, entry) { 6190de4643a7SBart Van Assche remove_class_from_lock_chain(pf, chain, class); 6191a0b0fd53SBart Van Assche } 6192a0b0fd53SBart Van Assche } 6193a0b0fd53SBart Van Assche } 6194a0b0fd53SBart Van Assche 6195786fa29eSBart Van Assche /* 6196786fa29eSBart Van Assche * Remove all references to a lock class. The caller must hold the graph lock. 6197786fa29eSBart Van Assche */ 6198a0b0fd53SBart Van Assche static void zap_class(struct pending_free *pf, struct lock_class *class) 61998eddac3fSPeter Zijlstra { 620086cffb80SBart Van Assche struct lock_list *entry; 62018eddac3fSPeter Zijlstra int i; 62028eddac3fSPeter Zijlstra 6203a0b0fd53SBart Van Assche WARN_ON_ONCE(!class->key); 6204a0b0fd53SBart Van Assche 62058eddac3fSPeter Zijlstra /* 62068eddac3fSPeter Zijlstra * Remove all dependencies this lock is 62078eddac3fSPeter Zijlstra * involved in: 62088eddac3fSPeter Zijlstra */ 6209ace35a7aSBart Van Assche for_each_set_bit(i, list_entries_in_use, ARRAY_SIZE(list_entries)) { 6210ace35a7aSBart Van Assche entry = list_entries + i; 621186cffb80SBart Van Assche if (entry->class != class && entry->links_to != class) 621286cffb80SBart Van Assche continue; 6213ace35a7aSBart Van Assche __clear_bit(i, list_entries_in_use); 6214ace35a7aSBart Van Assche nr_list_entries--; 621586cffb80SBart Van Assche list_del_rcu(&entry->entry); 62168eddac3fSPeter Zijlstra } 6217a0b0fd53SBart Van Assche if (list_empty(&class->locks_after) && 6218a0b0fd53SBart Van Assche list_empty(&class->locks_before)) { 6219a0b0fd53SBart Van Assche list_move_tail(&class->lock_entry, &pf->zapped); 6220a63f38ccSAndrew Morton hlist_del_rcu(&class->hash_entry); 6221a0b0fd53SBart Van Assche WRITE_ONCE(class->key, NULL); 6222a0b0fd53SBart Van Assche WRITE_ONCE(class->name, NULL); 6223a0b0fd53SBart Van Assche nr_lock_classes--; 622401bb6f0aSYuyang Du __clear_bit(class - lock_classes, lock_classes_in_use); 6225fb7275acSWaiman Long if (class - lock_classes == max_lock_class_idx) 6226fb7275acSWaiman Long max_lock_class_idx--; 6227a0b0fd53SBart Van Assche } else { 6228a0b0fd53SBart Van Assche WARN_ONCE(true, "%s() failed for class %s\n", __func__, 6229a0b0fd53SBart Van Assche class->name); 6230a0b0fd53SBart Van Assche } 62318eddac3fSPeter Zijlstra 6232de4643a7SBart Van Assche remove_class_from_lock_chains(pf, class); 62331d44bcb4SWaiman Long nr_zapped_classes++; 6234a0b0fd53SBart Van Assche } 6235a0b0fd53SBart Van Assche 6236a0b0fd53SBart Van Assche static void reinit_class(struct lock_class *class) 6237a0b0fd53SBart Van Assche { 6238a0b0fd53SBart Van Assche WARN_ON_ONCE(!class->lock_entry.next); 6239a0b0fd53SBart Van Assche WARN_ON_ONCE(!list_empty(&class->locks_after)); 6240a0b0fd53SBart Van Assche WARN_ON_ONCE(!list_empty(&class->locks_before)); 6241e204193bSXiu Jianfeng memset_startat(class, 0, key); 6242a0b0fd53SBart Van Assche WARN_ON_ONCE(!class->lock_entry.next); 6243a0b0fd53SBart Van Assche WARN_ON_ONCE(!list_empty(&class->locks_after)); 6244a0b0fd53SBart Van Assche WARN_ON_ONCE(!list_empty(&class->locks_before)); 62458eddac3fSPeter Zijlstra } 62468eddac3fSPeter Zijlstra 62478eddac3fSPeter Zijlstra static inline int within(const void *addr, void *start, unsigned long size) 62488eddac3fSPeter Zijlstra { 62498eddac3fSPeter Zijlstra return addr >= start && addr < start + size; 62508eddac3fSPeter Zijlstra } 62518eddac3fSPeter Zijlstra 6252a0b0fd53SBart Van Assche static bool inside_selftest(void) 6253a0b0fd53SBart Van Assche { 6254a0b0fd53SBart Van Assche return current == lockdep_selftest_task_struct; 6255a0b0fd53SBart Van Assche } 6256a0b0fd53SBart Van Assche 6257a0b0fd53SBart Van Assche /* The caller must hold the graph lock. */ 6258a0b0fd53SBart Van Assche static struct pending_free *get_pending_free(void) 6259a0b0fd53SBart Van Assche { 6260a0b0fd53SBart Van Assche return delayed_free.pf + delayed_free.index; 6261a0b0fd53SBart Van Assche } 6262a0b0fd53SBart Van Assche 6263a0b0fd53SBart Van Assche static void free_zapped_rcu(struct rcu_head *cb); 6264a0b0fd53SBart Van Assche 6265a0b0fd53SBart Van Assche /* 6266a0b0fd53SBart Van Assche * Schedule an RCU callback if no RCU callback is pending. Must be called with 6267a0b0fd53SBart Van Assche * the graph lock held. 6268a0b0fd53SBart Van Assche */ 6269a0b0fd53SBart Van Assche static void call_rcu_zapped(struct pending_free *pf) 6270a0b0fd53SBart Van Assche { 6271a0b0fd53SBart Van Assche WARN_ON_ONCE(inside_selftest()); 6272a0b0fd53SBart Van Assche 6273a0b0fd53SBart Van Assche if (list_empty(&pf->zapped)) 6274a0b0fd53SBart Van Assche return; 6275a0b0fd53SBart Van Assche 6276a0b0fd53SBart Van Assche if (delayed_free.scheduled) 6277a0b0fd53SBart Van Assche return; 6278a0b0fd53SBart Van Assche 6279a0b0fd53SBart Van Assche delayed_free.scheduled = true; 6280a0b0fd53SBart Van Assche 6281a0b0fd53SBart Van Assche WARN_ON_ONCE(delayed_free.pf + delayed_free.index != pf); 6282a0b0fd53SBart Van Assche delayed_free.index ^= 1; 6283a0b0fd53SBart Van Assche 6284a0b0fd53SBart Van Assche call_rcu(&delayed_free.rcu_head, free_zapped_rcu); 6285a0b0fd53SBart Van Assche } 6286a0b0fd53SBart Van Assche 6287a0b0fd53SBart Van Assche /* The caller must hold the graph lock. May be called from RCU context. */ 6288a0b0fd53SBart Van Assche static void __free_zapped_classes(struct pending_free *pf) 6289a0b0fd53SBart Van Assche { 6290a0b0fd53SBart Van Assche struct lock_class *class; 6291a0b0fd53SBart Van Assche 629272dcd505SPeter Zijlstra check_data_structures(); 6293b526b2e3SBart Van Assche 6294a0b0fd53SBart Van Assche list_for_each_entry(class, &pf->zapped, lock_entry) 6295a0b0fd53SBart Van Assche reinit_class(class); 6296a0b0fd53SBart Van Assche 6297a0b0fd53SBart Van Assche list_splice_init(&pf->zapped, &free_lock_classes); 6298de4643a7SBart Van Assche 6299de4643a7SBart Van Assche #ifdef CONFIG_PROVE_LOCKING 6300de4643a7SBart Van Assche bitmap_andnot(lock_chains_in_use, lock_chains_in_use, 6301de4643a7SBart Van Assche pf->lock_chains_being_freed, ARRAY_SIZE(lock_chains)); 6302de4643a7SBart Van Assche bitmap_clear(pf->lock_chains_being_freed, 0, ARRAY_SIZE(lock_chains)); 6303de4643a7SBart Van Assche #endif 6304a0b0fd53SBart Van Assche } 6305a0b0fd53SBart Van Assche 6306a0b0fd53SBart Van Assche static void free_zapped_rcu(struct rcu_head *ch) 6307a0b0fd53SBart Van Assche { 6308a0b0fd53SBart Van Assche struct pending_free *pf; 6309a0b0fd53SBart Van Assche unsigned long flags; 6310a0b0fd53SBart Van Assche 6311a0b0fd53SBart Van Assche if (WARN_ON_ONCE(ch != &delayed_free.rcu_head)) 6312a0b0fd53SBart Van Assche return; 6313a0b0fd53SBart Van Assche 6314a0b0fd53SBart Van Assche raw_local_irq_save(flags); 6315248efb21SPeter Zijlstra lockdep_lock(); 6316a0b0fd53SBart Van Assche 6317a0b0fd53SBart Van Assche /* closed head */ 6318a0b0fd53SBart Van Assche pf = delayed_free.pf + (delayed_free.index ^ 1); 6319a0b0fd53SBart Van Assche __free_zapped_classes(pf); 6320a0b0fd53SBart Van Assche delayed_free.scheduled = false; 6321a0b0fd53SBart Van Assche 6322a0b0fd53SBart Van Assche /* 6323a0b0fd53SBart Van Assche * If there's anything on the open list, close and start a new callback. 6324a0b0fd53SBart Van Assche */ 6325a0b0fd53SBart Van Assche call_rcu_zapped(delayed_free.pf + delayed_free.index); 6326a0b0fd53SBart Van Assche 6327248efb21SPeter Zijlstra lockdep_unlock(); 6328a0b0fd53SBart Van Assche raw_local_irq_restore(flags); 6329a0b0fd53SBart Van Assche } 6330a0b0fd53SBart Van Assche 6331a0b0fd53SBart Van Assche /* 6332a0b0fd53SBart Van Assche * Remove all lock classes from the class hash table and from the 6333a0b0fd53SBart Van Assche * all_lock_classes list whose key or name is in the address range [start, 6334a0b0fd53SBart Van Assche * start + size). Move these lock classes to the zapped_classes list. Must 6335a0b0fd53SBart Van Assche * be called with the graph lock held. 6336a0b0fd53SBart Van Assche */ 6337a0b0fd53SBart Van Assche static void __lockdep_free_key_range(struct pending_free *pf, void *start, 6338a0b0fd53SBart Van Assche unsigned long size) 6339956f3563SBart Van Assche { 6340956f3563SBart Van Assche struct lock_class *class; 6341956f3563SBart Van Assche struct hlist_head *head; 6342956f3563SBart Van Assche int i; 6343956f3563SBart Van Assche 6344956f3563SBart Van Assche /* Unhash all classes that were created by a module. */ 6345956f3563SBart Van Assche for (i = 0; i < CLASSHASH_SIZE; i++) { 6346956f3563SBart Van Assche head = classhash_table + i; 6347956f3563SBart Van Assche hlist_for_each_entry_rcu(class, head, hash_entry) { 6348956f3563SBart Van Assche if (!within(class->key, start, size) && 6349956f3563SBart Van Assche !within(class->name, start, size)) 6350956f3563SBart Van Assche continue; 6351a0b0fd53SBart Van Assche zap_class(pf, class); 6352956f3563SBart Van Assche } 6353956f3563SBart Van Assche } 6354956f3563SBart Van Assche } 6355956f3563SBart Van Assche 635635a9393cSPeter Zijlstra /* 635735a9393cSPeter Zijlstra * Used in module.c to remove lock classes from memory that is going to be 635835a9393cSPeter Zijlstra * freed; and possibly re-used by other modules. 635935a9393cSPeter Zijlstra * 636029fc33fbSBart Van Assche * We will have had one synchronize_rcu() before getting here, so we're 636129fc33fbSBart Van Assche * guaranteed nobody will look up these exact classes -- they're properly dead 636229fc33fbSBart Van Assche * but still allocated. 636335a9393cSPeter Zijlstra */ 6364a0b0fd53SBart Van Assche static void lockdep_free_key_range_reg(void *start, unsigned long size) 63658eddac3fSPeter Zijlstra { 6366a0b0fd53SBart Van Assche struct pending_free *pf; 63678eddac3fSPeter Zijlstra unsigned long flags; 63688eddac3fSPeter Zijlstra 6369feb0a386SBart Van Assche init_data_structures_once(); 6370feb0a386SBart Van Assche 63718eddac3fSPeter Zijlstra raw_local_irq_save(flags); 6372248efb21SPeter Zijlstra lockdep_lock(); 6373a0b0fd53SBart Van Assche pf = get_pending_free(); 6374a0b0fd53SBart Van Assche __lockdep_free_key_range(pf, start, size); 6375a0b0fd53SBart Van Assche call_rcu_zapped(pf); 6376248efb21SPeter Zijlstra lockdep_unlock(); 63778eddac3fSPeter Zijlstra raw_local_irq_restore(flags); 637835a9393cSPeter Zijlstra 637935a9393cSPeter Zijlstra /* 638035a9393cSPeter Zijlstra * Wait for any possible iterators from look_up_lock_class() to pass 638135a9393cSPeter Zijlstra * before continuing to free the memory they refer to. 638235a9393cSPeter Zijlstra */ 638351959d85SPaul E. McKenney synchronize_rcu(); 6384a0b0fd53SBart Van Assche } 638535a9393cSPeter Zijlstra 638635a9393cSPeter Zijlstra /* 6387a0b0fd53SBart Van Assche * Free all lockdep keys in the range [start, start+size). Does not sleep. 6388a0b0fd53SBart Van Assche * Ignores debug_locks. Must only be used by the lockdep selftests. 638935a9393cSPeter Zijlstra */ 6390a0b0fd53SBart Van Assche static void lockdep_free_key_range_imm(void *start, unsigned long size) 6391a0b0fd53SBart Van Assche { 6392a0b0fd53SBart Van Assche struct pending_free *pf = delayed_free.pf; 6393a0b0fd53SBart Van Assche unsigned long flags; 6394a0b0fd53SBart Van Assche 6395a0b0fd53SBart Van Assche init_data_structures_once(); 6396a0b0fd53SBart Van Assche 6397a0b0fd53SBart Van Assche raw_local_irq_save(flags); 6398248efb21SPeter Zijlstra lockdep_lock(); 6399a0b0fd53SBart Van Assche __lockdep_free_key_range(pf, start, size); 6400a0b0fd53SBart Van Assche __free_zapped_classes(pf); 6401248efb21SPeter Zijlstra lockdep_unlock(); 6402a0b0fd53SBart Van Assche raw_local_irq_restore(flags); 6403a0b0fd53SBart Van Assche } 6404a0b0fd53SBart Van Assche 6405a0b0fd53SBart Van Assche void lockdep_free_key_range(void *start, unsigned long size) 6406a0b0fd53SBart Van Assche { 6407a0b0fd53SBart Van Assche init_data_structures_once(); 6408a0b0fd53SBart Van Assche 6409a0b0fd53SBart Van Assche if (inside_selftest()) 6410a0b0fd53SBart Van Assche lockdep_free_key_range_imm(start, size); 6411a0b0fd53SBart Van Assche else 6412a0b0fd53SBart Van Assche lockdep_free_key_range_reg(start, size); 64138eddac3fSPeter Zijlstra } 64148eddac3fSPeter Zijlstra 64152904d9faSBart Van Assche /* 64162904d9faSBart Van Assche * Check whether any element of the @lock->class_cache[] array refers to a 64172904d9faSBart Van Assche * registered lock class. The caller must hold either the graph lock or the 64182904d9faSBart Van Assche * RCU read lock. 64192904d9faSBart Van Assche */ 64202904d9faSBart Van Assche static bool lock_class_cache_is_registered(struct lockdep_map *lock) 64218eddac3fSPeter Zijlstra { 642235a9393cSPeter Zijlstra struct lock_class *class; 6423a63f38ccSAndrew Morton struct hlist_head *head; 64248eddac3fSPeter Zijlstra int i, j; 64252904d9faSBart Van Assche 64262904d9faSBart Van Assche for (i = 0; i < CLASSHASH_SIZE; i++) { 64272904d9faSBart Van Assche head = classhash_table + i; 64282904d9faSBart Van Assche hlist_for_each_entry_rcu(class, head, hash_entry) { 64292904d9faSBart Van Assche for (j = 0; j < NR_LOCKDEP_CACHING_CLASSES; j++) 64302904d9faSBart Van Assche if (lock->class_cache[j] == class) 64312904d9faSBart Van Assche return true; 64322904d9faSBart Van Assche } 64332904d9faSBart Van Assche } 64342904d9faSBart Van Assche return false; 64352904d9faSBart Van Assche } 64362904d9faSBart Van Assche 6437956f3563SBart Van Assche /* The caller must hold the graph lock. Does not sleep. */ 6438a0b0fd53SBart Van Assche static void __lockdep_reset_lock(struct pending_free *pf, 6439a0b0fd53SBart Van Assche struct lockdep_map *lock) 64402904d9faSBart Van Assche { 64412904d9faSBart Van Assche struct lock_class *class; 6442956f3563SBart Van Assche int j; 64438eddac3fSPeter Zijlstra 64448eddac3fSPeter Zijlstra /* 64458eddac3fSPeter Zijlstra * Remove all classes this lock might have: 64468eddac3fSPeter Zijlstra */ 64478eddac3fSPeter Zijlstra for (j = 0; j < MAX_LOCKDEP_SUBCLASSES; j++) { 64488eddac3fSPeter Zijlstra /* 64498eddac3fSPeter Zijlstra * If the class exists we look it up and zap it: 64508eddac3fSPeter Zijlstra */ 64518eddac3fSPeter Zijlstra class = look_up_lock_class(lock, j); 645264f29d1bSMatthew Wilcox if (class) 6453a0b0fd53SBart Van Assche zap_class(pf, class); 64548eddac3fSPeter Zijlstra } 64558eddac3fSPeter Zijlstra /* 64568eddac3fSPeter Zijlstra * Debug check: in the end all mapped classes should 64578eddac3fSPeter Zijlstra * be gone. 64588eddac3fSPeter Zijlstra */ 6459956f3563SBart Van Assche if (WARN_ON_ONCE(lock_class_cache_is_registered(lock))) 6460956f3563SBart Van Assche debug_locks_off(); 64618eddac3fSPeter Zijlstra } 6462956f3563SBart Van Assche 6463a0b0fd53SBart Van Assche /* 6464a0b0fd53SBart Van Assche * Remove all information lockdep has about a lock if debug_locks == 1. Free 6465a0b0fd53SBart Van Assche * released data structures from RCU context. 6466a0b0fd53SBart Van Assche */ 6467a0b0fd53SBart Van Assche static void lockdep_reset_lock_reg(struct lockdep_map *lock) 6468956f3563SBart Van Assche { 6469a0b0fd53SBart Van Assche struct pending_free *pf; 6470956f3563SBart Van Assche unsigned long flags; 6471956f3563SBart Van Assche int locked; 6472956f3563SBart Van Assche 6473956f3563SBart Van Assche raw_local_irq_save(flags); 6474956f3563SBart Van Assche locked = graph_lock(); 6475a0b0fd53SBart Van Assche if (!locked) 6476a0b0fd53SBart Van Assche goto out_irq; 6477a0b0fd53SBart Van Assche 6478a0b0fd53SBart Van Assche pf = get_pending_free(); 6479a0b0fd53SBart Van Assche __lockdep_reset_lock(pf, lock); 6480a0b0fd53SBart Van Assche call_rcu_zapped(pf); 6481a0b0fd53SBart Van Assche 64828eddac3fSPeter Zijlstra graph_unlock(); 6483a0b0fd53SBart Van Assche out_irq: 64848eddac3fSPeter Zijlstra raw_local_irq_restore(flags); 64858eddac3fSPeter Zijlstra } 64868eddac3fSPeter Zijlstra 6487a0b0fd53SBart Van Assche /* 6488a0b0fd53SBart Van Assche * Reset a lock. Does not sleep. Ignores debug_locks. Must only be used by the 6489a0b0fd53SBart Van Assche * lockdep selftests. 6490a0b0fd53SBart Van Assche */ 6491a0b0fd53SBart Van Assche static void lockdep_reset_lock_imm(struct lockdep_map *lock) 6492a0b0fd53SBart Van Assche { 6493a0b0fd53SBart Van Assche struct pending_free *pf = delayed_free.pf; 6494a0b0fd53SBart Van Assche unsigned long flags; 6495a0b0fd53SBart Van Assche 6496a0b0fd53SBart Van Assche raw_local_irq_save(flags); 6497248efb21SPeter Zijlstra lockdep_lock(); 6498a0b0fd53SBart Van Assche __lockdep_reset_lock(pf, lock); 6499a0b0fd53SBart Van Assche __free_zapped_classes(pf); 6500248efb21SPeter Zijlstra lockdep_unlock(); 6501a0b0fd53SBart Van Assche raw_local_irq_restore(flags); 6502a0b0fd53SBart Van Assche } 6503a0b0fd53SBart Van Assche 6504a0b0fd53SBart Van Assche void lockdep_reset_lock(struct lockdep_map *lock) 6505a0b0fd53SBart Van Assche { 6506a0b0fd53SBart Van Assche init_data_structures_once(); 6507a0b0fd53SBart Van Assche 6508a0b0fd53SBart Van Assche if (inside_selftest()) 6509a0b0fd53SBart Van Assche lockdep_reset_lock_imm(lock); 6510a0b0fd53SBart Van Assche else 6511a0b0fd53SBart Van Assche lockdep_reset_lock_reg(lock); 6512a0b0fd53SBart Van Assche } 6513a0b0fd53SBart Van Assche 651461cc4534SWaiman Long /* 651561cc4534SWaiman Long * Unregister a dynamically allocated key. 651661cc4534SWaiman Long * 651761cc4534SWaiman Long * Unlike lockdep_register_key(), a search is always done to find a matching 651861cc4534SWaiman Long * key irrespective of debug_locks to avoid potential invalid access to freed 651961cc4534SWaiman Long * memory in lock_class entry. 652061cc4534SWaiman Long */ 6521108c1485SBart Van Assche void lockdep_unregister_key(struct lock_class_key *key) 6522108c1485SBart Van Assche { 6523108c1485SBart Van Assche struct hlist_head *hash_head = keyhashentry(key); 6524108c1485SBart Van Assche struct lock_class_key *k; 6525108c1485SBart Van Assche struct pending_free *pf; 6526108c1485SBart Van Assche unsigned long flags; 6527108c1485SBart Van Assche bool found = false; 6528108c1485SBart Van Assche 6529108c1485SBart Van Assche might_sleep(); 6530108c1485SBart Van Assche 6531108c1485SBart Van Assche if (WARN_ON_ONCE(static_obj(key))) 6532108c1485SBart Van Assche return; 6533108c1485SBart Van Assche 6534108c1485SBart Van Assche raw_local_irq_save(flags); 653561cc4534SWaiman Long lockdep_lock(); 65368b39adbeSBart Van Assche 6537108c1485SBart Van Assche hlist_for_each_entry_rcu(k, hash_head, hash_entry) { 6538108c1485SBart Van Assche if (k == key) { 6539108c1485SBart Van Assche hlist_del_rcu(&k->hash_entry); 6540108c1485SBart Van Assche found = true; 6541108c1485SBart Van Assche break; 6542108c1485SBart Van Assche } 6543108c1485SBart Van Assche } 654461cc4534SWaiman Long WARN_ON_ONCE(!found && debug_locks); 654561cc4534SWaiman Long if (found) { 654661cc4534SWaiman Long pf = get_pending_free(); 6547108c1485SBart Van Assche __lockdep_free_key_range(pf, key, 1); 6548108c1485SBart Van Assche call_rcu_zapped(pf); 654961cc4534SWaiman Long } 655061cc4534SWaiman Long lockdep_unlock(); 6551108c1485SBart Van Assche raw_local_irq_restore(flags); 6552108c1485SBart Van Assche 6553108c1485SBart Van Assche /* Wait until is_dynamic_key() has finished accessing k->hash_entry. */ 6554108c1485SBart Van Assche synchronize_rcu(); 6555108c1485SBart Van Assche } 6556108c1485SBart Van Assche EXPORT_SYMBOL_GPL(lockdep_unregister_key); 6557108c1485SBart Van Assche 6558c3bc8fd6SJoel Fernandes (Google) void __init lockdep_init(void) 65598eddac3fSPeter Zijlstra { 65608eddac3fSPeter Zijlstra printk("Lock dependency validator: Copyright (c) 2006 Red Hat, Inc., Ingo Molnar\n"); 65618eddac3fSPeter Zijlstra 65628eddac3fSPeter Zijlstra printk("... MAX_LOCKDEP_SUBCLASSES: %lu\n", MAX_LOCKDEP_SUBCLASSES); 65638eddac3fSPeter Zijlstra printk("... MAX_LOCK_DEPTH: %lu\n", MAX_LOCK_DEPTH); 65648eddac3fSPeter Zijlstra printk("... MAX_LOCKDEP_KEYS: %lu\n", MAX_LOCKDEP_KEYS); 65658eddac3fSPeter Zijlstra printk("... CLASSHASH_SIZE: %lu\n", CLASSHASH_SIZE); 65668eddac3fSPeter Zijlstra printk("... MAX_LOCKDEP_ENTRIES: %lu\n", MAX_LOCKDEP_ENTRIES); 65678eddac3fSPeter Zijlstra printk("... MAX_LOCKDEP_CHAINS: %lu\n", MAX_LOCKDEP_CHAINS); 65688eddac3fSPeter Zijlstra printk("... CHAINHASH_SIZE: %lu\n", CHAINHASH_SIZE); 65698eddac3fSPeter Zijlstra 657009d75ecbSBart Van Assche printk(" memory used by lock dependency info: %zu kB\n", 65717ff8517eSBart Van Assche (sizeof(lock_classes) + 657201bb6f0aSYuyang Du sizeof(lock_classes_in_use) + 65737ff8517eSBart Van Assche sizeof(classhash_table) + 65747ff8517eSBart Van Assche sizeof(list_entries) + 6575ace35a7aSBart Van Assche sizeof(list_entries_in_use) + 6576a0b0fd53SBart Van Assche sizeof(chainhash_table) + 6577a0b0fd53SBart Van Assche sizeof(delayed_free) 65788eddac3fSPeter Zijlstra #ifdef CONFIG_PROVE_LOCKING 65797ff8517eSBart Van Assche + sizeof(lock_cq) 658015ea86b5SBart Van Assche + sizeof(lock_chains) 6581de4643a7SBart Van Assche + sizeof(lock_chains_in_use) 658215ea86b5SBart Van Assche + sizeof(chain_hlocks) 65838eddac3fSPeter Zijlstra #endif 65848eddac3fSPeter Zijlstra ) / 1024 65858eddac3fSPeter Zijlstra ); 65868eddac3fSPeter Zijlstra 658712593b74SBart Van Assche #if defined(CONFIG_TRACE_IRQFLAGS) && defined(CONFIG_PROVE_LOCKING) 658812593b74SBart Van Assche printk(" memory used for stack traces: %zu kB\n", 658912593b74SBart Van Assche (sizeof(stack_trace) + sizeof(stack_trace_hash)) / 1024 659012593b74SBart Van Assche ); 659112593b74SBart Van Assche #endif 659212593b74SBart Van Assche 659309d75ecbSBart Van Assche printk(" per task-struct memory footprint: %zu bytes\n", 65947ff8517eSBart Van Assche sizeof(((struct task_struct *)NULL)->held_locks)); 65958eddac3fSPeter Zijlstra } 65968eddac3fSPeter Zijlstra 65978eddac3fSPeter Zijlstra static void 65988eddac3fSPeter Zijlstra print_freed_lock_bug(struct task_struct *curr, const void *mem_from, 65998eddac3fSPeter Zijlstra const void *mem_to, struct held_lock *hlock) 66008eddac3fSPeter Zijlstra { 66018eddac3fSPeter Zijlstra if (!debug_locks_off()) 66028eddac3fSPeter Zijlstra return; 66038eddac3fSPeter Zijlstra if (debug_locks_silent) 66048eddac3fSPeter Zijlstra return; 66058eddac3fSPeter Zijlstra 6606*59cd94efSJohn Ogness nbcon_cpu_emergency_enter(); 6607*59cd94efSJohn Ogness 6608681fbec8SPaul E. McKenney pr_warn("\n"); 6609a5dd63efSPaul E. McKenney pr_warn("=========================\n"); 6610a5dd63efSPaul E. McKenney pr_warn("WARNING: held lock freed!\n"); 66118eddac3fSPeter Zijlstra print_kernel_ident(); 6612a5dd63efSPaul E. McKenney pr_warn("-------------------------\n"); 661304860d48SBorislav Petkov pr_warn("%s/%d is freeing memory %px-%px, with a lock still held there!\n", 66148eddac3fSPeter Zijlstra curr->comm, task_pid_nr(curr), mem_from, mem_to-1); 66158eddac3fSPeter Zijlstra print_lock(hlock); 66168eddac3fSPeter Zijlstra lockdep_print_held_locks(curr); 66178eddac3fSPeter Zijlstra 6618681fbec8SPaul E. McKenney pr_warn("\nstack backtrace:\n"); 66198eddac3fSPeter Zijlstra dump_stack(); 6620*59cd94efSJohn Ogness 6621*59cd94efSJohn Ogness nbcon_cpu_emergency_exit(); 66228eddac3fSPeter Zijlstra } 66238eddac3fSPeter Zijlstra 66248eddac3fSPeter Zijlstra static inline int not_in_range(const void* mem_from, unsigned long mem_len, 66258eddac3fSPeter Zijlstra const void* lock_from, unsigned long lock_len) 66268eddac3fSPeter Zijlstra { 66278eddac3fSPeter Zijlstra return lock_from + lock_len <= mem_from || 66288eddac3fSPeter Zijlstra mem_from + mem_len <= lock_from; 66298eddac3fSPeter Zijlstra } 66308eddac3fSPeter Zijlstra 66318eddac3fSPeter Zijlstra /* 66328eddac3fSPeter Zijlstra * Called when kernel memory is freed (or unmapped), or if a lock 66338eddac3fSPeter Zijlstra * is destroyed or reinitialized - this code checks whether there is 66348eddac3fSPeter Zijlstra * any held lock in the memory range of <from> to <to>: 66358eddac3fSPeter Zijlstra */ 66368eddac3fSPeter Zijlstra void debug_check_no_locks_freed(const void *mem_from, unsigned long mem_len) 66378eddac3fSPeter Zijlstra { 66388eddac3fSPeter Zijlstra struct task_struct *curr = current; 66398eddac3fSPeter Zijlstra struct held_lock *hlock; 66408eddac3fSPeter Zijlstra unsigned long flags; 66418eddac3fSPeter Zijlstra int i; 66428eddac3fSPeter Zijlstra 66438eddac3fSPeter Zijlstra if (unlikely(!debug_locks)) 66448eddac3fSPeter Zijlstra return; 66458eddac3fSPeter Zijlstra 6646fcc784beSSteven Rostedt (VMware) raw_local_irq_save(flags); 66478eddac3fSPeter Zijlstra for (i = 0; i < curr->lockdep_depth; i++) { 66488eddac3fSPeter Zijlstra hlock = curr->held_locks + i; 66498eddac3fSPeter Zijlstra 66508eddac3fSPeter Zijlstra if (not_in_range(mem_from, mem_len, hlock->instance, 66518eddac3fSPeter Zijlstra sizeof(*hlock->instance))) 66528eddac3fSPeter Zijlstra continue; 66538eddac3fSPeter Zijlstra 66548eddac3fSPeter Zijlstra print_freed_lock_bug(curr, mem_from, mem_from + mem_len, hlock); 66558eddac3fSPeter Zijlstra break; 66568eddac3fSPeter Zijlstra } 6657fcc784beSSteven Rostedt (VMware) raw_local_irq_restore(flags); 66588eddac3fSPeter Zijlstra } 66598eddac3fSPeter Zijlstra EXPORT_SYMBOL_GPL(debug_check_no_locks_freed); 66608eddac3fSPeter Zijlstra 66618eddac3fSPeter Zijlstra static void print_held_locks_bug(void) 66628eddac3fSPeter Zijlstra { 66638eddac3fSPeter Zijlstra if (!debug_locks_off()) 66648eddac3fSPeter Zijlstra return; 66658eddac3fSPeter Zijlstra if (debug_locks_silent) 66668eddac3fSPeter Zijlstra return; 66678eddac3fSPeter Zijlstra 6668*59cd94efSJohn Ogness nbcon_cpu_emergency_enter(); 6669*59cd94efSJohn Ogness 6670681fbec8SPaul E. McKenney pr_warn("\n"); 6671a5dd63efSPaul E. McKenney pr_warn("====================================\n"); 6672a5dd63efSPaul E. McKenney pr_warn("WARNING: %s/%d still has locks held!\n", 66738eddac3fSPeter Zijlstra current->comm, task_pid_nr(current)); 66748eddac3fSPeter Zijlstra print_kernel_ident(); 6675a5dd63efSPaul E. McKenney pr_warn("------------------------------------\n"); 66768eddac3fSPeter Zijlstra lockdep_print_held_locks(current); 6677681fbec8SPaul E. McKenney pr_warn("\nstack backtrace:\n"); 66788eddac3fSPeter Zijlstra dump_stack(); 6679*59cd94efSJohn Ogness 6680*59cd94efSJohn Ogness nbcon_cpu_emergency_exit(); 66818eddac3fSPeter Zijlstra } 66828eddac3fSPeter Zijlstra 66838eddac3fSPeter Zijlstra void debug_check_no_locks_held(void) 66848eddac3fSPeter Zijlstra { 66858eddac3fSPeter Zijlstra if (unlikely(current->lockdep_depth > 0)) 66868eddac3fSPeter Zijlstra print_held_locks_bug(); 66878eddac3fSPeter Zijlstra } 66888eddac3fSPeter Zijlstra EXPORT_SYMBOL_GPL(debug_check_no_locks_held); 66898eddac3fSPeter Zijlstra 66908dce7a9aSSasha Levin #ifdef __KERNEL__ 66918eddac3fSPeter Zijlstra void debug_show_all_locks(void) 66928eddac3fSPeter Zijlstra { 66938eddac3fSPeter Zijlstra struct task_struct *g, *p; 66948eddac3fSPeter Zijlstra 66958eddac3fSPeter Zijlstra if (unlikely(!debug_locks)) { 6696681fbec8SPaul E. McKenney pr_warn("INFO: lockdep is turned off.\n"); 66978eddac3fSPeter Zijlstra return; 66988eddac3fSPeter Zijlstra } 6699681fbec8SPaul E. McKenney pr_warn("\nShowing all locks held in the system:\n"); 67008eddac3fSPeter Zijlstra 67010f736a52STetsuo Handa rcu_read_lock(); 67020f736a52STetsuo Handa for_each_process_thread(g, p) { 67030f736a52STetsuo Handa if (!p->lockdep_depth) 67040f736a52STetsuo Handa continue; 67058eddac3fSPeter Zijlstra lockdep_print_held_locks(p); 670688f1c87dSTejun Heo touch_nmi_watchdog(); 67070f736a52STetsuo Handa touch_all_softlockup_watchdogs(); 67080f736a52STetsuo Handa } 67090f736a52STetsuo Handa rcu_read_unlock(); 67108eddac3fSPeter Zijlstra 6711681fbec8SPaul E. McKenney pr_warn("\n"); 6712a5dd63efSPaul E. McKenney pr_warn("=============================================\n\n"); 67138eddac3fSPeter Zijlstra } 67148eddac3fSPeter Zijlstra EXPORT_SYMBOL_GPL(debug_show_all_locks); 67158dce7a9aSSasha Levin #endif 67168eddac3fSPeter Zijlstra 67178eddac3fSPeter Zijlstra /* 67188eddac3fSPeter Zijlstra * Careful: only use this function if you are sure that 67198eddac3fSPeter Zijlstra * the task cannot run in parallel! 67208eddac3fSPeter Zijlstra */ 67218eddac3fSPeter Zijlstra void debug_show_held_locks(struct task_struct *task) 67228eddac3fSPeter Zijlstra { 67238eddac3fSPeter Zijlstra if (unlikely(!debug_locks)) { 67248eddac3fSPeter Zijlstra printk("INFO: lockdep is turned off.\n"); 67258eddac3fSPeter Zijlstra return; 67268eddac3fSPeter Zijlstra } 67278eddac3fSPeter Zijlstra lockdep_print_held_locks(task); 67288eddac3fSPeter Zijlstra } 67298eddac3fSPeter Zijlstra EXPORT_SYMBOL_GPL(debug_show_held_locks); 67308eddac3fSPeter Zijlstra 6731722a9f92SAndi Kleen asmlinkage __visible void lockdep_sys_exit(void) 67328eddac3fSPeter Zijlstra { 67338eddac3fSPeter Zijlstra struct task_struct *curr = current; 67348eddac3fSPeter Zijlstra 67358eddac3fSPeter Zijlstra if (unlikely(curr->lockdep_depth)) { 67368eddac3fSPeter Zijlstra if (!debug_locks_off()) 67378eddac3fSPeter Zijlstra return; 6738*59cd94efSJohn Ogness nbcon_cpu_emergency_enter(); 6739681fbec8SPaul E. McKenney pr_warn("\n"); 6740a5dd63efSPaul E. McKenney pr_warn("================================================\n"); 6741a5dd63efSPaul E. McKenney pr_warn("WARNING: lock held when returning to user space!\n"); 67428eddac3fSPeter Zijlstra print_kernel_ident(); 6743a5dd63efSPaul E. McKenney pr_warn("------------------------------------------------\n"); 6744681fbec8SPaul E. McKenney pr_warn("%s/%d is leaving the kernel with locks still held!\n", 67458eddac3fSPeter Zijlstra curr->comm, curr->pid); 67468eddac3fSPeter Zijlstra lockdep_print_held_locks(curr); 6747*59cd94efSJohn Ogness nbcon_cpu_emergency_exit(); 67488eddac3fSPeter Zijlstra } 6749b09be676SByungchul Park 6750b09be676SByungchul Park /* 6751b09be676SByungchul Park * The lock history for each syscall should be independent. So wipe the 6752b09be676SByungchul Park * slate clean on return to userspace. 6753b09be676SByungchul Park */ 6754f52be570SPeter Zijlstra lockdep_invariant_state(false); 67558eddac3fSPeter Zijlstra } 67568eddac3fSPeter Zijlstra 67578eddac3fSPeter Zijlstra void lockdep_rcu_suspicious(const char *file, const int line, const char *s) 67588eddac3fSPeter Zijlstra { 67598eddac3fSPeter Zijlstra struct task_struct *curr = current; 67601feb2cc8SPaul E. McKenney int dl = READ_ONCE(debug_locks); 67615a5d7e9bSPeter Zijlstra bool rcu = warn_rcu_enter(); 67628eddac3fSPeter Zijlstra 67638eddac3fSPeter Zijlstra /* Note: the following can be executed concurrently, so be careful. */ 6764*59cd94efSJohn Ogness nbcon_cpu_emergency_enter(); 6765681fbec8SPaul E. McKenney pr_warn("\n"); 6766a5dd63efSPaul E. McKenney pr_warn("=============================\n"); 6767a5dd63efSPaul E. McKenney pr_warn("WARNING: suspicious RCU usage\n"); 67688eddac3fSPeter Zijlstra print_kernel_ident(); 6769a5dd63efSPaul E. McKenney pr_warn("-----------------------------\n"); 6770681fbec8SPaul E. McKenney pr_warn("%s:%d %s!\n", file, line, s); 6771681fbec8SPaul E. McKenney pr_warn("\nother info that might help us debug this:\n\n"); 67721feb2cc8SPaul E. McKenney pr_warn("\n%srcu_scheduler_active = %d, debug_locks = %d\n%s", 67738eddac3fSPeter Zijlstra !rcu_lockdep_current_cpu_online() 67748eddac3fSPeter Zijlstra ? "RCU used illegally from offline CPU!\n" 67758eddac3fSPeter Zijlstra : "", 67761feb2cc8SPaul E. McKenney rcu_scheduler_active, dl, 67771feb2cc8SPaul E. McKenney dl ? "" : "Possible false positive due to lockdep disabling via debug_locks = 0\n"); 67788eddac3fSPeter Zijlstra 67798eddac3fSPeter Zijlstra /* 67808eddac3fSPeter Zijlstra * If a CPU is in the RCU-free window in idle (ie: in the section 6781e67198ccSFrederic Weisbecker * between ct_idle_enter() and ct_idle_exit(), then RCU 67828eddac3fSPeter Zijlstra * considers that CPU to be in an "extended quiescent state", 67838eddac3fSPeter Zijlstra * which means that RCU will be completely ignoring that CPU. 67848eddac3fSPeter Zijlstra * Therefore, rcu_read_lock() and friends have absolutely no 67858eddac3fSPeter Zijlstra * effect on a CPU running in that state. In other words, even if 67868eddac3fSPeter Zijlstra * such an RCU-idle CPU has called rcu_read_lock(), RCU might well 67878eddac3fSPeter Zijlstra * delete data structures out from under it. RCU really has no 67888eddac3fSPeter Zijlstra * choice here: we need to keep an RCU-free window in idle where 67898eddac3fSPeter Zijlstra * the CPU may possibly enter into low power mode. This way we can 67908eddac3fSPeter Zijlstra * notice an extended quiescent state to other CPUs that started a grace 67918eddac3fSPeter Zijlstra * period. Otherwise we would delay any grace period as long as we run 67928eddac3fSPeter Zijlstra * in the idle task. 67938eddac3fSPeter Zijlstra * 67948eddac3fSPeter Zijlstra * So complain bitterly if someone does call rcu_read_lock(), 67958eddac3fSPeter Zijlstra * rcu_read_lock_bh() and so on from extended quiescent states. 67968eddac3fSPeter Zijlstra */ 67978eddac3fSPeter Zijlstra if (!rcu_is_watching()) 6798681fbec8SPaul E. McKenney pr_warn("RCU used illegally from extended quiescent state!\n"); 67998eddac3fSPeter Zijlstra 68008eddac3fSPeter Zijlstra lockdep_print_held_locks(curr); 6801681fbec8SPaul E. McKenney pr_warn("\nstack backtrace:\n"); 68028eddac3fSPeter Zijlstra dump_stack(); 6803*59cd94efSJohn Ogness nbcon_cpu_emergency_exit(); 68045a5d7e9bSPeter Zijlstra warn_rcu_exit(rcu); 68058eddac3fSPeter Zijlstra } 68068eddac3fSPeter Zijlstra EXPORT_SYMBOL_GPL(lockdep_rcu_suspicious); 6807