Lines Matching +full:blocking +full:- +full:io
1 // SPDX-License-Identifier: GPL-2.0
4 * Generic wait-for-completion handler;
7 * wait_for_completion default blocks whereas semaphore default non-block. The
20 raw_spin_lock_irqsave(&x->wait.lock, flags); in complete_with_flags()
22 if (x->done != UINT_MAX) in complete_with_flags()
23 x->done++; in complete_with_flags()
24 swake_up_locked(&x->wait, wake_flags); in complete_with_flags()
25 raw_spin_unlock_irqrestore(&x->wait.lock, flags); in complete_with_flags()
34 * complete: - signals a single thread waiting on this completion
52 * complete_all: - signals all threads waiting on this completion
73 raw_spin_lock_irqsave(&x->wait.lock, flags); in complete_all()
74 x->done = UINT_MAX; in complete_all()
75 swake_up_all_locked(&x->wait); in complete_all()
76 raw_spin_unlock_irqrestore(&x->wait.lock, flags); in complete_all()
84 if (!x->done) { in do_wait_for_common()
89 timeout = -ERESTARTSYS; in do_wait_for_common()
92 __prepare_to_swait(&x->wait, &wait); in do_wait_for_common()
94 raw_spin_unlock_irq(&x->wait.lock); in do_wait_for_common()
96 raw_spin_lock_irq(&x->wait.lock); in do_wait_for_common()
97 } while (!x->done && timeout); in do_wait_for_common()
98 __finish_swait(&x->wait, &wait); in do_wait_for_common()
99 if (!x->done) in do_wait_for_common()
102 if (x->done != UINT_MAX) in do_wait_for_common()
103 x->done--; in do_wait_for_common()
115 raw_spin_lock_irq(&x->wait.lock); in __wait_for_common()
117 raw_spin_unlock_irq(&x->wait.lock); in __wait_for_common()
137 * wait_for_completion: - waits for completion of a task
153 * wait_for_completion_timeout: - waits for completion of a task (w/timeout)
172 * wait_for_completion_io: - waits for completion of a task
177 * for IO (which traditionally means blkio only).
186 * wait_for_completion_io_timeout: - waits for completion of a task (w/timeout)
192 * interruptible. The caller is accounted as waiting for IO (which traditionally
206 * wait_for_completion_interruptible: - waits for completion of a task (w/intr)
212 * Return: -ERESTARTSYS if interrupted, 0 if completed.
218 if (t == -ERESTARTSYS) in wait_for_completion_interruptible()
225 * wait_for_completion_interruptible_timeout: - waits for completion (w/(to,intr))
232 * Return: -ERESTARTSYS if interrupted, 0 if timed out, positive (at least 1,
244 * wait_for_completion_killable: - waits for completion of a task (killable)
250 * Return: -ERESTARTSYS if interrupted, 0 if completed.
256 if (t == -ERESTARTSYS) in wait_for_completion_killable()
266 if (t == -ERESTARTSYS) in wait_for_completion_state()
273 * wait_for_completion_killable_timeout: - waits for completion of a task (w/(to,killable))
281 * Return: -ERESTARTSYS if interrupted, 0 if timed out, positive (at least 1,
293 * try_wait_for_completion - try to decrement a completion without blocking
296 * Return: 0 if a decrement cannot be done without blocking
300 * attempt to decrement the counter without blocking. This
310 * Since x->done will need to be locked only in try_wait_for_completion()
311 * in the non-blocking case, we check x->done in try_wait_for_completion()
313 * return early in the blocking case. in try_wait_for_completion()
315 if (!READ_ONCE(x->done)) in try_wait_for_completion()
318 raw_spin_lock_irqsave(&x->wait.lock, flags); in try_wait_for_completion()
319 if (!x->done) in try_wait_for_completion()
321 else if (x->done != UINT_MAX) in try_wait_for_completion()
322 x->done--; in try_wait_for_completion()
323 raw_spin_unlock_irqrestore(&x->wait.lock, flags); in try_wait_for_completion()
329 * completion_done - Test to see if a completion has any waiters
341 if (!READ_ONCE(x->done)) in completion_done()
345 * If ->done, we need to wait for complete() to release ->wait.lock in completion_done()
349 raw_spin_lock_irqsave(&x->wait.lock, flags); in completion_done()
350 raw_spin_unlock_irqrestore(&x->wait.lock, flags); in completion_done()