Makes Dept able to track dependencies by seqlock with adding wait
annotation on read side of seqlock.

Signed-off-by: Byungchul Park <byungchul.p...@lge.com>
---
 include/linux/seqlock.h | 60 +++++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 58 insertions(+), 2 deletions(-)

diff --git a/include/linux/seqlock.h b/include/linux/seqlock.h
index 37ded6b..47c3379 100644
--- a/include/linux/seqlock.h
+++ b/include/linux/seqlock.h
@@ -23,6 +23,23 @@
 
 #include <asm/processor.h>
 
+#ifdef CONFIG_DEPT
+#define DEPT_EVT_ALL           ((1UL << DEPT_MAX_SUBCLASSES_EVT) - 1)
+#define dept_seq_wait(m, ip)   dept_wait(m, DEPT_EVT_ALL, ip, __func__, 0)
+#define dept_seq_writebegin(m, ip)                             \
+do {                                                           \
+       dept_ecxt_enter(m, 1UL, ip, __func__, "write_seqcount_end", 0);\
+} while (0)
+#define dept_seq_writeend(m, ip)                               \
+do {                                                           \
+       dept_ecxt_exit(m, 1UL, ip);                             \
+} while (0)
+#else
+#define dept_seq_wait(m, ip)           do { } while (0)
+#define dept_seq_writebegin(m, ip)     do { } while (0)
+#define dept_seq_writeend(m, ip)       do { } while (0)
+#endif
+
 /*
  * The seqlock seqcount_t interface does not prescribe a precise sequence of
  * read begin/retry/end. For readers, typically there is a call to
@@ -82,7 +99,8 @@ static inline void __seqcount_init(seqcount_t *s, const char 
*name,
 #ifdef CONFIG_DEBUG_LOCK_ALLOC
 
 # define SEQCOUNT_DEP_MAP_INIT(lockname)                               \
-               .dep_map = { .name = #lockname }
+               .dep_map = { .name = #lockname, \
+                            .dmap = DEPT_MAP_INITIALIZER(lockname) }
 
 /**
  * seqcount_init() - runtime initializer for seqcount_t
@@ -148,7 +166,7 @@ static inline void seqcount_lockdep_reader_access(const 
seqcount_t *s)
  * This lock-unlock technique must be implemented for all of PREEMPT_RT
  * sleeping locks.  See Documentation/locking/locktypes.rst
  */
-#if defined(CONFIG_LOCKDEP) || defined(CONFIG_PREEMPT_RT)
+#if defined(CONFIG_LOCKDEP) || defined(CONFIG_DEPT) || 
defined(CONFIG_PREEMPT_RT)
 #define __SEQ_LOCK(expr)       expr
 #else
 #define __SEQ_LOCK(expr)
@@ -203,6 +221,22 @@ static inline void seqcount_lockdep_reader_access(const 
seqcount_t *s)
        __SEQ_LOCK(locktype     *lock);                                 \
 } seqcount_##lockname##_t;                                             \
                                                                        \
+static __always_inline void                                            \
+__seqprop_##lockname##_wait(const seqcount_##lockname##_t *s)          \
+{                                                                      \
+       __SEQ_LOCK(dept_seq_wait(&(lockmember)->dep_map.dmap, _RET_IP_));\
+}                                                                      \
+                                                                       \
+static __always_inline void                                            \
+__seqprop_##lockname##_writebegin(const seqcount_##lockname##_t *s)    \
+{                                                                      \
+}                                                                      \
+                                                                       \
+static __always_inline void                                            \
+__seqprop_##lockname##_writeend(const seqcount_##lockname##_t *s)      \
+{                                                                      \
+}                                                                      \
+                                                                       \
 static __always_inline seqcount_t *                                    \
 __seqprop_##lockname##_ptr(seqcount_##lockname##_t *s)                 \
 {                                                                      \
@@ -271,6 +305,21 @@ static inline void __seqprop_assert(const seqcount_t *s)
        lockdep_assert_preemption_disabled();
 }
 
+static inline void __seqprop_wait(seqcount_t *s)
+{
+       dept_seq_wait(&s->dep_map.dmap, _RET_IP_);
+}
+
+static inline void __seqprop_writebegin(seqcount_t *s)
+{
+       dept_seq_writebegin(&s->dep_map.dmap, _RET_IP_);
+}
+
+static inline void __seqprop_writeend(seqcount_t *s)
+{
+       dept_seq_writeend(&s->dep_map.dmap, _RET_IP_);
+}
+
 #define __SEQ_RT       IS_ENABLED(CONFIG_PREEMPT_RT)
 
 SEQCOUNT_LOCKNAME(raw_spinlock, raw_spinlock_t,  false,    s->lock,        
raw_spin, raw_spin_lock(s->lock))
@@ -311,6 +360,9 @@ static inline void __seqprop_assert(const seqcount_t *s)
 #define seqprop_sequence(s)            __seqprop(s, sequence)
 #define seqprop_preemptible(s)         __seqprop(s, preemptible)
 #define seqprop_assert(s)              __seqprop(s, assert)
+#define seqprop_dept_wait(s)           __seqprop(s, wait)
+#define seqprop_dept_writebegin(s)     __seqprop(s, writebegin)
+#define seqprop_dept_writeend(s)       __seqprop(s, writeend)
 
 /**
  * __read_seqcount_begin() - begin a seqcount_t read section w/o barrier
@@ -360,6 +412,7 @@ static inline void __seqprop_assert(const seqcount_t *s)
 #define read_seqcount_begin(s)                                         \
 ({                                                                     \
        seqcount_lockdep_reader_access(seqprop_ptr(s));                 \
+       seqprop_dept_wait(s);                                           \
        raw_read_seqcount_begin(s);                                     \
 })
 
@@ -512,6 +565,7 @@ static inline void do_raw_write_seqcount_end(seqcount_t *s)
                preempt_disable();                                      \
                                                                        \
        do_write_seqcount_begin_nested(seqprop_ptr(s), subclass);       \
+       seqprop_dept_writebegin(s);                                     \
 } while (0)
 
 static inline void do_write_seqcount_begin_nested(seqcount_t *s, int subclass)
@@ -538,6 +592,7 @@ static inline void 
do_write_seqcount_begin_nested(seqcount_t *s, int subclass)
                preempt_disable();                                      \
                                                                        \
        do_write_seqcount_begin(seqprop_ptr(s));                        \
+       seqprop_dept_writebegin(s);                                     \
 } while (0)
 
 static inline void do_write_seqcount_begin(seqcount_t *s)
@@ -554,6 +609,7 @@ static inline void do_write_seqcount_begin(seqcount_t *s)
  */
 #define write_seqcount_end(s)                                          \
 do {                                                                   \
+       seqprop_dept_writeend(s);                                       \
        do_write_seqcount_end(seqprop_ptr(s));                          \
                                                                        \
        if (seqprop_preemptible(s))                                     \
-- 
1.9.1

Reply via email to