This hooks into the preexisting lock definitions in the -rt kernel and
hijacks parts of lockdep for the object hash key.
bill
============================================================
--- include/linux/mutex.h d231debc2848a8344e1b04055ef22e489702e648
+++ include/linux/mutex.h 734c89362a3d77d460eb20eec3107e7b76fed938
@@ -15,6 +15,7 @@
#include <linux/rt_lock.h>
#include <linux/linkage.h>
#include <linux/lockdep.h>
+#include <linux/lock_stat.h>
#include <asm/atomic.h>
@@ -35,7 +36,8 @@ extern void
}
extern void
-_mutex_init(struct mutex *lock, char *name, struct lock_class_key *key);
+_mutex_init(struct mutex *lock, char *name, struct lock_class_key *key
+ __COMMA_LOCK_STAT_NOTE_PARAM_DECL);
extern void __lockfunc _mutex_lock(struct mutex *lock);
extern int __lockfunc _mutex_lock_interruptible(struct mutex *lock);
@@ -56,11 +58,15 @@ extern void __lockfunc _mutex_unlock(str
# define mutex_lock_nested(l, s) _mutex_lock(l)
#endif
+#define __mutex_init(l,n) __rt_mutex_init(&(l)->mutex, \
+ n \
+ __COMMA_LOCK_STAT_NOTE)
+
# define mutex_init(mutex) \
do { \
static struct lock_class_key __key; \
\
- _mutex_init((mutex), #mutex, &__key); \
+ _mutex_init((mutex), #mutex, &__key __COMMA_LOCK_STAT_NOTE); \
} while (0)
#else
============================================================
--- include/linux/rt_lock.h d7515027865666075d3e285bcec8c36e9b6cfc47
+++ include/linux/rt_lock.h 297792307de5b4aef2c7e472e2a32c727e5de3f1
@@ -13,6 +13,7 @@
#include <linux/rtmutex.h>
#include <asm/atomic.h>
#include <linux/spinlock_types.h>
+#include <linux/lock_stat.h>
#ifdef CONFIG_PREEMPT_RT
/*
@@ -28,8 +29,8 @@ typedef struct {
#ifdef CONFIG_DEBUG_RT_MUTEXES
# define __SPIN_LOCK_UNLOCKED(name) \
- (spinlock_t) { { .wait_lock = _RAW_SPIN_LOCK_UNLOCKED(name) \
- , .save_state = 1, .file = __FILE__, .line = __LINE__ } }
+ (spinlock_t) { .lock = { .wait_lock = _RAW_SPIN_LOCK_UNLOCKED(name) \
+ , .save_state = 1, .file = __FILE__, .line = __LINE__ __COMMA_LOCK_STAT_INITIALIZER} }
#else
# define __SPIN_LOCK_UNLOCKED(name) \
(spinlock_t) { { .wait_lock = _RAW_SPIN_LOCK_UNLOCKED(name) } }
@@ -92,7 +93,7 @@ typedef struct {
# ifdef CONFIG_DEBUG_RT_MUTEXES
# define __RW_LOCK_UNLOCKED(name) (rwlock_t) \
{ .lock = { .wait_lock = _RAW_SPIN_LOCK_UNLOCKED(name), \
- .save_state = 1, .file = __FILE__, .line = __LINE__ } }
+ .save_state = 1, .file = __FILE__, .line = __LINE__ __COMMA_LOCK_STAT_INITIALIZER } }
# else
# define __RW_LOCK_UNLOCKED(name) (rwlock_t) \
{ .lock = { .wait_lock = _RAW_SPIN_LOCK_UNLOCKED(name) } }
@@ -139,14 +140,16 @@ struct semaphore name = \
*/
#define DECLARE_MUTEX_LOCKED COMPAT_DECLARE_MUTEX_LOCKED
-extern void fastcall __sema_init(struct semaphore *sem, int val, char *name, char *file, int line);
+extern void fastcall __sema_init(struct semaphore *sem, int val, char *name
+ __COMMA_LOCK_STAT_FN_DECL, char *_file, int _line);
#define rt_sema_init(sem, val) \
- __sema_init(sem, val, #sem, __FILE__, __LINE__)
+ __sema_init(sem, val, #sem __COMMA_LOCK_STAT_NOTE_FN, __FILE__, __LINE__)
-extern void fastcall __init_MUTEX(struct semaphore *sem, char *name, char *file, int line);
+extern void fastcall __init_MUTEX(struct semaphore *sem, char *name
+ __COMMA_LOCK_STAT_FN_DECL, char *_file, int _line);
#define rt_init_MUTEX(sem) \
- __init_MUTEX(sem, #sem, __FILE__, __LINE__)
+ __init_MUTEX(sem, #sem __COMMA_LOCK_STAT_NOTE_FN, __FILE__, __LINE__)
extern void there_is_no_init_MUTEX_LOCKED_for_RT_semaphores(void);
@@ -247,13 +250,14 @@ extern void fastcall __rt_rwsem_init(str
struct rw_semaphore lockname = __RWSEM_INITIALIZER(lockname)
extern void fastcall __rt_rwsem_init(struct rw_semaphore *rwsem, char *name,
- struct lock_class_key *key);
+ struct lock_class_key *key
+ __COMMA_LOCK_STAT_NOTE_PARAM_DECL);
# define rt_init_rwsem(sem) \
do { \
static struct lock_class_key __key; \
\
- __rt_rwsem_init((sem), #sem, &__key); \
+ __rt_rwsem_init((sem), #sem, &__key __COMMA_LOCK_STAT_NOTE); \
} while (0)
extern void fastcall rt_down_write(struct rw_semaphore *rwsem);
============================================================
--- include/linux/rtmutex.h e6fa10297e6c20d27edba172aeb078a60c64488e
+++ include/linux/rtmutex.h 55cd2de44a52e049fa8a0da63bde6449cefeb8fe
@@ -15,6 +15,7 @@
#include <linux/linkage.h>
#include <linux/plist.h>
#include <linux/spinlock_types.h>
+#include <linux/lock_stat.h>
/*
* The rt_mutex structure
@@ -33,6 +34,9 @@ struct rt_mutex {
int line;
void *magic;
#endif
+#ifdef CONFIG_LOCK_STAT
+ struct lock_stat *lock_stat;
+#endif
};
struct rt_mutex_waiter;
@@ -54,11 +58,13 @@ struct hrtimer_sleeper;
#ifdef CONFIG_DEBUG_RT_MUTEXES
# define __DEBUG_RT_MUTEX_INITIALIZER(mutexname) \
, .name = #mutexname, .file = __FILE__, .line = __LINE__
-# define rt_mutex_init(mutex) __rt_mutex_init(mutex, __FUNCTION__)
+# define rt_mutex_init(mutex) __rt_mutex_init(mutex, __FUNCTION__ \
+ __COMMA_LOCK_STAT_NOTE_DECL_FLLN)
extern void rt_mutex_debug_task_free(struct task_struct *tsk);
#else
# define __DEBUG_RT_MUTEX_INITIALIZER(mutexname)
-# define rt_mutex_init(mutex) __rt_mutex_init(mutex, NULL)
+# define rt_mutex_init(mutex) __rt_mutex_init(mutex, NULL \
+ __COMMA_LOCK_STAT_NOTE_DECL_FLLN)
# define rt_mutex_debug_task_free(t) do { } while (0)
#endif
@@ -66,6 +72,7 @@ struct hrtimer_sleeper;
{ .wait_lock = RAW_SPIN_LOCK_UNLOCKED(mutexname) \
, .wait_list = PLIST_HEAD_INIT(mutexname.wait_list, mutexname.wait_lock) \
, .owner = NULL \
+ __COMMA_LOCK_STAT_INITIALIZER \
__DEBUG_RT_MUTEX_INITIALIZER(mutexname)}
#define DEFINE_RT_MUTEX(mutexname) \
@@ -82,10 +89,19 @@ static inline int rt_mutex_is_locked(str
return lock->owner != NULL;
}
-extern void __rt_mutex_init(struct rt_mutex *lock, const char *name);
+extern void __rt_mutex_init(struct rt_mutex *lock,
+ const char *name
+ __COMMA_LOCK_STAT_NOTE_PARAM_DECL);
+#ifdef CONFIG_LOCK_STAT
+extern void __rt_mutex_init_annotated(struct rt_mutex *lock, const char *name,
+ LOCK_STAT_NOTE_PARAM_DECL,
+ struct lock_stat *lsobject);
+#endif
+
extern void rt_mutex_destroy(struct rt_mutex *lock);
extern void rt_mutex_lock(struct rt_mutex *lock);
+
extern int rt_mutex_lock_interruptible(struct rt_mutex *lock,
int detect_deadlock);
extern int rt_mutex_timed_lock(struct rt_mutex *lock,
@@ -96,6 +112,20 @@ extern void rt_mutex_unlock(struct rt_mu
extern void rt_mutex_unlock(struct rt_mutex *lock);
+#ifdef CONFIG_LOCK_STAT
+extern void rt_mutex_lock_with_ip(struct rt_mutex *lock,
+ unsigned long ip);
+extern int rt_mutex_lock_interruptible_with_ip(struct rt_mutex *lock,
+ int detect_deadlock,
+ unsigned long ip);
+extern int rt_mutex_timed_lock_with_ip(struct rt_mutex *lock,
+ struct hrtimer_sleeper *timeout,
+ int detect_deadlock,
+ unsigned long ip);
+extern int rt_mutex_trylock_with_ip(struct rt_mutex *lock,
+ unsigned long ip);
+#endif
+
#ifdef CONFIG_RT_MUTEXES
# define INIT_RT_MUTEXES(tsk) \
.pi_waiters = PLIST_HEAD_INIT(tsk.pi_waiters, tsk.pi_lock), \
============================================================
--- include/linux/spinlock.h 14bc1c854dc566f95ef972f0821415de7630a573
+++ include/linux/spinlock.h f373183297a6575c36da57dbeed5d8631a7c604a
@@ -90,6 +90,7 @@
#include <linux/cache.h>
#include <linux/stringify.h>
#include <linux/irqflags.h>
+#include <linux/lock_stat.h>
#include <asm/system.h>
@@ -152,8 +153,17 @@ extern void
extern int __bad_rwlock_type(void);
extern void
-__rt_spin_lock_init(spinlock_t *lock, char *name, struct lock_class_key *key);
+__rt_spin_lock_init(spinlock_t *lock, char *name, struct lock_class_key *key
+ __COMMA_LOCK_STAT_NOTE_PARAM_DECL);
+#ifdef CONFIG_LOCK_STAT
+extern void
+__rt_spin_lock_init_annotated(spinlock_t *lock, char *name,
+ struct lock_class_key *key,
+ LOCK_STAT_NOTE_PARAM_DECL,
+ struct lock_stat *lsobject);
+#endif
+
extern void __lockfunc rt_spin_lock(spinlock_t *lock);
extern void __lockfunc rt_spin_lock_nested(spinlock_t *lock, int subclass);
extern void __lockfunc rt_spin_unlock(spinlock_t *lock);
@@ -170,6 +180,10 @@ extern void __lockfunc __rt_spin_unlock(
extern void __lockfunc __rt_spin_lock(struct rt_mutex *lock);
extern void __lockfunc __rt_spin_unlock(struct rt_mutex *lock);
+#ifdef CONFIG_LOCK_STAT
+extern void __lockfunc __rt_spin_lock_with_ip(struct rt_mutex *lock, unsigned long _ip);
+#endif
+
#ifdef CONFIG_PREEMPT_RT
# define _spin_lock(l) rt_spin_lock(l)
# define _spin_lock_nested(l, s) rt_spin_lock_nested(l, s)
@@ -216,9 +230,18 @@ do { \
do { \
static struct lock_class_key __key; \
\
- __rt_spin_lock_init(sl, n, &__key); \
+ __rt_spin_lock_init(sl, n, &__key __COMMA_LOCK_STAT_NOTE); \
} while (0)
+#ifdef CONFIG_LOCK_STAT
+#define _spin_lock_init_annotated(sl, n, f, l, lsobj) \
+do { \
+ static struct lock_class_key __key; \
+ \
+ __rt_spin_lock_init_annotated(sl, n, &__key, f, __func__, l, lsobj); \
+} while (0)
+#endif
+
# ifdef CONFIG_PREEMPT_RT
# define _spin_can_lock(l) (!rt_mutex_is_locked(&(l)->lock))
# define _spin_is_locked(l) rt_mutex_is_locked(&(l)->lock)
@@ -299,15 +322,31 @@ extern void
extern unsigned long __lockfunc rt_write_lock_irqsave(rwlock_t *rwlock);
extern unsigned long __lockfunc rt_read_lock_irqsave(rwlock_t *rwlock);
extern void
-__rt_rwlock_init(rwlock_t *rwlock, char *name, struct lock_class_key *key);
+__rt_rwlock_init(rwlock_t *rwlock, char *name, struct lock_class_key *key
+ __COMMA_LOCK_STAT_NOTE_PARAM_DECL);
#define _rwlock_init(rwl, n, f, l) \
do { \
static struct lock_class_key __key; \
\
- __rt_rwlock_init(rwl, n, &__key); \
+ __rt_rwlock_init(rwl, n, &__key __COMMA_LOCK_STAT_NOTE); \
} while (0)
+#ifdef CONFIG_LOCK_STAT
+extern void
+__rt_rwlock_init_annotated(rwlock_t *rwlock, char *name,
+ struct lock_class_key *key,
+ LOCK_STAT_NOTE_PARAM_DECL,
+ struct lock_stat *lsobject);
+
+#define _rwlock_init_annotated(rwl, n, f, l, lsobject) \
+do { \
+ static struct lock_class_key __key; \
+ \
+ __rt_rwlock_init(rwl, n, &__key, LOCK_STAT_NOTE, lsobject); \
+} while (0)
+#endif
+
#ifdef CONFIG_PREEMPT_RT
# define rt_read_can_lock(rwl) (!rt_mutex_is_locked(&(rwl)->lock))
# define rt_write_can_lock(rwl) (!rt_mutex_is_locked(&(rwl)->lock))
@@ -425,6 +464,19 @@ do { \
#define spin_lock_init(lock) PICK_OP_INIT(_lock_init, lock)
+#ifdef CONFIG_LOCK_STAT
+#define PICK_OP_INIT_ANNOTATED(op, lock, lsobj) \
+do { \
+ if (TYPE_EQUAL((lock), raw_spinlock_t)) \
+ _raw_spin##op((raw_spinlock_t *)(lock)); \
+ else if (TYPE_EQUAL(lock, spinlock_t)) \
+ _spin##op##_annotated((spinlock_t *)(lock), #lock, __FILE__, __LINE__, lsobj); \
+ else __bad_spinlock_type(); \
+} while (0)
+
+#define spin_lock_init_annotated(lock, lsobj) PICK_OP_INIT_ANNOTATED(_lock_init, lock, lsobj)
+#endif
+
#ifdef CONFIG_DEBUG_SPINLOCK
extern void __raw_rwlock_init(raw_rwlock_t *lock, const char *name,
struct lock_class_key *key);
============================================================
--- include/linux/wait.h 12da8de69f1f2660443a04c3df199e5d851ea2ca
+++ include/linux/wait.h 9b7448af82583bd11d18032aedfa8f2af44345f4
@@ -81,7 +81,7 @@ extern void init_waitqueue_head(wait_que
extern void init_waitqueue_head(wait_queue_head_t *q);
-#ifdef CONFIG_LOCKDEP
+#if defined(CONFIG_LOCKDEP) || defined(CONFIG_LOCK_STAT)
# define __WAIT_QUEUE_HEAD_INIT_ONSTACK(name) \
({ init_waitqueue_head(&name); name; })
# define DECLARE_WAIT_QUEUE_HEAD_ONSTACK(name) \
============================================================
--- init/main.c 268ab0d5f5bdc422e2864cadf35a7bb95958de10
+++ init/main.c 9d14ac66cb0fe3b90334512c0659146aec5e241c
@@ -608,6 +608,7 @@ asmlinkage void __init start_kernel(void
#ifdef CONFIG_PROC_FS
proc_root_init();
#endif
+ lock_stat_sys_init(); //--billh
cpuset_init();
taskstats_init_early();
delayacct_init();
[Index of Archives]
[Kernel Newbies]
[Netfilter]
[Bugtraq]
[Photo]
[Stuff]
[Gimp]
[Yosemite News]
[MIPS Linux]
[ARM Linux]
[Linux Security]
[Linux RAID]
[Video 4 Linux]
[Linux for the blind]
[Linux Resources]