linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [Patch v5 0/9] liblockdep: userspace lockdep
@ 2013-06-13 22:41 Sasha Levin
  2013-06-13 22:41 ` [Patch v5 1/9] lockdep: Be nice about building from userspace Sasha Levin
                   ` (9 more replies)
  0 siblings, 10 replies; 33+ messages in thread
From: Sasha Levin @ 2013-06-13 22:41 UTC (permalink / raw)
  To: torvalds; +Cc: mingo, peterz, linux-kernel, Sasha Levin

liblockdep is a tiny wrapper built around kernel/lockdep.c. The aim is to
provide the same functionality the kernel gets from lockdep to userspace.

The bulk of the code here is the LD_PRELOAD support which provides users
an easy way to test their code without having to integrate liblockdep into
said code. Simply doing:

        lockdep my_app

Would provide lockdep support to my_app.

There is also a small test suite to test both mutexes and rwlocks, it's
based on the tests in lib/locking-selftest.c.

This entire patch series was reviewed by lockdep maintainers and accepted to
the tip tree previously. It was pulled out so that the potential merge of
liblockdep won't delay the rest of the commits in the tip locking tree.

For some more background about this entire thing, the folks at LWN did
an awesome overview: http://lwn.net/Articles/536363/

Changes from v4:
 - Build issue on Ubuntu.
 - More work from Peter.

Changes from v3:
 - More fixes/suggestions/code from Peter.

Changes from v2:
 - Fix possible build breakage due to recent changes to kernel/lockdep.c

Changes from v1:
 - Addressed Peter's comments.


