Currently, dept uses dept's map embedded in task_struct to track
dependencies related to wait_for_completion() and its family.  So it
doesn't need an explicit map basically.

However, for those who want to set the maps with customized class or
key, introduce a new API to use external maps.

Signed-off-by: Byungchul Park <byungc...@sk.com>
---
 include/linux/completion.h | 40 +++++++++++++++++++++-----------------
 1 file changed, 22 insertions(+), 18 deletions(-)

diff --git a/include/linux/completion.h b/include/linux/completion.h
index 4d8fb1d95c0a..e50f7d9b4b97 100644
--- a/include/linux/completion.h
+++ b/include/linux/completion.h
@@ -27,17 +27,15 @@
 struct completion {
        unsigned int done;
        struct swait_queue_head wait;
+       struct dept_map *dmap;
 };
 
-#define init_completion(x)                             \
-do {                                                   \
-       __init_completion(x);                           \
-} while (0)
+#define init_completion(x) init_completion_dmap(x, NULL)
 
 /*
- * XXX: No use cases for now. Fill the body when needed.
+ * XXX: This usage using lockdep's map should be deprecated.
  */
-#define init_completion_map(x, m) init_completion(x)
+#define init_completion_map(x, m) init_completion_dmap(x, NULL)
 
 static inline void complete_acquire(struct completion *x, long timeout)
 {
@@ -48,8 +46,11 @@ static inline void complete_release(struct completion *x)
 }
 
 #define COMPLETION_INITIALIZER(work) \
-       { 0, __SWAIT_QUEUE_HEAD_INITIALIZER((work).wait), }
+       { 0, __SWAIT_QUEUE_HEAD_INITIALIZER((work).wait), .dmap = NULL, }
 
+/*
+ * XXX: This usage using lockdep's map should be deprecated.
+ */
 #define COMPLETION_INITIALIZER_ONSTACK_MAP(work, map) \
        (*({ init_completion_map(&(work), &(map)); &(work); }))
 
@@ -90,15 +91,18 @@ static inline void complete_release(struct completion *x)
 #endif
 
 /**
- * __init_completion - Initialize a dynamically allocated completion
+ * init_completion_dmap - Initialize a dynamically allocated completion
  * @x:  pointer to completion structure that is to be initialized
+ * @dmap:  pointer to external dept's map to be used as a separated map
  *
  * This inline function will initialize a dynamically created completion
  * structure.
  */
-static inline void __init_completion(struct completion *x)
+static inline void init_completion_dmap(struct completion *x,
+               struct dept_map *dmap)
 {
        x->done = 0;
+       x->dmap = dmap;
        init_swait_queue_head(&x->wait);
 }
 
@@ -136,13 +140,13 @@ extern void complete_all(struct completion *);
 
 #define wait_for_completion(x)                                         \
 ({                                                                     \
-       sdt_might_sleep_start_timeout(NULL, -1L);                       \
+       sdt_might_sleep_start_timeout((x)->dmap, -1L);                  \
        __wait_for_completion(x);                                       \
        sdt_might_sleep_end();                                          \
 })
 #define wait_for_completion_io(x)                                      \
 ({                                                                     \
-       sdt_might_sleep_start_timeout(NULL, -1L);                       \
+       sdt_might_sleep_start_timeout((x)->dmap, -1L);                  \
        __wait_for_completion_io(x);                                    \
        sdt_might_sleep_end();                                          \
 })
@@ -150,7 +154,7 @@ extern void complete_all(struct completion *);
 ({                                                                     \
        int __ret;                                                      \
                                                                        \
-       sdt_might_sleep_start_timeout(NULL, -1L);                       \
+       sdt_might_sleep_start_timeout((x)->dmap, -1L);                  \
        __ret = __wait_for_completion_interruptible(x);                 \
        sdt_might_sleep_end();                                          \
        __ret;                                                          \
@@ -159,7 +163,7 @@ extern void complete_all(struct completion *);
 ({                                                                     \
        int __ret;                                                      \
                                                                        \
-       sdt_might_sleep_start_timeout(NULL, -1L);                       \
+       sdt_might_sleep_start_timeout((x)->dmap, -1L);                  \
        __ret = __wait_for_completion_killable(x);                      \
        sdt_might_sleep_end();                                          \
        __ret;                                                          \
@@ -168,7 +172,7 @@ extern void complete_all(struct completion *);
 ({                                                                     \
        int __ret;                                                      \
                                                                        \
-       sdt_might_sleep_start_timeout(NULL, -1L);                       \
+       sdt_might_sleep_start_timeout((x)->dmap, -1L);                  \
        __ret = __wait_for_completion_state(x, s);                      \
        sdt_might_sleep_end();                                          \
        __ret;                                                          \
@@ -177,7 +181,7 @@ extern void complete_all(struct completion *);
 ({                                                                     \
        unsigned long __ret;                                            \
                                                                        \
-       sdt_might_sleep_start_timeout(NULL, t);                         \
+       sdt_might_sleep_start_timeout((x)->dmap, t);                    \
        __ret = __wait_for_completion_timeout(x, t);                    \
        sdt_might_sleep_end();                                          \
        __ret;                                                          \
@@ -186,7 +190,7 @@ extern void complete_all(struct completion *);
 ({                                                                     \
        unsigned long __ret;                                            \
                                                                        \
-       sdt_might_sleep_start_timeout(NULL, t);                         \
+       sdt_might_sleep_start_timeout((x)->dmap, t);                    \
        __ret = __wait_for_completion_io_timeout(x, t);                 \
        sdt_might_sleep_end();                                          \
        __ret;                                                          \
@@ -195,7 +199,7 @@ extern void complete_all(struct completion *);
 ({                                                                     \
        long __ret;                                                     \
                                                                        \
-       sdt_might_sleep_start_timeout(NULL, t);                         \
+       sdt_might_sleep_start_timeout((x)->dmap, t);                    \
        __ret = __wait_for_completion_interruptible_timeout(x, t);      \
        sdt_might_sleep_end();                                          \
        __ret;                                                          \
@@ -204,7 +208,7 @@ extern void complete_all(struct completion *);
 ({                                                                     \
        long __ret;                                                     \
                                                                        \
-       sdt_might_sleep_start_timeout(NULL, t);                         \
+       sdt_might_sleep_start_timeout((x)->dmap, t);                    \
        __ret = __wait_for_completion_killable_timeout(x, t);           \
        sdt_might_sleep_end();                                          \
        __ret;                                                          \
-- 
2.17.1

Reply via email to