diff options
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/lockdep.c | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/kernel/lockdep.c b/kernel/lockdep.c index 0bb246e21cd7..2b443b5090a1 100644 --- a/kernel/lockdep.c +++ b/kernel/lockdep.c | |||
@@ -861,14 +861,15 @@ struct circular_queue { | |||
861 | }; | 861 | }; |
862 | 862 | ||
863 | static struct circular_queue lock_cq; | 863 | static struct circular_queue lock_cq; |
864 | static unsigned long bfs_accessed[BITS_TO_LONGS(MAX_LOCKDEP_ENTRIES)]; | ||
865 | 864 | ||
866 | unsigned int max_bfs_queue_depth; | 865 | unsigned int max_bfs_queue_depth; |
867 | 866 | ||
867 | static unsigned int lockdep_dependency_gen_id; | ||
868 | |||
868 | static inline void __cq_init(struct circular_queue *cq) | 869 | static inline void __cq_init(struct circular_queue *cq) |
869 | { | 870 | { |
870 | cq->front = cq->rear = 0; | 871 | cq->front = cq->rear = 0; |
871 | bitmap_zero(bfs_accessed, MAX_LOCKDEP_ENTRIES); | 872 | lockdep_dependency_gen_id++; |
872 | } | 873 | } |
873 | 874 | ||
874 | static inline int __cq_empty(struct circular_queue *cq) | 875 | static inline int __cq_empty(struct circular_queue *cq) |
@@ -914,7 +915,7 @@ static inline void mark_lock_accessed(struct lock_list *lock, | |||
914 | nr = lock - list_entries; | 915 | nr = lock - list_entries; |
915 | WARN_ON(nr >= nr_list_entries); | 916 | WARN_ON(nr >= nr_list_entries); |
916 | lock->parent = parent; | 917 | lock->parent = parent; |
917 | set_bit(nr, bfs_accessed); | 918 | lock->class->dep_gen_id = lockdep_dependency_gen_id; |
918 | } | 919 | } |
919 | 920 | ||
920 | static inline unsigned long lock_accessed(struct lock_list *lock) | 921 | static inline unsigned long lock_accessed(struct lock_list *lock) |
@@ -923,7 +924,7 @@ static inline unsigned long lock_accessed(struct lock_list *lock) | |||
923 | 924 | ||
924 | nr = lock - list_entries; | 925 | nr = lock - list_entries; |
925 | WARN_ON(nr >= nr_list_entries); | 926 | WARN_ON(nr >= nr_list_entries); |
926 | return test_bit(nr, bfs_accessed); | 927 | return lock->class->dep_gen_id == lockdep_dependency_gen_id; |
927 | } | 928 | } |
928 | 929 | ||
929 | static inline struct lock_list *get_lock_parent(struct lock_list *child) | 930 | static inline struct lock_list *get_lock_parent(struct lock_list *child) |
@@ -3604,7 +3605,7 @@ void __init lockdep_info(void) | |||
3604 | sizeof(struct lock_chain) * MAX_LOCKDEP_CHAINS + | 3605 | sizeof(struct lock_chain) * MAX_LOCKDEP_CHAINS + |
3605 | sizeof(struct list_head) * CHAINHASH_SIZE) / 1024 | 3606 | sizeof(struct list_head) * CHAINHASH_SIZE) / 1024 |
3606 | #ifdef CONFIG_PROVE_LOCKING | 3607 | #ifdef CONFIG_PROVE_LOCKING |
3607 | + sizeof(struct circular_queue) + sizeof(bfs_accessed) | 3608 | + sizeof(struct circular_queue) |
3608 | #endif | 3609 | #endif |
3609 | ); | 3610 | ); |
3610 | 3611 | ||