All of lore.kernel.org
 help / color / mirror / Atom feed
From: tip-bot for Sasha Levin <tipbot@zytor.com>
To: linux-tip-commits@vger.kernel.org
Cc: linux-kernel@vger.kernel.org, sasha.levin@oracle.com,
	hpa@zytor.com, mingo@kernel.org, peterz@infradead.org,
	tglx@linutronix.de
Subject: [tip:core/locking] liblockdep: Add public headers for pthread_mutex_t implementation
Date: Wed, 27 Nov 2013 06:08:48 -0800	[thread overview]
Message-ID: <tip-45e6207464b59dca63c8a9a79a7befbbf6a68fdb@git.kernel.org> (raw)
In-Reply-To: <1371163284-6346-4-git-send-email-sasha.levin@oracle.com>

Commit-ID:  45e6207464b59dca63c8a9a79a7befbbf6a68fdb
Gitweb:     http://git.kernel.org/tip/45e6207464b59dca63c8a9a79a7befbbf6a68fdb
Author:     Sasha Levin <sasha.levin@oracle.com>
AuthorDate: Thu, 13 Jun 2013 18:41:18 -0400
Committer:  Ingo Molnar <mingo@kernel.org>
CommitDate: Wed, 27 Nov 2013 11:55:22 +0100

liblockdep: Add public headers for pthread_mutex_t implementation

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>
Signed-off-by: Peter Zijlstra <peterz@infradead.org>
Cc: torvalds@linux-foundation.org
Link: http://lkml.kernel.org/r/1371163284-6346-4-git-send-email-sasha.levin@oracle.com
Signed-off-by: Ingo Molnar <mingo@kernel.org>
---
 tools/lib/lockdep/include/liblockdep/common.h | 50 +++++++++++++++++++
 tools/lib/lockdep/include/liblockdep/mutex.h  | 70 +++++++++++++++++++++++++++
 2 files changed, 120 insertions(+)

diff --git a/tools/lib/lockdep/include/liblockdep/common.h b/tools/lib/lockdep/include/liblockdep/common.h
new file mode 100644
index 0000000..0bda630
--- /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 0000000..c342f70
--- /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, 2, 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, 2, 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

  reply	other threads:[~2013-11-27 14:09 UTC|newest]

Thread overview: 33+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
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-bot for Sasha Levin [this message]
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

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=tip-45e6207464b59dca63c8a9a79a7befbbf6a68fdb@git.kernel.org \
    --to=tipbot@zytor.com \
    --cc=hpa@zytor.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-tip-commits@vger.kernel.org \
    --cc=mingo@kernel.org \
    --cc=peterz@infradead.org \
    --cc=sasha.levin@oracle.com \
    --cc=tglx@linutronix.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.