aboutsummaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
authorPeter Zijlstra <a.p.zijlstra@chello.nl>2009-07-20 13:16:29 -0400
committerIngo Molnar <mingo@elte.hu>2009-08-02 09:41:34 -0400
commitf607c6685774811b8112e124f10a053d77015485 (patch)
tree4d32d967c8f8fb37ae09319735062a131a91725b /kernel
parent98c33eddaf41d225d99b40f9eedbd0fac4c08c05 (diff)
lockdep: Introduce lockdep_assert_held()
Add a lockdep helper to validate that we indeed are the owner of a lock. Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl> Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'kernel')
-rw-r--r--kernel/lockdep.c33
-rw-r--r--kernel/sched.c2
2 files changed, 35 insertions, 0 deletions
diff --git a/kernel/lockdep.c b/kernel/lockdep.c
index 4b6cebe8ab31..28914a509914 100644
--- a/kernel/lockdep.c
+++ b/kernel/lockdep.c
@@ -3059,6 +3059,19 @@ __lock_release(struct lockdep_map *lock, int nested, unsigned long ip)
3059 check_chain_key(curr); 3059 check_chain_key(curr);
3060} 3060}
3061 3061
3062static int __lock_is_held(struct lockdep_map *lock)
3063{
3064 struct task_struct *curr = current;
3065 int i;
3066
3067 for (i = 0; i < curr->lockdep_depth; i++) {
3068 if (curr->held_locks[i].instance == lock)
3069 return 1;
3070 }
3071
3072 return 0;
3073}
3074
3062/* 3075/*
3063 * Check whether we follow the irq-flags state precisely: 3076 * Check whether we follow the irq-flags state precisely:
3064 */ 3077 */
@@ -3160,6 +3173,26 @@ void lock_release(struct lockdep_map *lock, int nested,
3160} 3173}
3161EXPORT_SYMBOL_GPL(lock_release); 3174EXPORT_SYMBOL_GPL(lock_release);
3162 3175
3176int lock_is_held(struct lockdep_map *lock)
3177{
3178 unsigned long flags;
3179 int ret = 0;
3180
3181 if (unlikely(current->lockdep_recursion))
3182 return ret;
3183
3184 raw_local_irq_save(flags);
3185 check_flags(flags);
3186
3187 current->lockdep_recursion = 1;
3188 ret = __lock_is_held(lock);
3189 current->lockdep_recursion = 0;
3190 raw_local_irq_restore(flags);
3191
3192 return ret;
3193}
3194EXPORT_SYMBOL_GPL(lock_is_held);
3195
3163void lockdep_set_current_reclaim_state(gfp_t gfp_mask) 3196void lockdep_set_current_reclaim_state(gfp_t gfp_mask)
3164{ 3197{
3165 current->lockdep_reclaim_gfp = gfp_mask; 3198 current->lockdep_reclaim_gfp = gfp_mask;
diff --git a/kernel/sched.c b/kernel/sched.c
index 1b59e265273b..2c75f7daa439 100644
--- a/kernel/sched.c
+++ b/kernel/sched.c
@@ -6609,6 +6609,8 @@ int cond_resched_lock(spinlock_t *lock)
6609 int resched = should_resched(); 6609 int resched = should_resched();
6610 int ret = 0; 6610 int ret = 0;
6611 6611
6612 lockdep_assert_held(lock);
6613
6612 if (spin_needbreak(lock) || resched) { 6614 if (spin_needbreak(lock) || resched) {
6613 spin_unlock(lock); 6615 spin_unlock(lock);
6614 if (resched) 6616 if (resched)