sched/wait: Add wait_event_state()
Allows waiting with a custom @state. Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Reviewed-by: Ingo Molnar <mingo@kernel.org> Link: https://lore.kernel.org/r/20220822114648.989212021@infradead.org
This commit is contained in:
Родитель
929659acea
Коммит
3f884a10ab
|
@ -932,6 +932,34 @@ extern int do_wait_intr_irq(wait_queue_head_t *, wait_queue_entry_t *);
|
|||
__ret; \
|
||||
})
|
||||
|
||||
#define __wait_event_state(wq, condition, state) \
|
||||
___wait_event(wq, condition, state, 0, 0, schedule())
|
||||
|
||||
/**
|
||||
* wait_event_state - sleep until a condition gets true
|
||||
* @wq_head: the waitqueue to wait on
|
||||
* @condition: a C expression for the event to wait for
|
||||
* @state: state to sleep in
|
||||
*
|
||||
* The process is put to sleep (@state) until the @condition evaluates to true
|
||||
* or a signal is received (when allowed by @state). The @condition is checked
|
||||
* each time the waitqueue @wq_head is woken up.
|
||||
*
|
||||
* wake_up() has to be called after changing any variable that could
|
||||
* change the result of the wait condition.
|
||||
*
|
||||
* The function will return -ERESTARTSYS if it was interrupted by a signal
|
||||
* (when allowed by @state) and 0 if @condition evaluated to true.
|
||||
*/
|
||||
#define wait_event_state(wq_head, condition, state) \
|
||||
({ \
|
||||
int __ret = 0; \
|
||||
might_sleep(); \
|
||||
if (!(condition)) \
|
||||
__ret = __wait_event_state(wq_head, condition, state); \
|
||||
__ret; \
|
||||
})
|
||||
|
||||
#define __wait_event_killable_timeout(wq_head, condition, timeout) \
|
||||
___wait_event(wq_head, ___wait_cond_timeout(condition), \
|
||||
TASK_KILLABLE, 0, timeout, \
|
||||
|
|
Загрузка…
Ссылка в новой задаче