diff options
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/lockdep.c | 23 |
1 files changed, 19 insertions, 4 deletions
diff --git a/kernel/lockdep.c b/kernel/lockdep.c index 509efd49540f..2d616f4d853c 100644 --- a/kernel/lockdep.c +++ b/kernel/lockdep.c | |||
@@ -70,6 +70,9 @@ static int graph_lock(void) | |||
70 | 70 | ||
71 | static inline int graph_unlock(void) | 71 | static inline int graph_unlock(void) |
72 | { | 72 | { |
73 | if (debug_locks && !__raw_spin_is_locked(&lockdep_lock)) | ||
74 | return DEBUG_LOCKS_WARN_ON(1); | ||
75 | |||
73 | __raw_spin_unlock(&lockdep_lock); | 76 | __raw_spin_unlock(&lockdep_lock); |
74 | return 0; | 77 | return 0; |
75 | } | 78 | } |
@@ -712,6 +715,9 @@ find_usage_backwards(struct lock_class *source, unsigned int depth) | |||
712 | struct lock_list *entry; | 715 | struct lock_list *entry; |
713 | int ret; | 716 | int ret; |
714 | 717 | ||
718 | if (!__raw_spin_is_locked(&lockdep_lock)) | ||
719 | return DEBUG_LOCKS_WARN_ON(1); | ||
720 | |||
715 | if (depth > max_recursion_depth) | 721 | if (depth > max_recursion_depth) |
716 | max_recursion_depth = depth; | 722 | max_recursion_depth = depth; |
717 | if (depth >= RECURSION_LIMIT) | 723 | if (depth >= RECURSION_LIMIT) |
@@ -1293,7 +1299,8 @@ out_unlock_set: | |||
1293 | if (!subclass || force) | 1299 | if (!subclass || force) |
1294 | lock->class_cache = class; | 1300 | lock->class_cache = class; |
1295 | 1301 | ||
1296 | DEBUG_LOCKS_WARN_ON(class->subclass != subclass); | 1302 | if (DEBUG_LOCKS_WARN_ON(class->subclass != subclass)) |
1303 | return NULL; | ||
1297 | 1304 | ||
1298 | return class; | 1305 | return class; |
1299 | } | 1306 | } |
@@ -1308,7 +1315,8 @@ static inline int lookup_chain_cache(u64 chain_key, struct lock_class *class) | |||
1308 | struct list_head *hash_head = chainhashentry(chain_key); | 1315 | struct list_head *hash_head = chainhashentry(chain_key); |
1309 | struct lock_chain *chain; | 1316 | struct lock_chain *chain; |
1310 | 1317 | ||
1311 | DEBUG_LOCKS_WARN_ON(!irqs_disabled()); | 1318 | if (DEBUG_LOCKS_WARN_ON(!irqs_disabled())) |
1319 | return 0; | ||
1312 | /* | 1320 | /* |
1313 | * We can walk it lock-free, because entries only get added | 1321 | * We can walk it lock-free, because entries only get added |
1314 | * to the hash: | 1322 | * to the hash: |
@@ -1394,7 +1402,9 @@ static void check_chain_key(struct task_struct *curr) | |||
1394 | return; | 1402 | return; |
1395 | } | 1403 | } |
1396 | id = hlock->class - lock_classes; | 1404 | id = hlock->class - lock_classes; |
1397 | DEBUG_LOCKS_WARN_ON(id >= MAX_LOCKDEP_KEYS); | 1405 | if (DEBUG_LOCKS_WARN_ON(id >= MAX_LOCKDEP_KEYS)) |
1406 | return; | ||
1407 | |||
1398 | if (prev_hlock && (prev_hlock->irq_context != | 1408 | if (prev_hlock && (prev_hlock->irq_context != |
1399 | hlock->irq_context)) | 1409 | hlock->irq_context)) |
1400 | chain_key = 0; | 1410 | chain_key = 0; |
@@ -2205,7 +2215,11 @@ out_calc_hash: | |||
2205 | if (!check_prevs_add(curr, hlock)) | 2215 | if (!check_prevs_add(curr, hlock)) |
2206 | return 0; | 2216 | return 0; |
2207 | graph_unlock(); | 2217 | graph_unlock(); |
2208 | } | 2218 | } else |
2219 | /* after lookup_chain_cache(): */ | ||
2220 | if (unlikely(!debug_locks)) | ||
2221 | return 0; | ||
2222 | |||
2209 | curr->lockdep_depth++; | 2223 | curr->lockdep_depth++; |
2210 | check_chain_key(curr); | 2224 | check_chain_key(curr); |
2211 | if (unlikely(curr->lockdep_depth >= MAX_LOCK_DEPTH)) { | 2225 | if (unlikely(curr->lockdep_depth >= MAX_LOCK_DEPTH)) { |
@@ -2214,6 +2228,7 @@ out_calc_hash: | |||
2214 | printk("turning off the locking correctness validator.\n"); | 2228 | printk("turning off the locking correctness validator.\n"); |
2215 | return 0; | 2229 | return 0; |
2216 | } | 2230 | } |
2231 | |||
2217 | if (unlikely(curr->lockdep_depth > max_lockdep_depth)) | 2232 | if (unlikely(curr->lockdep_depth > max_lockdep_depth)) |
2218 | max_lockdep_depth = curr->lockdep_depth; | 2233 | max_lockdep_depth = curr->lockdep_depth; |
2219 | 2234 | ||