Sasha Levin (9):
  lockdep: Be nice about building from userspace
  liblockdep: Wrap kernel/lockdep.c to allow usage from userspace
  liblockdep: Add public headers for pthread_mutex_t implementation
  liblockdep: Add pthread_mutex_t test suite
  liblockdep: Add public headers for pthread_rwlock_t implementation
  liblockdep: Add pthread_rwlock_t test suite
  liblockdep: Support using LD_PRELOAD
  liblockdep: Add the 'lockdep' user-space utility
  liblockdep: Add a MAINTAINERS entry

 MAINTAINERS                                        |   5 +
 kernel/lockdep.c                                   |   4 +
 tools/lib/lockdep/Makefile                         | 251 ++++++++++++
 tools/lib/lockdep/common.c                         |  33 ++
 tools/lib/lockdep/include/liblockdep/common.h      |  50 +++
 tools/lib/lockdep/include/liblockdep/mutex.h       |  70 ++++
 tools/lib/lockdep/include/liblockdep/rwlock.h      |  86 ++++
 tools/lib/lockdep/lockdep                          |   3 +
 tools/lib/lockdep/lockdep.c                        |   2 +
 tools/lib/lockdep/lockdep_internals.h              |   1 +
 tools/lib/lockdep/lockdep_states.h                 |   1 +
 tools/lib/lockdep/preload.c                        | 447 +++++++++++++++++++++
 tools/lib/lockdep/rbtree.c                         |   1 +
 tools/lib/lockdep/run_tests.sh                     |  27 ++
 tools/lib/lockdep/tests/AA.c                       |  13 +
 tools/lib/lockdep/tests/ABBA.c                     |  13 +
 tools/lib/lockdep/tests/ABBCCA.c                   |  15 +
 tools/lib/lockdep/tests/ABBCCDDA.c                 |  17 +
 tools/lib/lockdep/tests/ABCABC.c                   |  15 +
 tools/lib/lockdep/tests/ABCDBCDA.c                 |  17 +
 tools/lib/lockdep/tests/ABCDBDDA.c                 |  17 +
 tools/lib/lockdep/tests/WW.c                       |  13 +
 tools/lib/lockdep/tests/common.h                   |  12 +
 tools/lib/lockdep/tests/unlock_balance.c           |  12 +
 tools/lib/lockdep/uinclude/asm/hweight.h           |   0
 tools/lib/lockdep/uinclude/asm/sections.h          |   0
 tools/lib/lockdep/uinclude/linux/bitops.h          |   0
 tools/lib/lockdep/uinclude/linux/compiler.h        |   7 +
 tools/lib/lockdep/uinclude/linux/debug_locks.h     |  12 +
 tools/lib/lockdep/uinclude/linux/delay.h           |   0
 tools/lib/lockdep/uinclude/linux/export.h          |   7 +
 tools/lib/lockdep/uinclude/linux/ftrace.h          |   0
 tools/lib/lockdep/uinclude/linux/gfp.h             |   0
 tools/lib/lockdep/uinclude/linux/hardirq.h         |  11 +
 tools/lib/lockdep/uinclude/linux/hash.h            |   1 +
 tools/lib/lockdep/uinclude/linux/interrupt.h       |   0
 tools/lib/lockdep/uinclude/linux/irqflags.h        |  38 ++
 tools/lib/lockdep/uinclude/linux/kallsyms.h        |  32 ++
 tools/lib/lockdep/uinclude/linux/kern_levels.h     |  25 ++
 tools/lib/lockdep/uinclude/linux/kernel.h          |  44 ++
 tools/lib/lockdep/uinclude/linux/kmemcheck.h       |   8 +
 tools/lib/lockdep/uinclude/linux/linkage.h         |   0
 tools/lib/lockdep/uinclude/linux/list.h            |   1 +
 tools/lib/lockdep/uinclude/linux/lockdep.h         |  55 +++
 tools/lib/lockdep/uinclude/linux/mm_types.h        |   0
 tools/lib/lockdep/uinclude/linux/module.h          |   6 +
 tools/lib/lockdep/uinclude/linux/mutex.h           |   0
 tools/lib/lockdep/uinclude/linux/poison.h          |   1 +
 tools/lib/lockdep/uinclude/linux/prefetch.h        |   6 +
 tools/lib/lockdep/uinclude/linux/proc_fs.h         |   0
 tools/lib/lockdep/uinclude/linux/rbtree.h          |   1 +
 .../lib/lockdep/uinclude/linux/rbtree_augmented.h  |   2 +
 tools/lib/lockdep/uinclude/linux/rcu.h             |  16 +
 tools/lib/lockdep/uinclude/linux/seq_file.h        |   0
 tools/lib/lockdep/uinclude/linux/spinlock.h        |  25 ++
 tools/lib/lockdep/uinclude/linux/stacktrace.h      |  32 ++
 tools/lib/lockdep/uinclude/linux/stringify.h       |   7 +
 tools/lib/lockdep/uinclude/linux/system.h          |   0
 tools/lib/lockdep/uinclude/linux/types.h           |  58 +++
 tools/lib/lockdep/uinclude/linux/util.h            |   0
 tools/lib/lockdep/uinclude/trace/events/lock.h     |   0
 61 files changed, 1520 insertions(+)
 create mode 100644 tools/lib/lockdep/Makefile
 create mode 100644 tools/lib/lockdep/common.c
 create mode 100644 tools/lib/lockdep/include/liblockdep/common.h
 create mode 100644 tools/lib/lockdep/include/liblockdep/mutex.h
 create mode 100644 tools/lib/lockdep/include/liblockdep/rwlock.h
 create mode 100755 tools/lib/lockdep/lockdep
 create mode 100644 tools/lib/lockdep/lockdep.c
 create mode 100644 tools/lib/lockdep/lockdep_internals.h
 create mode 100644 tools/lib/lockdep/lockdep_states.h
 create mode 100644 tools/lib/lockdep/preload.c
 create mode 100644 tools/lib/lockdep/rbtree.c
 create mode 100755 tools/lib/lockdep/run_tests.sh
 create mode 100644 tools/lib/lockdep/tests/AA.c
 create mode 100644 tools/lib/lockdep/tests/ABBA.c
 create mode 100644 tools/lib/lockdep/tests/ABBCCA.c
 create mode 100644 tools/lib/lockdep/tests/ABBCCDDA.c
 create mode 100644 tools/lib/lockdep/tests/ABCABC.c
 create mode 100644 tools/lib/lockdep/tests/ABCDBCDA.c
 create mode 100644 tools/lib/lockdep/tests/ABCDBDDA.c
 create mode 100644 tools/lib/lockdep/tests/WW.c
 create mode 100644 tools/lib/lockdep/tests/common.h
 create mode 100644 tools/lib/lockdep/tests/unlock_balance.c
 create mode 100644 tools/lib/lockdep/uinclude/asm/hweight.h
 create mode 100644 tools/lib/lockdep/uinclude/asm/sections.h
 create mode 100644 tools/lib/lockdep/uinclude/linux/bitops.h
 create mode 100644 tools/lib/lockdep/uinclude/linux/compiler.h
 create mode 100644 tools/lib/lockdep/uinclude/linux/debug_locks.h
 create mode 100644 tools/lib/lockdep/uinclude/linux/delay.h
 create mode 100644 tools/lib/lockdep/uinclude/linux/export.h
 create mode 100644 tools/lib/lockdep/uinclude/linux/ftrace.h
 create mode 100644 tools/lib/lockdep/uinclude/linux/gfp.h
 create mode 100644 tools/lib/lockdep/uinclude/linux/hardirq.h
 create mode 100644 tools/lib/lockdep/uinclude/linux/hash.h
 create mode 100644 tools/lib/lockdep/uinclude/linux/interrupt.h
 create mode 100644 tools/lib/lockdep/uinclude/linux/irqflags.h
 create mode 100644 tools/lib/lockdep/uinclude/linux/kallsyms.h
 create mode 100644 tools/lib/lockdep/uinclude/linux/kern_levels.h
 create mode 100644 tools/lib/lockdep/uinclude/linux/kernel.h
 create mode 100644 tools/lib/lockdep/uinclude/linux/kmemcheck.h
 create mode 100644 tools/lib/lockdep/uinclude/linux/linkage.h
 create mode 100644 tools/lib/lockdep/uinclude/linux/list.h
 create mode 100644 tools/lib/lockdep/uinclude/linux/lockdep.h
 create mode 100644 tools/lib/lockdep/uinclude/linux/mm_types.h
 create mode 100644 tools/lib/lockdep/uinclude/linux/module.h
 create mode 100644 tools/lib/lockdep/uinclude/linux/mutex.h
 create mode 100644 tools/lib/lockdep/uinclude/linux/poison.h
 create mode 100644 tools/lib/lockdep/uinclude/linux/prefetch.h
 create mode 100644 tools/lib/lockdep/uinclude/linux/proc_fs.h
 create mode 100644 tools/lib/lockdep/uinclude/linux/rbtree.h
 create mode 100644 tools/lib/lockdep/uinclude/linux/rbtree_augmented.h
 create mode 100644 tools/lib/lockdep/uinclude/linux/rcu.h
 create mode 100644 tools/lib/lockdep/uinclude/linux/seq_file.h
 create mode 100644 tools/lib/lockdep/uinclude/linux/spinlock.h
 create mode 100644 tools/lib/lockdep/uinclude/linux/stacktrace.h
 create mode 100644 tools/lib/lockdep/uinclude/linux/stringify.h
 create mode 100644 tools/lib/lockdep/uinclude/linux/system.h
 create mode 100644 tools/lib/lockdep/uinclude/linux/types.h
 create mode 100644 tools/lib/lockdep/uinclude/linux/util.h
 create mode 100644 tools/lib/lockdep/uinclude/trace/events/lock.h

