diff options
Diffstat (limited to 'tools/lib/lockdep/include')
| -rw-r--r-- | tools/lib/lockdep/include/liblockdep/common.h | 50 | ||||
| -rw-r--r-- | tools/lib/lockdep/include/liblockdep/mutex.h | 70 | ||||
| -rw-r--r-- | tools/lib/lockdep/include/liblockdep/rwlock.h | 86 | 
3 files changed, 206 insertions, 0 deletions
diff --git a/tools/lib/lockdep/include/liblockdep/common.h b/tools/lib/lockdep/include/liblockdep/common.h new file mode 100644 index 00000000000..0bda630027c --- /dev/null +++ b/tools/lib/lockdep/include/liblockdep/common.h @@ -0,0 +1,50 @@ +#ifndef _LIBLOCKDEP_COMMON_H +#define _LIBLOCKDEP_COMMON_H + +#include <pthread.h> + +#define NR_LOCKDEP_CACHING_CLASSES 2 +#define MAX_LOCKDEP_SUBCLASSES 8UL + +#ifndef CALLER_ADDR0 +#define CALLER_ADDR0 ((unsigned long)__builtin_return_address(0)) +#endif + +#ifndef _RET_IP_ +#define _RET_IP_ CALLER_ADDR0 +#endif + +#ifndef _THIS_IP_ +#define _THIS_IP_ ({ __label__ __here; __here: (unsigned long)&&__here; }) +#endif + +struct lockdep_subclass_key { +	char __one_byte; +}; + +struct lock_class_key { +	struct lockdep_subclass_key subkeys[MAX_LOCKDEP_SUBCLASSES]; +}; + +struct lockdep_map { +	struct lock_class_key	*key; +	struct lock_class	*class_cache[NR_LOCKDEP_CACHING_CLASSES]; +	const char		*name; +#ifdef CONFIG_LOCK_STAT +	int			cpu; +	unsigned long		ip; +#endif +}; + +void lockdep_init_map(struct lockdep_map *lock, const char *name, +			struct lock_class_key *key, int subclass); +void lock_acquire(struct lockdep_map *lock, unsigned int subclass, +			int trylock, int read, int check, +			struct lockdep_map *nest_lock, unsigned long ip); +void lock_release(struct lockdep_map *lock, int nested, +			unsigned long ip); + +#define STATIC_LOCKDEP_MAP_INIT(_name, _key) \ +	{ .name = (_name), .key = (void *)(_key), } + +#endif diff --git a/tools/lib/lockdep/include/liblockdep/mutex.h b/tools/lib/lockdep/include/liblockdep/mutex.h new file mode 100644 index 00000000000..ee53a42818c --- /dev/null +++ b/tools/lib/lockdep/include/liblockdep/mutex.h @@ -0,0 +1,70 @@ +#ifndef _LIBLOCKDEP_MUTEX_H +#define _LIBLOCKDEP_MUTEX_H + +#include <pthread.h> +#include "common.h" + +struct liblockdep_pthread_mutex { +	pthread_mutex_t mutex; +	struct lockdep_map dep_map; +}; + +typedef struct liblockdep_pthread_mutex liblockdep_pthread_mutex_t; + +#define LIBLOCKDEP_PTHREAD_MUTEX_INITIALIZER(mtx)			\ +		(const struct liblockdep_pthread_mutex) {		\ +	.mutex = PTHREAD_MUTEX_INITIALIZER,				\ +	.dep_map = STATIC_LOCKDEP_MAP_INIT(#mtx, &((&(mtx))->dep_map)),	\ +} + +static inline int __mutex_init(liblockdep_pthread_mutex_t *lock, +				const char *name, +				struct lock_class_key *key, +				const pthread_mutexattr_t *__mutexattr) +{ +	lockdep_init_map(&lock->dep_map, name, key, 0); +	return pthread_mutex_init(&lock->mutex, __mutexattr); +} + +#define liblockdep_pthread_mutex_init(mutex, mutexattr)		\ +({								\ +	static struct lock_class_key __key;			\ +								\ +	__mutex_init((mutex), #mutex, &__key, (mutexattr));	\ +}) + +static inline int liblockdep_pthread_mutex_lock(liblockdep_pthread_mutex_t *lock) +{ +	lock_acquire(&lock->dep_map, 0, 0, 0, 1, NULL, (unsigned long)_RET_IP_); +	return pthread_mutex_lock(&lock->mutex); +} + +static inline int liblockdep_pthread_mutex_unlock(liblockdep_pthread_mutex_t *lock) +{ +	lock_release(&lock->dep_map, 0, (unsigned long)_RET_IP_); +	return pthread_mutex_unlock(&lock->mutex); +} + +static inline int liblockdep_pthread_mutex_trylock(liblockdep_pthread_mutex_t *lock) +{ +	lock_acquire(&lock->dep_map, 0, 1, 0, 1, NULL, (unsigned long)_RET_IP_); +	return pthread_mutex_trylock(&lock->mutex) == 0 ? 1 : 0; +} + +static inline int liblockdep_pthread_mutex_destroy(liblockdep_pthread_mutex_t *lock) +{ +	return pthread_mutex_destroy(&lock->mutex); +} + +#ifdef __USE_LIBLOCKDEP + +#define pthread_mutex_t         liblockdep_pthread_mutex_t +#define pthread_mutex_init      liblockdep_pthread_mutex_init +#define pthread_mutex_lock      liblockdep_pthread_mutex_lock +#define pthread_mutex_unlock    liblockdep_pthread_mutex_unlock +#define pthread_mutex_trylock   liblockdep_pthread_mutex_trylock +#define pthread_mutex_destroy   liblockdep_pthread_mutex_destroy + +#endif + +#endif diff --git a/tools/lib/lockdep/include/liblockdep/rwlock.h b/tools/lib/lockdep/include/liblockdep/rwlock.h new file mode 100644 index 00000000000..4ec03f86155 --- /dev/null +++ b/tools/lib/lockdep/include/liblockdep/rwlock.h @@ -0,0 +1,86 @@ +#ifndef _LIBLOCKDEP_RWLOCK_H +#define _LIBLOCKDEP_RWLOCK_H + +#include <pthread.h> +#include "common.h" + +struct liblockdep_pthread_rwlock { +	pthread_rwlock_t rwlock; +	struct lockdep_map dep_map; +}; + +typedef struct liblockdep_pthread_rwlock liblockdep_pthread_rwlock_t; + +#define LIBLOCKDEP_PTHREAD_RWLOCK_INITIALIZER(rwl)			\ +		(struct liblockdep_pthread_rwlock) {			\ +	.rwlock = PTHREAD_RWLOCK_INITIALIZER,				\ +	.dep_map = STATIC_LOCKDEP_MAP_INIT(#rwl, &((&(rwl))->dep_map)),	\ +} + +static inline int __rwlock_init(liblockdep_pthread_rwlock_t *lock, +				const char *name, +				struct lock_class_key *key, +				const pthread_rwlockattr_t *attr) +{ +	lockdep_init_map(&lock->dep_map, name, key, 0); + +	return pthread_rwlock_init(&lock->rwlock, attr); +} + +#define liblockdep_pthread_rwlock_init(lock, attr)		\ +({							\ +	static struct lock_class_key __key;		\ +							\ +	__rwlock_init((lock), #lock, &__key, (attr));	\ +}) + +static inline int liblockdep_pthread_rwlock_rdlock(liblockdep_pthread_rwlock_t *lock) +{ +	lock_acquire(&lock->dep_map, 0, 0, 2, 1, NULL, (unsigned long)_RET_IP_); +	return pthread_rwlock_rdlock(&lock->rwlock); + +} + +static inline int liblockdep_pthread_rwlock_unlock(liblockdep_pthread_rwlock_t *lock) +{ +	lock_release(&lock->dep_map, 0, (unsigned long)_RET_IP_); +	return pthread_rwlock_unlock(&lock->rwlock); +} + +static inline int liblockdep_pthread_rwlock_wrlock(liblockdep_pthread_rwlock_t *lock) +{ +	lock_acquire(&lock->dep_map, 0, 0, 0, 1, NULL, (unsigned long)_RET_IP_); +	return pthread_rwlock_wrlock(&lock->rwlock); +} + +static inline int liblockdep_pthread_rwlock_tryrdlock(liblockdep_pthread_rwlock_t *lock) +{ +	lock_acquire(&lock->dep_map, 0, 1, 2, 1, NULL, (unsigned long)_RET_IP_); +	return pthread_rwlock_tryrdlock(&lock->rwlock) == 0 ? 1 : 0; +} + +static inline int liblockdep_pthread_rwlock_trywlock(liblockdep_pthread_rwlock_t *lock) +{ +	lock_acquire(&lock->dep_map, 0, 1, 0, 1, NULL, (unsigned long)_RET_IP_); +	return pthread_rwlock_trywlock(&lock->rwlock) == 0 ? 1 : 0; +} + +static inline int liblockdep_rwlock_destroy(liblockdep_pthread_rwlock_t *lock) +{ +	return pthread_rwlock_destroy(&lock->rwlock); +} + +#ifdef __USE_LIBLOCKDEP + +#define pthread_rwlock_t		liblockdep_pthread_rwlock_t +#define pthread_rwlock_init		liblockdep_pthread_rwlock_init +#define pthread_rwlock_rdlock		liblockdep_pthread_rwlock_rdlock +#define pthread_rwlock_unlock		liblockdep_pthread_rwlock_unlock +#define pthread_rwlock_wrlock		liblockdep_pthread_rwlock_wrlock +#define pthread_rwlock_tryrdlock	liblockdep_pthread_rwlock_tryrdlock +#define pthread_rwlock_trywlock		liblockdep_pthread_rwlock_trywlock +#define pthread_rwlock_destroy		liblockdep_rwlock_destroy + +#endif + +#endif  | 
