[PATCH v17 37/47] completion, dept: introduce init_completion_dmap() API

Byungchul Park
2025-10-02T08:14:03Z

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 <byungchul@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