-- 
1.8.1.2


^ permalink raw reply	[flat|nested] 33+ messages in thread
* [PATCH v3 2/7] liblockdep: public headers for mutex implementation
@ 2013-02-04  1:50 Sasha Levin
  2013-02-04 13:51 ` [tip:core/locking] liblockdep: Add public headers for pthread_mutex_t implementation tip-bot for Sasha Levin
  0 siblings, 1 reply; 33+ messages in thread
From: Sasha Levin @ 2013-02-04  1:50 UTC (permalink / raw)
  To: mingo, peterz; +Cc: paulus, acme, penberg, linux-kernel, Sasha Levin

These headers provide the same API as their pthread mutex counterparts.

The design here is to allow to easily switch to liblockdep lock validation
just by adding a "liblockdep_" to pthread_mutex_*() calls, which means that
it's easy to integrate liblockdep into existing codebases.

Signed-off-by: Sasha Levin <sasha.levin@oracle.com>
---
 tools/lib/lockdep/include/liblockdep/common.h | 42 +++++++++++++++
 tools/lib/lockdep/include/liblockdep/mutex.h  | 73 +++++++++++++++++++++++++++
 2 files changed, 115 insertions(+)
 create mode 100644 tools/lib/lockdep/include/liblockdep/common.h
 create mode 100644 tools/lib/lockdep/include/liblockdep/mutex.h

diff --git a/tools/lib/lockdep/include/liblockdep/common.h b/tools/lib/lockdep/include/liblockdep/common.h
new file mode 100644
index 0000000..b72f9c1
--- /dev/null
+++ b/tools/lib/lockdep/include/liblockdep/common.h
@@ -0,0 +1,42 @@
+#ifndef _LIBLOCKDEP_COMMON_H
+#define _LIBLOCKDEP_COMMON_H
+
+#include <pthread.h>
+
+#define CALLER_ADDR0 (__builtin_return_address(0))
+#define _THIS_IP_ CALLER_ADDR0
+#define NR_LOCKDEP_CACHING_CLASSES 2
+#define MAX_LOCKDEP_SUBCLASSES 8UL
+
+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 liblockdep_init(void);
+void liblockdep_set_thread(void);
+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 0000000..5154a9d
--- /dev/null
+++ b/tools/lib/lockdep/include/liblockdep/mutex.h
@@ -0,0 +1,73 @@
+#ifndef _LIBLOCKDEP_MUTEX_H
+#define _LIBLOCKDEP_MUTEX_H
+
+#ifdef __USE_LIBLOCKDEP
+
+#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)
+{
+	void *ip = _THIS_IP_;
+	lock_acquire(&lock->dep_map, 0, 0, 0, 2, NULL, (unsigned long)ip);
+	return pthread_mutex_lock(&lock->mutex);
+}
+
+static inline int liblockdep_pthread_mutex_unlock(liblockdep_pthread_mutex_t *lock)
+{
+	void *ip = _THIS_IP_;
+	lock_release(&lock->dep_map, 0, (unsigned long)ip);
+	return pthread_mutex_unlock(&lock->mutex);
+}
+
+static inline int liblockdep_pthread_mutex_trylock(liblockdep_pthread_mutex_t *lock)
+{
+	void *ip = _THIS_IP_;
+	lock_acquire(&lock->dep_map, 0, 1, 0, 2, NULL, (unsigned long)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);
+}
+
+#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
-- 
1.8.1.2


^ permalink raw reply related	[flat|nested] 33+ messages in thread

end of thread, other threads:[~2013-11-27 14:13 UTC | newest]

Thread overview: 33+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-06-13 22:41 [Patch v5 0/9] liblockdep: userspace lockdep Sasha Levin
2013-06-13 22:41 ` [Patch v5 1/9] lockdep: Be nice about building from userspace Sasha Levin
2013-06-13 22:41 ` [Patch v5 2/9] liblockdep: Wrap kernel/lockdep.c to allow usage " Sasha Levin
2013-11-27 14:08   ` [tip:core/locking] liblockdep: Wrap kernel/locking/ lockdep.c " tip-bot for Sasha Levin
2013-06-13 22:41 ` [Patch v5 3/9] liblockdep: Add public headers for pthread_mutex_t implementation Sasha Levin
2013-11-27 14:08   ` [tip:core/locking] " tip-bot for Sasha Levin
2013-06-13 22:41 ` [Patch v5 4/9] liblockdep: Add pthread_mutex_t test suite Sasha Levin
2013-11-27 14:08   ` [tip:core/locking] " tip-bot for Sasha Levin
2013-06-13 22:41 ` [Patch v5 5/9] liblockdep: Add public headers for pthread_rwlock_t implementation Sasha Levin
2013-11-27 14:09   ` [tip:core/locking] " tip-bot for Sasha Levin
2013-06-13 22:41 ` [Patch v5 6/9] liblockdep: Add pthread_rwlock_t test suite Sasha Levin
2013-11-27 14:09   ` [tip:core/locking] " tip-bot for Sasha Levin
2013-06-13 22:41 ` [Patch v5 7/9] liblockdep: Support using LD_PRELOAD Sasha Levin
2013-11-27 14:09   ` [tip:core/locking] " tip-bot for Sasha Levin
2013-06-13 22:41 ` [Patch v5 8/9] liblockdep: Add the 'lockdep' user-space utility Sasha Levin
2013-11-27 14:09   ` [tip:core/locking] " tip-bot for Sasha Levin
2013-06-13 22:41 ` [Patch v5 9/9] liblockdep: Add a MAINTAINERS entry Sasha Levin
2013-11-27 14:09   ` [tip:core/locking] " tip-bot for Sasha Levin
2013-06-26 12:24 ` [Patch v5 0/9] liblockdep: userspace lockdep Peter Zijlstra
2013-06-26 15:53   ` Ingo Molnar
2013-06-26 19:38     ` Sasha Levin
2013-06-27  9:05       ` Ingo Molnar
2013-06-27  9:07       ` Ingo Molnar
2013-06-27 13:55         ` Sasha Levin
2013-07-08  1:14           ` Sasha Levin
2013-07-08  8:39             ` Ingo Molnar
2013-09-12 17:40               ` Sasha Levin
2013-09-12 18:01                 ` Ingo Molnar
2013-09-14 16:59                   ` Sasha Levin
2013-11-08 17:04                   ` Sasha Levin
2013-11-09 16:01                     ` Peter Zijlstra
2013-11-11 15:56                     ` Peter Zijlstra
  -- strict thread matches above, loose matches on Subject: below --
2013-02-04  1:50 [PATCH v3 2/7] liblockdep: public headers for mutex implementation Sasha Levin
2013-02-04 13:51 ` [tip:core/locking] liblockdep: Add public headers for pthread_mutex_t implementation tip-bot for Sasha Levin

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).