diff options
Diffstat (limited to 'kernel/lockdep.c')
| -rw-r--r-- | kernel/lockdep.c | 21 |
1 files changed, 12 insertions, 9 deletions
diff --git a/kernel/lockdep.c b/kernel/lockdep.c index a8dc99d9fef7..cb64022851c8 100644 --- a/kernel/lockdep.c +++ b/kernel/lockdep.c | |||
| @@ -5,7 +5,8 @@ | |||
| 5 | * | 5 | * |
| 6 | * Started by Ingo Molnar: | 6 | * Started by Ingo Molnar: |
| 7 | * | 7 | * |
| 8 | * Copyright (C) 2006 Red Hat, Inc., Ingo Molnar <mingo@redhat.com> | 8 | * Copyright (C) 2006,2007 Red Hat, Inc., Ingo Molnar <mingo@redhat.com> |
| 9 | * Copyright (C) 2007 Red Hat, Inc., Peter Zijlstra <pzijlstr@redhat.com> | ||
| 9 | * | 10 | * |
| 10 | * this code maps all the lock dependencies as they occur in a live kernel | 11 | * this code maps all the lock dependencies as they occur in a live kernel |
| 11 | * and will warn about the following classes of locking bugs: | 12 | * and will warn about the following classes of locking bugs: |
| @@ -37,6 +38,7 @@ | |||
| 37 | #include <linux/debug_locks.h> | 38 | #include <linux/debug_locks.h> |
| 38 | #include <linux/irqflags.h> | 39 | #include <linux/irqflags.h> |
| 39 | #include <linux/utsname.h> | 40 | #include <linux/utsname.h> |
| 41 | #include <linux/hash.h> | ||
| 40 | 42 | ||
| 41 | #include <asm/sections.h> | 43 | #include <asm/sections.h> |
| 42 | 44 | ||
| @@ -238,8 +240,7 @@ LIST_HEAD(all_lock_classes); | |||
| 238 | */ | 240 | */ |
| 239 | #define CLASSHASH_BITS (MAX_LOCKDEP_KEYS_BITS - 1) | 241 | #define CLASSHASH_BITS (MAX_LOCKDEP_KEYS_BITS - 1) |
| 240 | #define CLASSHASH_SIZE (1UL << CLASSHASH_BITS) | 242 | #define CLASSHASH_SIZE (1UL << CLASSHASH_BITS) |
| 241 | #define CLASSHASH_MASK (CLASSHASH_SIZE - 1) | 243 | #define __classhashfn(key) hash_long((unsigned long)key, CLASSHASH_BITS) |
| 242 | #define __classhashfn(key) ((((unsigned long)key >> CLASSHASH_BITS) + (unsigned long)key) & CLASSHASH_MASK) | ||
| 243 | #define classhashentry(key) (classhash_table + __classhashfn((key))) | 244 | #define classhashentry(key) (classhash_table + __classhashfn((key))) |
| 244 | 245 | ||
| 245 | static struct list_head classhash_table[CLASSHASH_SIZE]; | 246 | static struct list_head classhash_table[CLASSHASH_SIZE]; |
| @@ -250,9 +251,7 @@ static struct list_head classhash_table[CLASSHASH_SIZE]; | |||
| 250 | */ | 251 | */ |
| 251 | #define CHAINHASH_BITS (MAX_LOCKDEP_CHAINS_BITS-1) | 252 | #define CHAINHASH_BITS (MAX_LOCKDEP_CHAINS_BITS-1) |
| 252 | #define CHAINHASH_SIZE (1UL << CHAINHASH_BITS) | 253 | #define CHAINHASH_SIZE (1UL << CHAINHASH_BITS) |
| 253 | #define CHAINHASH_MASK (CHAINHASH_SIZE - 1) | 254 | #define __chainhashfn(chain) hash_long(chain, CHAINHASH_BITS) |
| 254 | #define __chainhashfn(chain) \ | ||
| 255 | (((chain >> CHAINHASH_BITS) + chain) & CHAINHASH_MASK) | ||
| 256 | #define chainhashentry(chain) (chainhash_table + __chainhashfn((chain))) | 255 | #define chainhashentry(chain) (chainhash_table + __chainhashfn((chain))) |
| 257 | 256 | ||
| 258 | static struct list_head chainhash_table[CHAINHASH_SIZE]; | 257 | static struct list_head chainhash_table[CHAINHASH_SIZE]; |
| @@ -676,7 +675,8 @@ look_up_lock_class(struct lockdep_map *lock, unsigned int subclass) | |||
| 676 | * (or spin_lock_init()) call - which acts as the key. For static | 675 | * (or spin_lock_init()) call - which acts as the key. For static |
| 677 | * locks we use the lock object itself as the key. | 676 | * locks we use the lock object itself as the key. |
| 678 | */ | 677 | */ |
| 679 | BUILD_BUG_ON(sizeof(struct lock_class_key) > sizeof(struct lock_class)); | 678 | BUILD_BUG_ON(sizeof(struct lock_class_key) > |
| 679 | sizeof(struct lockdep_map)); | ||
| 680 | 680 | ||
| 681 | key = lock->key->subkeys + subclass; | 681 | key = lock->key->subkeys + subclass; |
| 682 | 682 | ||
| @@ -686,9 +686,12 @@ look_up_lock_class(struct lockdep_map *lock, unsigned int subclass) | |||
| 686 | * We can walk the hash lockfree, because the hash only | 686 | * We can walk the hash lockfree, because the hash only |
| 687 | * grows, and we are careful when adding entries to the end: | 687 | * grows, and we are careful when adding entries to the end: |
| 688 | */ | 688 | */ |
| 689 | list_for_each_entry(class, hash_head, hash_entry) | 689 | list_for_each_entry(class, hash_head, hash_entry) { |
| 690 | if (class->key == key) | 690 | if (class->key == key) { |
| 691 | WARN_ON_ONCE(class->name != lock->name); | ||
| 691 | return class; | 692 | return class; |
| 693 | } | ||
| 694 | } | ||
| 692 | 695 | ||
| 693 | return NULL; | 696 | return NULL; |
| 694 | } | 697 | } |
