FILE
completion.c
File preview with syntax highlighting.
linux-6.19.14/kernel/sched/completion.c
1// SPDX-License-Identifier: GPL-2.0 2 3/* 4 * Generic wait-for-completion handler; 5 * 6 * It differs from semaphores in that their default case is the opposite, 7 * wait_for_completion default blocks whereas semaphore default non-block. The 8 * interface also makes it easy to 'complete' multiple waiting threads, 9 * something which isn't entirely natural for semaphores. 10 * 11 * But more importantly, the primitive documents the usage. Semaphores would 12 * typically be used for exclusion which gives rise to priority inversion. 13 * Waiting for completion is a typically sync point, but not an exclusion point. 14 */ 15 16#include <linux/linkage.h> 17#include <linux/sched/debug.h> 18#include <linux/completion.h> 19#include "sched.h" 20 21static void complete_with_flags(struct completion *x, int wake_flags) 22{ 23 unsigned long flags; 24 25 raw_spin_lock_irqsave(&x->wait.lock, flags); 26 27 if (x->done != UINT_MAX) 28 x->done++; 29 swake_up_locked(&x->wait, wake_flags); 30 raw_spin_unlock_irqrestore(&x->wait.lock, flags); 31} 32 33void complete_on_current_cpu(struct completion *x) 34{ 35 return complete_with_flags(x, WF_CURRENT_CPU); 36} 37 38/** 39 * complete: - signals a single thread waiting on this completion 40 * @x: holds the state of this particular completion 41 * 42 * This will wake up a single thread waiting on this completion. Threads will be 43 * awakened in the same order in which they were queued. 44 * 45 * See also complete_all(), wait_for_completion() and related routines. 46 * 47 * If this function wakes up a task, it executes a full memory barrier before 48 * accessing the task state. 49 */ 50void complete(struct completion *x) 51{ 52 complete_with_flags(x, 0); 53} 54EXPORT_SYMBOL(complete); 55 56/** 57 * complete_all: - signals all threads waiting on this completion 58 * @x: holds the state of this particular completion 59 * 60 * This will wake up all threads waiting on this particular completion event. 61 * 62 * If this function wakes up a task, it executes a full memory barrier before 63 * accessing the task state. 64 * 65 * Since complete_all() sets the completion of @x permanently to done 66 * to allow multiple waiters to finish, a call to reinit_completion() 67 * must be used on @x if @x is to be used again. The code must make 68 * sure that all waiters have woken and finished before reinitializing 69 * @x. Also note that the function completion_done() can not be used 70 * to know if there are still waiters after complete_all() has been called. 71 */ 72void complete_all(struct completion *x) 73{ 74 unsigned long flags; 75 76 lockdep_assert_RT_in_threaded_ctx(); 77 78 raw_spin_lock_irqsave(&x->wait.lock, flags); 79 x->done = UINT_MAX; 80 swake_up_all_locked(&x->wait); 81 raw_spin_unlock_irqrestore(&x->wait.lock, flags); 82} 83EXPORT_SYMBOL(complete_all); 84 85static inline long __sched 86do_wait_for_common(struct completion *x, 87 long (*action)(long), long timeout, int state) 88{ 89 if (!x->done) { 90 DECLARE_SWAITQUEUE(wait); 91 92 do { 93 if (signal_pending_state(state, current)) { 94 timeout = -ERESTARTSYS; 95 break; 96 } 97 __prepare_to_swait(&x->wait, &wait); 98 __set_current_state(state); 99 raw_spin_unlock_irq(&x->wait.lock); 100 timeout = action(timeout); 101 raw_spin_lock_irq(&x->wait.lock); 102 } while (!x->done && timeout); 103 __finish_swait(&x->wait, &wait); 104 if (!x->done) 105 return timeout; 106 } 107 if (x->done != UINT_MAX) 108 x->done--; 109 return timeout ?: 1; 110} 111 112static inline long __sched 113__wait_for_common(struct completion *x, 114 long (*action)(long), long timeout, int state) 115{ 116 might_sleep(); 117 118 complete_acquire(x); 119 120 raw_spin_lock_irq(&x->wait.lock); 121 timeout = do_wait_for_common(x, action, timeout, state); 122 raw_spin_unlock_irq(&x->wait.lock); 123 124 complete_release(x); 125 126 return timeout; 127} 128 129static long __sched 130wait_for_common(struct completion *x, long timeout, int state) 131{ 132 return __wait_for_common(x, schedule_timeout, timeout, state); 133} 134 135static long __sched 136wait_for_common_io(struct completion *x, long timeout, int state) 137{ 138 return __wait_for_common(x, io_schedule_timeout, timeout, state); 139} 140 141/** 142 * wait_for_completion: - waits for completion of a task 143 * @x: holds the state of this particular completion 144 * 145 * This waits to be signaled for completion of a specific task. It is NOT 146 * interruptible and there is no timeout. 147 * 148 * See also similar routines (i.e. wait_for_completion_timeout()) with timeout 149 * and interrupt capability. Also see complete(). 150 */ 151void __sched wait_for_completion(struct completion *x) 152{ 153 wait_for_common(x, MAX_SCHEDULE_TIMEOUT, TASK_UNINTERRUPTIBLE); 154} 155EXPORT_SYMBOL(wait_for_completion); 156 157/** 158 * wait_for_completion_timeout: - waits for completion of a task (w/timeout) 159 * @x: holds the state of this particular completion 160 * @timeout: timeout value in jiffies 161 * 162 * This waits for either a completion of a specific task to be signaled or for a 163 * specified timeout to expire. The timeout is in jiffies. It is not 164 * interruptible. 165 * 166 * Return: 0 if timed out, and positive (at least 1, or number of jiffies left 167 * till timeout) if completed. 168 */ 169unsigned long __sched 170wait_for_completion_timeout(struct completion *x, unsigned long timeout) 171{ 172 return wait_for_common(x, timeout, TASK_UNINTERRUPTIBLE); 173} 174EXPORT_SYMBOL(wait_for_completion_timeout); 175 176/** 177 * wait_for_completion_io: - waits for completion of a task 178 * @x: holds the state of this particular completion 179 * 180 * This waits to be signaled for completion of a specific task. It is NOT 181 * interruptible and there is no timeout. The caller is accounted as waiting 182 * for IO (which traditionally means blkio only). 183 */ 184void __sched wait_for_completion_io(struct completion *x) 185{ 186 wait_for_common_io(x, MAX_SCHEDULE_TIMEOUT, TASK_UNINTERRUPTIBLE); 187} 188EXPORT_SYMBOL(wait_for_completion_io); 189 190/** 191 * wait_for_completion_io_timeout: - waits for completion of a task (w/timeout) 192 * @x: holds the state of this particular completion 193 * @timeout: timeout value in jiffies 194 * 195 * This waits for either a completion of a specific task to be signaled or for a 196 * specified timeout to expire. The timeout is in jiffies. It is not 197 * interruptible. The caller is accounted as waiting for IO (which traditionally 198 * means blkio only). 199 * 200 * Return: 0 if timed out, and positive (at least 1, or number of jiffies left 201 * till timeout) if completed. 202 */ 203unsigned long __sched 204wait_for_completion_io_timeout(struct completion *x, unsigned long timeout) 205{ 206 return wait_for_common_io(x, timeout, TASK_UNINTERRUPTIBLE); 207} 208EXPORT_SYMBOL(wait_for_completion_io_timeout); 209 210/** 211 * wait_for_completion_interruptible: - waits for completion of a task (w/intr) 212 * @x: holds the state of this particular completion 213 * 214 * This waits for completion of a specific task to be signaled. It is 215 * interruptible. 216 * 217 * Return: -ERESTARTSYS if interrupted, 0 if completed. 218 */ 219int __sched wait_for_completion_interruptible(struct completion *x) 220{ 221 long t = wait_for_common(x, MAX_SCHEDULE_TIMEOUT, TASK_INTERRUPTIBLE); 222 223 if (t == -ERESTARTSYS) 224 return t; 225 return 0; 226} 227EXPORT_SYMBOL(wait_for_completion_interruptible); 228 229/** 230 * wait_for_completion_interruptible_timeout: - waits for completion (w/(to,intr)) 231 * @x: holds the state of this particular completion 232 * @timeout: timeout value in jiffies 233 * 234 * This waits for either a completion of a specific task to be signaled or for a 235 * specified timeout to expire. It is interruptible. The timeout is in jiffies. 236 * 237 * Return: -ERESTARTSYS if interrupted, 0 if timed out, positive (at least 1, 238 * or number of jiffies left till timeout) if completed. 239 */ 240long __sched 241wait_for_completion_interruptible_timeout(struct completion *x, 242 unsigned long timeout) 243{ 244 return wait_for_common(x, timeout, TASK_INTERRUPTIBLE); 245} 246EXPORT_SYMBOL(wait_for_completion_interruptible_timeout); 247 248/** 249 * wait_for_completion_killable: - waits for completion of a task (killable) 250 * @x: holds the state of this particular completion 251 * 252 * This waits to be signaled for completion of a specific task. It can be 253 * interrupted by a kill signal. 254 * 255 * Return: -ERESTARTSYS if interrupted, 0 if completed. 256 */ 257int __sched wait_for_completion_killable(struct completion *x) 258{ 259 long t = wait_for_common(x, MAX_SCHEDULE_TIMEOUT, TASK_KILLABLE); 260 261 if (t == -ERESTARTSYS) 262 return t; 263 return 0; 264} 265EXPORT_SYMBOL(wait_for_completion_killable); 266 267int __sched wait_for_completion_state(struct completion *x, unsigned int state) 268{ 269 long t = wait_for_common(x, MAX_SCHEDULE_TIMEOUT, state); 270 271 if (t == -ERESTARTSYS) 272 return t; 273 return 0; 274} 275EXPORT_SYMBOL(wait_for_completion_state); 276 277/** 278 * wait_for_completion_killable_timeout: - waits for completion of a task (w/(to,killable)) 279 * @x: holds the state of this particular completion 280 * @timeout: timeout value in jiffies 281 * 282 * This waits for either a completion of a specific task to be 283 * signaled or for a specified timeout to expire. It can be 284 * interrupted by a kill signal. The timeout is in jiffies. 285 * 286 * Return: -ERESTARTSYS if interrupted, 0 if timed out, positive (at least 1, 287 * or number of jiffies left till timeout) if completed. 288 */ 289long __sched 290wait_for_completion_killable_timeout(struct completion *x, 291 unsigned long timeout) 292{ 293 return wait_for_common(x, timeout, TASK_KILLABLE); 294} 295EXPORT_SYMBOL(wait_for_completion_killable_timeout); 296 297/** 298 * try_wait_for_completion - try to decrement a completion without blocking 299 * @x: completion structure 300 * 301 * Return: 0 if a decrement cannot be done without blocking 302 * 1 if a decrement succeeded. 303 * 304 * If a completion is being used as a counting completion, 305 * attempt to decrement the counter without blocking. This 306 * enables us to avoid waiting if the resource the completion 307 * is protecting is not available. 308 */ 309bool try_wait_for_completion(struct completion *x) 310{ 311 unsigned long flags; 312 bool ret = true; 313 314 /* 315 * Since x->done will need to be locked only 316 * in the non-blocking case, we check x->done 317 * first without taking the lock so we can 318 * return early in the blocking case. 319 */ 320 if (!READ_ONCE(x->done)) 321 return false; 322 323 raw_spin_lock_irqsave(&x->wait.lock, flags); 324 if (!x->done) 325 ret = false; 326 else if (x->done != UINT_MAX) 327 x->done--; 328 raw_spin_unlock_irqrestore(&x->wait.lock, flags); 329 return ret; 330} 331EXPORT_SYMBOL(try_wait_for_completion); 332 333/** 334 * completion_done - Test to see if a completion has any waiters 335 * @x: completion structure 336 * 337 * Return: 0 if there are waiters (wait_for_completion() in progress) 338 * 1 if there are no waiters. 339 * 340 * Note, this will always return true if complete_all() was called on @X. 341 */ 342bool completion_done(struct completion *x) 343{ 344 unsigned long flags; 345 346 if (!READ_ONCE(x->done)) 347 return false; 348 349 /* 350 * If ->done, we need to wait for complete() to release ->wait.lock 351 * otherwise we can end up freeing the completion before complete() 352 * is done referencing it. 353 */ 354 raw_spin_lock_irqsave(&x->wait.lock, flags); 355 raw_spin_unlock_irqrestore(&x->wait.lock, flags); 356 return true; 357} 358EXPORT_SYMBOL(completion_done);
~/
Read-only file preview.