Loading include/linux/lockdep.h +8 −0 Original line number Diff line number Diff line Loading @@ -296,6 +296,10 @@ extern void lock_acquire(struct lockdep_map *lock, unsigned int subclass, extern void lock_release(struct lockdep_map *lock, int nested, unsigned long ip); #define lockdep_is_held(lock) lock_is_held(&(lock)->dep_map) extern int lock_is_held(struct lockdep_map *lock); extern void lock_set_class(struct lockdep_map *lock, const char *name, struct lock_class_key *key, unsigned int subclass, unsigned long ip); Loading @@ -314,6 +318,8 @@ extern void lockdep_trace_alloc(gfp_t mask); #define lockdep_depth(tsk) (debug_locks ? (tsk)->lockdep_depth : 0) #define lockdep_assert_held(l) WARN_ON(debug_locks && !lockdep_is_held(l)) #else /* !LOCKDEP */ static inline void lockdep_off(void) Loading Loading @@ -358,6 +364,8 @@ struct lock_class_key { }; #define lockdep_depth(tsk) (0) #define lockdep_assert_held(l) do { } while (0) #endif /* !LOCKDEP */ #ifdef CONFIG_LOCK_STAT Loading kernel/lockdep.c +33 −0 Original line number Diff line number Diff line Loading @@ -3059,6 +3059,19 @@ __lock_release(struct lockdep_map *lock, int nested, unsigned long ip) check_chain_key(curr); } static int __lock_is_held(struct lockdep_map *lock) { struct task_struct *curr = current; int i; for (i = 0; i < curr->lockdep_depth; i++) { if (curr->held_locks[i].instance == lock) return 1; } return 0; } /* * Check whether we follow the irq-flags state precisely: */ Loading Loading @@ -3160,6 +3173,26 @@ void lock_release(struct lockdep_map *lock, int nested, } EXPORT_SYMBOL_GPL(lock_release); int lock_is_held(struct lockdep_map *lock) { unsigned long flags; int ret = 0; if (unlikely(current->lockdep_recursion)) return ret; raw_local_irq_save(flags); check_flags(flags); current->lockdep_recursion = 1; ret = __lock_is_held(lock); current->lockdep_recursion = 0; raw_local_irq_restore(flags); return ret; } EXPORT_SYMBOL_GPL(lock_is_held); void lockdep_set_current_reclaim_state(gfp_t gfp_mask) { current->lockdep_reclaim_gfp = gfp_mask; Loading kernel/sched.c +2 −0 Original line number Diff line number Diff line Loading @@ -6609,6 +6609,8 @@ int cond_resched_lock(spinlock_t *lock) int resched = should_resched(); int ret = 0; lockdep_assert_held(lock); if (spin_needbreak(lock) || resched) { spin_unlock(lock); if (resched) Loading Loading
include/linux/lockdep.h +8 −0 Original line number Diff line number Diff line Loading @@ -296,6 +296,10 @@ extern void lock_acquire(struct lockdep_map *lock, unsigned int subclass, extern void lock_release(struct lockdep_map *lock, int nested, unsigned long ip); #define lockdep_is_held(lock) lock_is_held(&(lock)->dep_map) extern int lock_is_held(struct lockdep_map *lock); extern void lock_set_class(struct lockdep_map *lock, const char *name, struct lock_class_key *key, unsigned int subclass, unsigned long ip); Loading @@ -314,6 +318,8 @@ extern void lockdep_trace_alloc(gfp_t mask); #define lockdep_depth(tsk) (debug_locks ? (tsk)->lockdep_depth : 0) #define lockdep_assert_held(l) WARN_ON(debug_locks && !lockdep_is_held(l)) #else /* !LOCKDEP */ static inline void lockdep_off(void) Loading Loading @@ -358,6 +364,8 @@ struct lock_class_key { }; #define lockdep_depth(tsk) (0) #define lockdep_assert_held(l) do { } while (0) #endif /* !LOCKDEP */ #ifdef CONFIG_LOCK_STAT Loading
kernel/lockdep.c +33 −0 Original line number Diff line number Diff line Loading @@ -3059,6 +3059,19 @@ __lock_release(struct lockdep_map *lock, int nested, unsigned long ip) check_chain_key(curr); } static int __lock_is_held(struct lockdep_map *lock) { struct task_struct *curr = current; int i; for (i = 0; i < curr->lockdep_depth; i++) { if (curr->held_locks[i].instance == lock) return 1; } return 0; } /* * Check whether we follow the irq-flags state precisely: */ Loading Loading @@ -3160,6 +3173,26 @@ void lock_release(struct lockdep_map *lock, int nested, } EXPORT_SYMBOL_GPL(lock_release); int lock_is_held(struct lockdep_map *lock) { unsigned long flags; int ret = 0; if (unlikely(current->lockdep_recursion)) return ret; raw_local_irq_save(flags); check_flags(flags); current->lockdep_recursion = 1; ret = __lock_is_held(lock); current->lockdep_recursion = 0; raw_local_irq_restore(flags); return ret; } EXPORT_SYMBOL_GPL(lock_is_held); void lockdep_set_current_reclaim_state(gfp_t gfp_mask) { current->lockdep_reclaim_gfp = gfp_mask; Loading
kernel/sched.c +2 −0 Original line number Diff line number Diff line Loading @@ -6609,6 +6609,8 @@ int cond_resched_lock(spinlock_t *lock) int resched = should_resched(); int ret = 0; lockdep_assert_held(lock); if (spin_needbreak(lock) || resched) { spin_unlock(lock); if (resched) Loading