diff options
Diffstat (limited to 'kernel/lockdep.c')
-rw-r--r-- | kernel/lockdep.c | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/kernel/lockdep.c b/kernel/lockdep.c index 0d2058da80f..e0841c537db 100644 --- a/kernel/lockdep.c +++ b/kernel/lockdep.c @@ -49,6 +49,8 @@ #include "lockdep_internals.h" +#include <trace/lockdep.h> + #define CREATE_TRACE_POINTS #include <trace/events/lock.h> @@ -66,6 +68,13 @@ module_param(lock_stat, int, 0644); #define lock_stat 0 #endif +DEFINE_TRACE(lockdep_hardirqs_on); +DEFINE_TRACE(lockdep_hardirqs_off); +DEFINE_TRACE(lockdep_softirqs_on); +DEFINE_TRACE(lockdep_softirqs_off); +DEFINE_TRACE(lockdep_lock_acquire); +DEFINE_TRACE(lockdep_lock_release); + /* * lockdep_lock: protects the lockdep graph, the hashes and the * class/list/hash allocators. @@ -2300,6 +2309,8 @@ void trace_hardirqs_on_caller(unsigned long ip) time_hardirqs_on(CALLER_ADDR0, ip); + trace_lockdep_hardirqs_on(ip); + if (unlikely(!debug_locks || current->lockdep_recursion)) return; @@ -2358,6 +2369,8 @@ void trace_hardirqs_off_caller(unsigned long ip) time_hardirqs_off(CALLER_ADDR0, ip); + trace_lockdep_hardirqs_off(ip); + if (unlikely(!debug_locks || current->lockdep_recursion)) return; @@ -2390,6 +2403,8 @@ void trace_softirqs_on(unsigned long ip) { struct task_struct *curr = current; + trace_lockdep_softirqs_on(ip); + if (unlikely(!debug_locks)) return; @@ -2424,6 +2439,8 @@ void trace_softirqs_off(unsigned long ip) { struct task_struct *curr = current; + trace_lockdep_softirqs_off(ip); + if (unlikely(!debug_locks)) return; @@ -2730,6 +2747,9 @@ static int __lock_acquire(struct lockdep_map *lock, unsigned int subclass, int class_idx; u64 chain_key; + trace_lockdep_lock_acquire(ip, subclass, lock, trylock, read, + hardirqs_off); + if (!prove_locking) check = 1; @@ -3108,6 +3128,8 @@ __lock_release(struct lockdep_map *lock, int nested, unsigned long ip) { struct task_struct *curr = current; + trace_lockdep_lock_release(ip, lock, nested); + if (!check_unlock(curr, lock, ip)) return; |