Sometimes, we want to initialize completions with sparate lockdep maps
to assign lock classes under control. For example, the workqueue code
manages lockdep maps, as it can classify lockdep maps properly.
Provided a function for that purpose.

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

diff --git a/include/linux/completion.h b/include/linux/completion.h
index cae5400..182d56e 100644
--- a/include/linux/completion.h
+++ b/include/linux/completion.h
@@ -49,6 +49,13 @@ static inline void complete_release_commit(struct completion 
*x)
        lock_commit_crosslock((struct lockdep_map *)&x->map);
 }
 
+#define init_completion_with_map(x, m)                                 \
+do {                                                                   \
+       lockdep_init_map_crosslock((struct lockdep_map *)&(x)->map,     \
+                       (m)->name, (m)->key, 0);                                
\
+       __init_completion(x);                                           \
+} while (0)
+
 #define init_completion(x)                                             \
 do {                                                                   \
        static struct lock_class_key __key;                             \
@@ -58,6 +65,7 @@ static inline void complete_release_commit(struct completion 
*x)
        __init_completion(x);                                           \
 } while (0)
 #else
+#define init_completion_with_map(x, m) __init_completion(x)
 #define init_completion(x) __init_completion(x)
 static inline void complete_acquire(struct completion *x) {}
 static inline void complete_release(struct completion *x) {}
-- 
1.9.1

Reply via email to