diff options
author | Nicholas Mc Guire <hofrat@osadl.org> | 2015-02-20 12:28:48 -0500 |
---|---|---|
committer | Jonathan Corbet <corbet@lwn.net> | 2015-04-04 09:20:26 -0400 |
commit | 4988aaa6e508614e5d4c4f08723635fc8191188b (patch) | |
tree | b2c87001796ae2f3e9537b6173c897adea7a4bb8 | |
parent | 4997166a393851d0595f85cbe1195208d582e172 (diff) |
doc: completion: context, scope and language fixes
Fix for imprecise/wrong statements on context in which wait_for_completion*()
can be called, updated notes on "going out of scope" problems and some
language fixups.
Signed-off-by: Nicholas Mc Guire <hofrat@osadl.org>
Acked-by: Ingo Molnar <mingo@kernel.org>
Signed-off-by: Jonathan Corbet <corbet@lwn.net>
-rw-r--r-- | Documentation/scheduler/completion.txt | 99 |
1 files changed, 55 insertions, 44 deletions
diff --git a/Documentation/scheduler/completion.txt b/Documentation/scheduler/completion.txt index f77651eca31e..083d9c931b8d 100644 --- a/Documentation/scheduler/completion.txt +++ b/Documentation/scheduler/completion.txt | |||
@@ -11,11 +11,11 @@ to have reached a point or a specific state, completions can provide a race | |||
11 | free solution to this problem. Semantically they are somewhat like a | 11 | free solution to this problem. Semantically they are somewhat like a |
12 | pthread_barriers and have similar use-cases. | 12 | pthread_barriers and have similar use-cases. |
13 | 13 | ||
14 | Completions are a code synchronization mechanism that is preferable to any | 14 | Completions are a code synchronization mechanism which are preferable to any |
15 | misuse of locks. Any time you think of using yield() or some quirky | 15 | misuse of locks. Any time you think of using yield() or some quirky |
16 | msleep(1); loop to allow something else to proceed, you probably want to | 16 | msleep(1); loop to allow something else to proceed, you probably want to |
17 | look into using one of the wait_for_completion*() calls instead. The | 17 | look into using one of the wait_for_completion*() calls instead. The |
18 | advantage of using completions is clear intent of the code but also more | 18 | advantage of using completions is clear intent of the code, but also more |
19 | efficient code as both threads can continue until the result is actually | 19 | efficient code as both threads can continue until the result is actually |
20 | needed. | 20 | needed. |
21 | 21 | ||
@@ -24,7 +24,7 @@ with the event reduced to a simple flag appropriately called "done" in | |||
24 | struct completion, that tells the waiting threads of execution if they | 24 | struct completion, that tells the waiting threads of execution if they |
25 | can continue safely. | 25 | can continue safely. |
26 | 26 | ||
27 | As completions are scheduling related the code is found in | 27 | As completions are scheduling related, the code is found in |
28 | kernel/sched/completion.c - for details on completion design and | 28 | kernel/sched/completion.c - for details on completion design and |
29 | implementation see completions-design.txt | 29 | implementation see completions-design.txt |
30 | 30 | ||
@@ -32,9 +32,9 @@ implementation see completions-design.txt | |||
32 | Usage: | 32 | Usage: |
33 | ------ | 33 | ------ |
34 | 34 | ||
35 | There are three parts to the using completions, the initialization of the | 35 | There are three parts to using completions, the initialization of the |
36 | struct completion, the waiting part through a call to one of the variants of | 36 | struct completion, the waiting part through a call to one of the variants of |
37 | wait_for_completion() and the signaling side through a call to complete(), | 37 | wait_for_completion() and the signaling side through a call to complete() |
38 | or complete_all(). Further there are some helper functions for checking the | 38 | or complete_all(). Further there are some helper functions for checking the |
39 | state of completions. | 39 | state of completions. |
40 | 40 | ||
@@ -50,7 +50,7 @@ handling of completions is: | |||
50 | providing the wait queue to place tasks on for waiting and the flag for | 50 | providing the wait queue to place tasks on for waiting and the flag for |
51 | indicating the state of affairs. | 51 | indicating the state of affairs. |
52 | 52 | ||
53 | Completions should be named to convey the intent of the waiter. A good | 53 | Completions should be named to convey the intent of the waiter. A good |
54 | example is: | 54 | example is: |
55 | 55 | ||
56 | wait_for_completion(&early_console_added); | 56 | wait_for_completion(&early_console_added); |
@@ -73,7 +73,7 @@ the default state to "not available", that is, "done" is set to 0. | |||
73 | 73 | ||
74 | The re-initialization function, reinit_completion(), simply resets the | 74 | The re-initialization function, reinit_completion(), simply resets the |
75 | done element to "not available", thus again to 0, without touching the | 75 | done element to "not available", thus again to 0, without touching the |
76 | wait queue. Calling init_completion() on the same completions object is | 76 | wait queue. Calling init_completion() on the same completion object is |
77 | most likely a bug as it re-initializes the queue to an empty queue and | 77 | most likely a bug as it re-initializes the queue to an empty queue and |
78 | enqueued tasks could get "lost" - use reinit_completion() in that case. | 78 | enqueued tasks could get "lost" - use reinit_completion() in that case. |
79 | 79 | ||
@@ -87,10 +87,17 @@ initialization should always use: | |||
87 | DECLARE_COMPLETION_ONSTACK(setup_done) | 87 | DECLARE_COMPLETION_ONSTACK(setup_done) |
88 | 88 | ||
89 | suitable for automatic/local variables on the stack and will make lockdep | 89 | suitable for automatic/local variables on the stack and will make lockdep |
90 | happy. Note also that one needs to making *sure* the completion passt to | 90 | happy. Note also that one needs to make *sure* the completion passed to |
91 | work threads remains in-scope, and no references remain to on-stack data | 91 | work threads remains in-scope, and no references remain to on-stack data |
92 | when the initiating function returns. | 92 | when the initiating function returns. |
93 | 93 | ||
94 | Using on-stack completions for code that calls any of the _timeout or | ||
95 | _interruptible/_killable variants is not advisable as they will require | ||
96 | additional synchronization to prevent the on-stack completion object in | ||
97 | the timeout/signal cases from going out of scope. Consider using dynamically | ||
98 | allocated completions when intending to use the _interruptible/_killable | ||
99 | or _timeout variants of wait_for_completion(). | ||
100 | |||
94 | 101 | ||
95 | Waiting for completions: | 102 | Waiting for completions: |
96 | ------------------------ | 103 | ------------------------ |
@@ -101,21 +108,22 @@ A typical usage scenario is: | |||
101 | 108 | ||
102 | structure completion setup_done; | 109 | structure completion setup_done; |
103 | init_completion(&setup_done); | 110 | init_completion(&setup_done); |
104 | initialze_work(...,&setup_done,...) | 111 | initialize_work(...,&setup_done,...) |
105 | 112 | ||
106 | /* run non-dependent code */ /* do setup */ | 113 | /* run non-dependent code */ /* do setup */ |
107 | 114 | ||
108 | wait_for_completion(&seupt_done); complete(setup_done) | 115 | wait_for_completion(&setup_done); complete(setup_done) |
109 | 116 | ||
110 | This is not implying any temporal order of wait_for_completion() and the | 117 | This is not implying any temporal order on wait_for_completion() and the |
111 | call to complete() - if the call to complete() happened before the call | 118 | call to complete() - if the call to complete() happened before the call |
112 | to wait_for_completion() then the waiting side simply will continue | 119 | to wait_for_completion() then the waiting side simply will continue |
113 | immediately as all dependencies are satisfied. | 120 | immediately as all dependencies are satisfied if not it will block until |
121 | completion is signaled by complete(). | ||
114 | 122 | ||
115 | Note that wait_for_completion() is calling spin_lock_irq/spin_unlock_irq | 123 | Note that wait_for_completion() is calling spin_lock_irq/spin_unlock_irq |
116 | so it can only be called safely when you know that interrupts are enabled. | 124 | so it can only be called safely when you know that interrupts are enabled. |
117 | Calling it from hard-irq context will result in hard to detect spurious | 125 | Calling it from hard-irq or irqs-off atomic contexts will result in hard |
118 | enabling of interrupts. | 126 | to detect spurious enabling of interrupts. |
119 | 127 | ||
120 | wait_for_completion(): | 128 | wait_for_completion(): |
121 | 129 | ||
@@ -123,10 +131,13 @@ wait_for_completion(): | |||
123 | 131 | ||
124 | The default behavior is to wait without a timeout and mark the task as | 132 | The default behavior is to wait without a timeout and mark the task as |
125 | uninterruptible. wait_for_completion() and its variants are only safe | 133 | uninterruptible. wait_for_completion() and its variants are only safe |
126 | in soft-interrupt or process context but not in hard-irq context. | 134 | in process context (as they can sleep) but not in atomic context, |
135 | interrupt context, with disabled irqs. or preemption is disabled - see also | ||
136 | try_wait_for_completion() below for handling completion in atomic/interrupt | ||
137 | context. | ||
138 | |||
127 | As all variants of wait_for_completion() can (obviously) block for a long | 139 | As all variants of wait_for_completion() can (obviously) block for a long |
128 | time, you probably don't want to call this with held locks - see also | 140 | time, you probably don't want to call this with held mutexes. |
129 | try_wait_for_completion() below. | ||
130 | 141 | ||
131 | 142 | ||
132 | Variants available: | 143 | Variants available: |
@@ -141,20 +152,20 @@ A common problem that occurs is to have unclean assignment of return types, | |||
141 | so care should be taken with assigning return-values to variables of proper | 152 | so care should be taken with assigning return-values to variables of proper |
142 | type. Checking for the specific meaning of return values also has been found | 153 | type. Checking for the specific meaning of return values also has been found |
143 | to be quite inaccurate e.g. constructs like | 154 | to be quite inaccurate e.g. constructs like |
144 | if(!wait_for_completion_interruptible_timeout(...)) would execute the same | 155 | if (!wait_for_completion_interruptible_timeout(...)) would execute the same |
145 | code path for successful completion and for the interrupted case - which is | 156 | code path for successful completion and for the interrupted case - which is |
146 | probably not what you want. | 157 | probably not what you want. |
147 | 158 | ||
148 | int wait_for_completion_interruptible(struct completion *done) | 159 | int wait_for_completion_interruptible(struct completion *done) |
149 | 160 | ||
150 | marking the task TASK_INTERRUPTIBLE. If a signal was received while waiting. | 161 | This function marks the task TASK_INTERRUPTIBLE. If a signal was received |
151 | It will return -ERESTARTSYS and 0 otherwise. | 162 | while waiting it will return -ERESTARTSYS and 0 otherwise. |
152 | 163 | ||
153 | unsigned long wait_for_completion_timeout(struct completion *done, | 164 | unsigned long wait_for_completion_timeout(struct completion *done, |
154 | unsigned long timeout) | 165 | unsigned long timeout) |
155 | 166 | ||
156 | The task is marked as TASK_UNINTERRUPTIBLE and will wait at most timeout | 167 | The task is marked as TASK_UNINTERRUPTIBLE and will wait at most 'timeout' |
157 | (in jiffies). If timeout occurs it return 0 else the remaining time in | 168 | (in jiffies). If timeout occurs it returns 0 else the remaining time in |
158 | jiffies (but at least 1). Timeouts are preferably passed by msecs_to_jiffies() | 169 | jiffies (but at least 1). Timeouts are preferably passed by msecs_to_jiffies() |
159 | or usecs_to_jiffies(). If the returned timeout value is deliberately ignored | 170 | or usecs_to_jiffies(). If the returned timeout value is deliberately ignored |
160 | a comment should probably explain why (e.g. see drivers/mfd/wm8350-core.c | 171 | a comment should probably explain why (e.g. see drivers/mfd/wm8350-core.c |
@@ -163,21 +174,21 @@ wm8350_read_auxadc()) | |||
163 | long wait_for_completion_interruptible_timeout( | 174 | long wait_for_completion_interruptible_timeout( |
164 | struct completion *done, unsigned long timeout) | 175 | struct completion *done, unsigned long timeout) |
165 | 176 | ||
166 | passing a timeout in jiffies and marking the task as TASK_INTERRUPTIBLE. If a | 177 | This function passes a timeout in jiffies and marking the task as |
167 | signal was received it will return -ERESTARTSYS, 0 if completion timed-out and | 178 | TASK_INTERRUPTIBLE. If a signal was received it will return -ERESTARTSYS, 0 if |
168 | the remaining time in jiffies if completion occurred. | 179 | completion timed out and the remaining time in jiffies if completion occurred. |
169 | 180 | ||
170 | Further variants include _killable which passes TASK_KILLABLE as the | 181 | Further variants include _killable which passes TASK_KILLABLE as the |
171 | designated tasks state and will return a -ERESTARTSYS if interrupted or | 182 | designated tasks state and will return -ERESTARTSYS if interrupted or |
172 | else 0 if completions was achieved as well as a _timeout variant. | 183 | else 0 if completion was achieved as well as a _timeout variant. |
173 | 184 | ||
174 | long wait_for_completion_killable(struct completion *done) | 185 | long wait_for_completion_killable(struct completion *done) |
175 | long wait_for_completion_killable_timeout(struct completion *done, | 186 | long wait_for_completion_killable_timeout(struct completion *done, |
176 | unsigned long timeout) | 187 | unsigned long timeout) |
177 | 188 | ||
178 | The _io variants wait_for_completion_io behave the same as the non-_io | 189 | The _io variants wait_for_completion_io() behave the same as the non-_io |
179 | variants, except for accounting waiting time as waiting on IO, which has | 190 | variants, except for accounting waiting time as waiting on IO, which has |
180 | an impact on how scheduling is calculated. | 191 | an impact on how the task is accounted in scheduling stats. |
181 | 192 | ||
182 | void wait_for_completion_io(struct completion *done) | 193 | void wait_for_completion_io(struct completion *done) |
183 | unsigned long wait_for_completion_io_timeout(struct completion *done | 194 | unsigned long wait_for_completion_io_timeout(struct completion *done |
@@ -187,13 +198,13 @@ an impact on how scheduling is calculated. | |||
187 | Signaling completions: | 198 | Signaling completions: |
188 | ---------------------- | 199 | ---------------------- |
189 | 200 | ||
190 | A thread of execution that wants to signal that the conditions for | 201 | A thread that wants to signal that the conditions for continuation have been |
191 | continuation have been achieved calls complete() to signal exactly one | 202 | achieved calls complete() to signal exactly one of the waiters that it can |
192 | of the waiters that it can continue. | 203 | continue. |
193 | 204 | ||
194 | void complete(struct completion *done) | 205 | void complete(struct completion *done) |
195 | 206 | ||
196 | or calls complete_all to signal all current and future waiters. | 207 | or calls complete_all() to signal all current and future waiters. |
197 | 208 | ||
198 | void complete_all(struct completion *done) | 209 | void complete_all(struct completion *done) |
199 | 210 | ||
@@ -205,32 +216,32 @@ wakeup order is the same in which they were enqueued (FIFO order). | |||
205 | If complete() is called multiple times then this will allow for that number | 216 | If complete() is called multiple times then this will allow for that number |
206 | of waiters to continue - each call to complete() will simply increment the | 217 | of waiters to continue - each call to complete() will simply increment the |
207 | done element. Calling complete_all() multiple times is a bug though. Both | 218 | done element. Calling complete_all() multiple times is a bug though. Both |
208 | complete() and complete_all() can be called in hard-irq context safely. | 219 | complete() and complete_all() can be called in hard-irq/atomic context safely. |
209 | 220 | ||
210 | There only can be one thread calling complete() or complete_all() on a | 221 | There only can be one thread calling complete() or complete_all() on a |
211 | particular struct completions at any time - serialized through the wait | 222 | particular struct completion at any time - serialized through the wait |
212 | queue spinlock. Any such concurrent calls to complete() or complete_all() | 223 | queue spinlock. Any such concurrent calls to complete() or complete_all() |
213 | probably are a design bug. | 224 | probably are a design bug. |
214 | 225 | ||
215 | Signaling completion from hard-irq context is fine as it will appropriately | 226 | Signaling completion from hard-irq context is fine as it will appropriately |
216 | lock with spin_lock_irqsave/spin_unlock_irqrestore. | 227 | lock with spin_lock_irqsave/spin_unlock_irqrestore and it will never sleep. |
217 | 228 | ||
218 | 229 | ||
219 | try_wait_for_completion()/completion_done(): | 230 | try_wait_for_completion()/completion_done(): |
220 | -------------------------------------------- | 231 | -------------------------------------------- |
221 | 232 | ||
222 | The try_wait_for_completion will not put the thread on the wait queue but | 233 | The try_wait_for_completion() function will not put the thread on the wait |
223 | rather returns false if it would need to enqueue (block) the thread, else it | 234 | queue but rather returns false if it would need to enqueue (block) the thread, |
224 | consumes any posted completions and returns true. | 235 | else it consumes any posted completions and returns true. |
225 | 236 | ||
226 | bool try_wait_for_completion(struct completion *done) | 237 | bool try_wait_for_completion(struct completion *done) |
227 | 238 | ||
228 | Finally to check state of a completions without changing it in any way is | 239 | Finally to check state of a completion without changing it in any way is |
229 | provided by completion_done() returning false if there are any posted | 240 | provided by completion_done() returning false if there is any posted |
230 | completion that was not yet consumed by waiters implying that there are | 241 | completion that was not yet consumed by waiters implying that there are |
231 | waiters and true otherwise; | 242 | waiters and true otherwise; |
232 | 243 | ||
233 | bool completion_done(struct completion *done) | 244 | bool completion_done(struct completion *done) |
234 | 245 | ||
235 | Both try_wait_for_completion() and completion_done() are safe to be called in | 246 | Both try_wait_for_completion() and completion_done() are safe to be called in |
236 | hard-irq context. | 247 | hard-irq or atomic context. |