Makes Dept able to track dependencies by spinlock.

Signed-off-by: Byungchul Park <byungchul.p...@lge.com>
---
 include/linux/lockdep.h            | 18 +++++++++++++++---
 include/linux/spinlock.h           | 26 ++++++++++++++++++++++++++
 include/linux/spinlock_types_raw.h | 13 +++++++++++++
 3 files changed, 54 insertions(+), 3 deletions(-)

diff --git a/include/linux/lockdep.h b/include/linux/lockdep.h
index c1a56fe..529ea18 100644
--- a/include/linux/lockdep.h
+++ b/include/linux/lockdep.h
@@ -584,9 +584,21 @@ static inline void print_irqtrace_events(struct 
task_struct *curr)
 #define lock_acquire_shared(l, s, t, n, i)             lock_acquire(l, s, t, 
1, 1, n, i)
 #define lock_acquire_shared_recursive(l, s, t, n, i)   lock_acquire(l, s, t, 
2, 1, n, i)
 
-#define spin_acquire(l, s, t, i)               lock_acquire_exclusive(l, s, t, 
NULL, i)
-#define spin_acquire_nest(l, s, t, n, i)       lock_acquire_exclusive(l, s, t, 
n, i)
-#define spin_release(l, i)                     lock_release(l, i)
+#define spin_acquire(l, s, t, i)                                       \
+do {                                                                   \
+       lock_acquire_exclusive(l, s, t, NULL, i);                       \
+       dept_spin_lock(&(l)->dmap, s, t, NULL, "spin_unlock", i);       \
+} while (0)
+#define spin_acquire_nest(l, s, t, n, i)                               \
+do {                                                                   \
+       lock_acquire_exclusive(l, s, t, n, i);                          \
+       dept_spin_lock(&(l)->dmap, s, t, (n) ? &(n)->dmap : NULL, 
"spin_unlock", i); \
+} while (0)
+#define spin_release(l, i)                                             \
+do {                                                                   \
+       lock_release(l, i);                                             \
+       dept_spin_unlock(&(l)->dmap, i);                                \
+} while (0)
 
 #define rwlock_acquire(l, s, t, i)             lock_acquire_exclusive(l, s, t, 
NULL, i)
 #define rwlock_acquire_read(l, s, t, i)                                        
\
diff --git a/include/linux/spinlock.h b/include/linux/spinlock.h
index 5c0c517..6b5c3f4 100644
--- a/include/linux/spinlock.h
+++ b/include/linux/spinlock.h
@@ -95,6 +95,32 @@
 # include <linux/spinlock_up.h>
 #endif
 
+#ifdef CONFIG_DEPT
+#define dept_spin_lock(m, ne, t, n, e_fn, ip)                          \
+do {                                                                   \
+       if (t) {                                                        \
+               dept_ecxt_enter(m, 1UL, ip, __func__, e_fn, ne);        \
+               dept_ask_event(m);                                      \
+       } else if (n) {                                                 \
+               dept_skip(m);                                           \
+       } else {                                                        \
+               dept_wait(m, 1UL, ip, __func__, ne);                    \
+               dept_ecxt_enter(m, 1UL, ip, __func__, e_fn, ne);        \
+               dept_ask_event(m);                                      \
+       }                                                               \
+} while (0)
+#define dept_spin_unlock(m, ip)                                                
\
+do {                                                                   \
+       if (!dept_unskip_if_skipped(m)) {                               \
+               dept_event(m, 1UL, ip, __func__);                       \
+               dept_ecxt_exit(m, ip);                                  \
+       }                                                               \
+} while (0)
+#else
+#define dept_spin_lock(m, ne, t, n, e_fn, ip)  do { } while (0)
+#define dept_spin_unlock(m, ip)                        do { } while (0)
+#endif
+
 #ifdef CONFIG_DEBUG_SPINLOCK
   extern void __raw_spin_lock_init(raw_spinlock_t *lock, const char *name,
                                   struct lock_class_key *key, short inner);
diff --git a/include/linux/spinlock_types_raw.h 
b/include/linux/spinlock_types_raw.h
index 91cb36b..279e821 100644
--- a/include/linux/spinlock_types_raw.h
+++ b/include/linux/spinlock_types_raw.h
@@ -26,16 +26,28 @@
 
 #define SPINLOCK_OWNER_INIT    ((void *)-1L)
 
+#ifdef CONFIG_DEPT
+# define RAW_SPIN_DMAP_INIT(lockname)  .dmap = { .name = #lockname, .skip_cnt 
= ATOMIC_INIT(0) },
+# define SPIN_DMAP_INIT(lockname)      .dmap = { .name = #lockname, .skip_cnt 
= ATOMIC_INIT(0) },
+# define LOCAL_SPIN_DMAP_INIT(lockname)        .dmap = { .name = #lockname, 
.skip_cnt = ATOMIC_INIT(0) },
+#else
+# define RAW_SPIN_DMAP_INIT(lockname)
+# define SPIN_DMAP_INIT(lockname)
+# define LOCAL_SPIN_DMAP_INIT(lockname)
+#endif
+
 #ifdef CONFIG_DEBUG_LOCK_ALLOC
 # define RAW_SPIN_DEP_MAP_INIT(lockname)               \
        .dep_map = {                                    \
                .name = #lockname,                      \
                .wait_type_inner = LD_WAIT_SPIN,        \
+               RAW_SPIN_DMAP_INIT(lockname)            \
        }
 # define SPIN_DEP_MAP_INIT(lockname)                   \
        .dep_map = {                                    \
                .name = #lockname,                      \
                .wait_type_inner = LD_WAIT_CONFIG,      \
+               SPIN_DMAP_INIT(lockname)                \
        }
 
 # define LOCAL_SPIN_DEP_MAP_INIT(lockname)             \
@@ -43,6 +55,7 @@
                .name = #lockname,                      \
                .wait_type_inner = LD_WAIT_CONFIG,      \
                .lock_type = LD_LOCK_PERCPU,            \
+               LOCAL_SPIN_DMAP_INIT(lockname)          \
        }
 #else
 # define RAW_SPIN_DEP_MAP_INIT(lockname)
-- 
1.9.1

Reply via email to