--- linux-2.6.24/include/linux/lockdep.h 2008-02-25 15:32:05.000000000 -0800 +++ linux-2.6.24.working/include/linux/lockdep.h 2008-03-13 14:02:43.000000000 -0700 @@ -19,6 +19,8 @@ #include #include +//#include + /* * Lock-class usage-state bits: */ @@ -143,6 +145,10 @@ struct lock_class_stats { unsigned long contention_point[4]; +#ifdef CONFIG_LOCK_STAT + unsigned long spinnable; + unsigned long stolen; +#endif struct lock_time read_waittime; struct lock_time write_waittime; struct lock_time read_holdtime; @@ -347,57 +353,190 @@ #endif /* !LOCKDEP */ -#ifdef CONFIG_LOCK_STAT +/* + * lockstat contention tracking is pushed down into the rtmutex implementation + * CONFIG_PREEMPT_RT instead. + */ +#if !defined(CONFIG_PREEMPT_RT) && defined(CONFIG_LOCK_STAT) + +extern void lock_note_contended(struct lockdep_map *lock, unsigned long ip); +extern void lock_note_acquired(struct lockdep_map *lock); +extern void lock_note_stolen(struct lockdep_map *lock); + +#define RET_IP_DECL unsigned long _ip +#define __RET_IP_DECL , RET_IP_DECL +#define __RET_IP_PARAM , _ip -extern void lock_contended(struct lockdep_map *lock, unsigned long ip); -extern void lock_acquired(struct lockdep_map *lock); +#define DEP_MAP_DECL struct lockdep_map *_dep_map +#define __DEP_MAP_DECL , DEP_MAP_DECL +#define DEP_MAP_PARAM _dep_map +#define __DEP_MAP_PARAM , DEP_MAP_PARAM + +#define LOCKDEP_TS_DECL +#define __LOCKDEP_TS_DECL +#define __LOCKDEP_TS_PARAM +#define __LOCKDEP_TS_NULL + +#define LOCKDEP_PARAMS DEP_MAP_PARAM __RET_IP_PARAM +#define __LOCKDEP_PARAMS , LOCKDEP_PARAMS +#define __LOCKDEP_DECLS , DEP_MAP_DECL __RET_IP_DECL + +#define LOCKDEP_PARAMS_L0 NULL, _RET_IP_ +#define __LOCKDEP_PARAMS_L0 , LOCKDEP_PARAMS_L0 + +#define LOCKDEP_PARAMS_SEM(lock) +#define __LOCKDEP_PARAMS_SEM(lock) + +#define LOCKDEP_PARAMS_RWSEM(lock) +#define __LOCKDEP_PARAMS_RWSEM(lock) + +#define LOCKDEP_PARAMS_MUTEX(lock) +#define __LOCKDEP_PARAMS_MUTEX(lock) #define LOCK_CONTENDED(_lock, try, lock) \ do { \ if (!try(_lock)) { \ - lock_contended(&(_lock)->dep_map, _RET_IP_); \ + lock_note_contended(&(_lock)->dep_map, _RET_IP_); \ lock(_lock); \ } \ - lock_acquired(&(_lock)->dep_map); \ + lock_note_acquired(&(_lock)->dep_map); \ } while (0) -#define LOCK_CONTENDED_RT(_lock, f_try, f_lock) \ +#define LOCK_CONTENDED_COMPAT(_lock, try, lock) \ +do { \ + if (!try(_lock)) { \ + lock_note_contended(&(_lock)->dep_map, _RET_IP_); \ + lock(_lock); \ + } \ + lock_note_acquired(&(_lock)->dep_map); \ +} while (0) + +#define LOCK_CONTENDED_RT(_lock, f_try, f_lock, ip) \ do { \ if (!f_try(&(_lock)->lock)) { \ - lock_contended(&(_lock)->dep_map, _RET_IP_); \ + lock_note_contended(&(_lock)->dep_map, _RET_IP_); \ f_lock(&(_lock)->lock); \ } \ - lock_acquired(&(_lock)->dep_map); \ + lock_note_acquired(&(_lock)->dep_map); \ } while (0) -#define LOCK_CONTENDED_RT_RET(_lock, f_try, f_lock) \ +#define LOCK_CONTENDED_RT_RET(_lock, f_try, f_lock, ip) \ ({ \ int ret = 0; \ if (!f_try(&(_lock)->lock)) { \ - lock_contended(&(_lock)->dep_map, _RET_IP_); \ + lock_note_contended(&(_lock)->dep_map, _RET_IP_); \ ret = f_lock(&(_lock)->lock); \ } \ if (!ret) \ - lock_acquired(&(_lock)->dep_map); \ + lock_note_acquired(&(_lock)->dep_map); \ ret; \ }) -#else /* CONFIG_LOCK_STAT */ +#else /* !defined(CONFIG_PREEMPT_RT) && defined(CONFIG_LOCK_STAT) */ + +#if defined(CONFIG_PREEMPT_RT) && defined(CONFIG_LOCK_STAT) + +extern void lock_note_contended(struct lockdep_map *_dep_map, unsigned long _ip, struct task_struct *_owner); +extern void lock_note_acquired(struct lockdep_map *lock); +extern void lock_note_stolen(struct lockdep_map *lock); + +#define RET_IP_DECL unsigned long _ip +#define __RET_IP_DECL , RET_IP_DECL +#define __RET_IP_PARAM , ip + +#define DEP_MAP_DECL struct lockdep_map *_dep_map +#define __DEP_MAP_DECL , DEP_MAP_DECL +#define DEP_MAP_PARAM _dep_map +#define __DEP_MAP_PARAM , DEP_MAP_PARAM + +#define LOCKDEP_TS_DECL struct task_struct *_owner +#define __LOCKDEP_TS_DECL , LOCKDEP_TS_DECL +#define __LOCKDEP_TS_PARAM , _owner +#define __LOCKDEP_TS_NULL , NULL + +//#define LOCKDEP_PARAMS (struct task_struct *) ((unsigned long)_owner & (unsigned long) ~0x3), _dep_map, _ip +#define LOCKDEP_PARAMS rt_mutex_real_owner(lock), _dep_map, _ip + +#define __LOCKDEP_PARAMS , LOCKDEP_PARAMS +//#define __LOCKDEP_DECLS , DEP_MAP_DECL, RET_IP_DECL +#define __LOCKDEP_DECLS , struct task_struct *_owner, DEP_MAP_DECL, RET_IP_DECL + +#define LOCKDEP_PARAMS_L0 current, NULL, _RET_IP_ +#define __LOCKDEP_PARAMS_L0 , LOCKDEP_PARAMS_L0 + +#define LOCKDEP_PARAMS_SEM(lock) LOCKDEP_PARAMS_L0 +#define __LOCKDEP_PARAMS_SEM(lock) , LOCKDEP_PARAMS_L0 -#define lock_contended(lockdep_map, ip) do {} while (0) -#define lock_acquired(lockdep_map) do {} while (0) +#define LOCKDEP_PARAMS_RWSEM(lock) LOCKDEP_PARAMS_L0 +#define __LOCKDEP_PARAMS_RWSEM(lock) , LOCKDEP_PARAMS_L0 + +#define LOCKDEP_PARAMS_MUTEX(lock) LOCKDEP_PARAMS_L0 +#define __LOCKDEP_PARAMS_MUTEX(lock) , LOCKDEP_PARAMS_L0 + +#define LOCK_CONTENDED(_lock, try, lock) \ +do { \ + if (!try(_lock)) { \ + lock_note_contended((struct task_struct *) &(_lock)->owner, \ + &(_lock)->dep_map, \ + _RET_IP_); \ + lock(_lock); \ + } \ + lock_note_acquired(&(_lock)->dep_map); \ +} while (0) + +#define LOCK_CONTENDED_COMPAT(_lock, try, lock) \ +do { \ + if (!try(_lock)) { \ + lock_note_contended(NULL, &(_lock)->dep_map, _RET_IP_); \ + lock(_lock); \ + } \ + lock_note_acquired(&(_lock)->dep_map); \ +} while (0) + +#define LOCK_CONTENDED_RT(_lock, f_try, f_lock) \ + f_lock(&(_lock)->lock, NULL, &(_lock)->dep_map, _RET_IP_) + +#define LOCK_CONTENDED_RT_RET(_lock, f_try, f_lock) \ + f_lock(&(_lock)->lock, NULL, NULL, _RET_IP_) + +#elif /*defined(CONFIG_PREEMPT_RT) && */!defined(CONFIG_LOCK_STAT) +/*#elif !defined(CONFIG_PREEMPT_RT) && !defined(CONFIG_LOCK_STAT) */ + +#define lock_note_contended(lockdep_map, ip) do {} while (0) +#define lock_note_acquired(lockdep_map) do {} while (0) + +#define __RET_IP_DECL +#define __RET_IP_PARAM + +#define __TASK_STRUCT_LOCK_DECL +#define __TASK_STRUCT_LOCK_PARAM +#define __TASK_STRUCT_LOCK_PARAM2 lock, #define LOCK_CONTENDED(_lock, try, lock) \ lock(_lock) +#define LOCK_CONTENDED_COMPAT(_lock, try, lock) \ + lock(_lock) + #define LOCK_CONTENDED_RT(_lock, f_try, f_lock) \ f_lock(&(_lock)->lock) #define LOCK_CONTENDED_RT_RET(_lock, f_try, f_lock) \ f_lock(&(_lock)->lock) -#endif /* CONFIG_LOCK_STAT */ +#else +#error +#endif + +/* + * ac (c1) + * a (c2) + * ab (c2) + * abc (c2) + */ + +#endif /* !defined(CONFIG_PREEMPT_RT) && defined(CONFIG_LOCK_STAT) */ #if defined(CONFIG_TRACE_IRQFLAGS) && defined(CONFIG_GENERIC_HARDIRQS) extern void early_init_irq_lock_class(void);