1c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef _LINUX_WAIT_H 2c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define _LINUX_WAIT_H 3c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 4c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define WNOHANG 0x00000001 5c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define WUNTRACED 0x00000002 6c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define WSTOPPED WUNTRACED 7c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define WEXITED 0x00000004 8c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define WCONTINUED 0x00000008 9c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define WNOWAIT 0x01000000 /* Don't reap, just poll status. */ 10c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 11c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __WNOTHREAD 0x20000000 /* Don't wait on children of other threads in this group */ 12c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __WALL 0x40000000 /* Wait on all children, regardless of type */ 13c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __WCLONE 0x80000000 /* Wait only on non-SIGCHLD children */ 14c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 15c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* First argument to waitid: */ 16c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define P_ALL 0 17c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define P_PID 1 18c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define P_PGID 2 19c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 20c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef __KERNEL__ 21c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 22c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/list.h> 23c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/stddef.h> 24c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/spinlock.h> 25c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <asm/system.h> 26c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <asm/current.h> 27c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 28c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querutypedef struct __wait_queue wait_queue_t; 29c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querutypedef int (*wait_queue_func_t)(wait_queue_t *wait, unsigned mode, int sync, void *key); 30c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruint default_wake_function(wait_queue_t *wait, unsigned mode, int sync, void *key); 31c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 32c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct __wait_queue { 33c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned int flags; 34c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define WQ_FLAG_EXCLUSIVE 0x01 35c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru void *private; 36c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru wait_queue_func_t func; 37c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct list_head task_list; 38c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 39c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 40c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct wait_bit_key { 41c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru void *flags; 42c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int bit_nr; 43c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 44c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 45c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct wait_bit_queue { 46c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct wait_bit_key key; 47c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru wait_queue_t wait; 48c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 49c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 50c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct __wait_queue_head { 51c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru spinlock_t lock; 52c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct list_head task_list; 53c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 54c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querutypedef struct __wait_queue_head wait_queue_head_t; 55c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 56c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct task_struct; 57c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 58c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 59c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Macros for declaration and initialisaton of the datatypes 60c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 61c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 62c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __WAITQUEUE_INITIALIZER(name, tsk) { \ 63c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru .private = tsk, \ 64c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru .func = default_wake_function, \ 65c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru .task_list = { NULL, NULL } } 66c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 67c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define DECLARE_WAITQUEUE(name, tsk) \ 68c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru wait_queue_t name = __WAITQUEUE_INITIALIZER(name, tsk) 69c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 70c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __WAIT_QUEUE_HEAD_INITIALIZER(name) { \ 71c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru .lock = __SPIN_LOCK_UNLOCKED(name.lock), \ 72c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru .task_list = { &(name).task_list, &(name).task_list } } 73c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 74c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define DECLARE_WAIT_QUEUE_HEAD(name) \ 75c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru wait_queue_head_t name = __WAIT_QUEUE_HEAD_INITIALIZER(name) 76c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 77c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __WAIT_BIT_KEY_INITIALIZER(word, bit) \ 78c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru { .flags = word, .bit_nr = bit, } 79c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 80c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void init_waitqueue_head(wait_queue_head_t *q); 81c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 82c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void init_waitqueue_entry(wait_queue_t *q, struct task_struct *p) 83c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 84c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru q->flags = 0; 85c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru q->private = p; 86c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru q->func = default_wake_function; 87c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 88c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 89c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void init_waitqueue_func_entry(wait_queue_t *q, 90c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru wait_queue_func_t func) 91c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 92c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru q->flags = 0; 93c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru q->private = NULL; 94c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru q->func = func; 95c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 96c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 97c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline int waitqueue_active(wait_queue_head_t *q) 98c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 99c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return !list_empty(&q->task_list); 100c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 101c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 102c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 103c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Used to distinguish between sync and async io wait context: 104c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * sync i/o typically specifies a NULL wait queue entry or a wait 105c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * queue entry bound to a task (current task) to wake up. 106c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * aio specifies a wait queue entry with an async notification 107c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * callback routine, not associated with any task. 108c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 109c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define is_sync_wait(wait) (!(wait) || ((wait)->private)) 110c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 111c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void FASTCALL(add_wait_queue(wait_queue_head_t *q, wait_queue_t * wait)); 112c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void FASTCALL(add_wait_queue_exclusive(wait_queue_head_t *q, wait_queue_t * wait)); 113c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void FASTCALL(remove_wait_queue(wait_queue_head_t *q, wait_queue_t * wait)); 114c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 115c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void __add_wait_queue(wait_queue_head_t *head, wait_queue_t *new) 116c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 117c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru list_add(&new->task_list, &head->task_list); 118c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 119c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 120c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 121c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Used for wake-one threads: 122c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 123c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void __add_wait_queue_tail(wait_queue_head_t *head, 124c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru wait_queue_t *new) 125c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 126c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru list_add_tail(&new->task_list, &head->task_list); 127c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 128c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 129c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void __remove_wait_queue(wait_queue_head_t *head, 130c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru wait_queue_t *old) 131c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 132c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru list_del(&old->task_list); 133c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 134c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 135c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruvoid FASTCALL(__wake_up(wait_queue_head_t *q, unsigned int mode, int nr, void *key)); 136c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void FASTCALL(__wake_up_locked(wait_queue_head_t *q, unsigned int mode)); 137c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void FASTCALL(__wake_up_sync(wait_queue_head_t *q, unsigned int mode, int nr)); 138c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruvoid FASTCALL(__wake_up_bit(wait_queue_head_t *, void *, int)); 139c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruint FASTCALL(__wait_on_bit(wait_queue_head_t *, struct wait_bit_queue *, int (*)(void *), unsigned)); 140c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruint FASTCALL(__wait_on_bit_lock(wait_queue_head_t *, struct wait_bit_queue *, int (*)(void *), unsigned)); 141c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruvoid FASTCALL(wake_up_bit(void *, int)); 142c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruint FASTCALL(out_of_line_wait_on_bit(void *, int, int (*)(void *), unsigned)); 143c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruint FASTCALL(out_of_line_wait_on_bit_lock(void *, int, int (*)(void *), unsigned)); 144c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruwait_queue_head_t *FASTCALL(bit_waitqueue(void *, int)); 145c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 146c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define wake_up(x) __wake_up(x, TASK_UNINTERRUPTIBLE | TASK_INTERRUPTIBLE, 1, NULL) 147c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define wake_up_nr(x, nr) __wake_up(x, TASK_UNINTERRUPTIBLE | TASK_INTERRUPTIBLE, nr, NULL) 148c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define wake_up_all(x) __wake_up(x, TASK_UNINTERRUPTIBLE | TASK_INTERRUPTIBLE, 0, NULL) 149c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define wake_up_interruptible(x) __wake_up(x, TASK_INTERRUPTIBLE, 1, NULL) 150c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define wake_up_interruptible_nr(x, nr) __wake_up(x, TASK_INTERRUPTIBLE, nr, NULL) 151c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define wake_up_interruptible_all(x) __wake_up(x, TASK_INTERRUPTIBLE, 0, NULL) 152c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define wake_up_locked(x) __wake_up_locked((x), TASK_UNINTERRUPTIBLE | TASK_INTERRUPTIBLE) 153c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define wake_up_interruptible_sync(x) __wake_up_sync((x),TASK_INTERRUPTIBLE, 1) 154c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 155c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __wait_event(wq, condition) \ 156c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querudo { \ 157c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru DEFINE_WAIT(__wait); \ 158c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru \ 159c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru for (;;) { \ 160c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru prepare_to_wait(&wq, &__wait, TASK_UNINTERRUPTIBLE); \ 161c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (condition) \ 162c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru break; \ 163c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru schedule(); \ 164c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru } \ 165c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru finish_wait(&wq, &__wait); \ 166c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} while (0) 167c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 168c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/** 169c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * wait_event - sleep until a condition gets true 170c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @wq: the waitqueue to wait on 171c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @condition: a C expression for the event to wait for 172c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 173c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * The process is put to sleep (TASK_UNINTERRUPTIBLE) until the 174c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @condition evaluates to true. The @condition is checked each time 175c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * the waitqueue @wq is woken up. 176c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 177c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * wake_up() has to be called after changing any variable that could 178c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * change the result of the wait condition. 179c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 180c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define wait_event(wq, condition) \ 181c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querudo { \ 182c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (condition) \ 183c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru break; \ 184c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __wait_event(wq, condition); \ 185c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} while (0) 186c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 187c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __wait_event_timeout(wq, condition, ret) \ 188c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querudo { \ 189c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru DEFINE_WAIT(__wait); \ 190c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru \ 191c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru for (;;) { \ 192c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru prepare_to_wait(&wq, &__wait, TASK_UNINTERRUPTIBLE); \ 193c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (condition) \ 194c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru break; \ 195c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru ret = schedule_timeout(ret); \ 196c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (!ret) \ 197c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru break; \ 198c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru } \ 199c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru finish_wait(&wq, &__wait); \ 200c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} while (0) 201c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 202c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/** 203c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * wait_event_timeout - sleep until a condition gets true or a timeout elapses 204c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @wq: the waitqueue to wait on 205c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @condition: a C expression for the event to wait for 206c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @timeout: timeout, in jiffies 207c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 208c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * The process is put to sleep (TASK_UNINTERRUPTIBLE) until the 209c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @condition evaluates to true. The @condition is checked each time 210c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * the waitqueue @wq is woken up. 211c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 212c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * wake_up() has to be called after changing any variable that could 213c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * change the result of the wait condition. 214c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 215c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * The function returns 0 if the @timeout elapsed, and the remaining 216c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * jiffies if the condition evaluated to true before the timeout elapsed. 217c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 218c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define wait_event_timeout(wq, condition, timeout) \ 219c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru({ \ 220c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru long __ret = timeout; \ 221c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (!(condition)) \ 222c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __wait_event_timeout(wq, condition, __ret); \ 223c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __ret; \ 224c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}) 225c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 226c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __wait_event_interruptible(wq, condition, ret) \ 227c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querudo { \ 228c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru DEFINE_WAIT(__wait); \ 229c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru \ 230c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru for (;;) { \ 231c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru prepare_to_wait(&wq, &__wait, TASK_INTERRUPTIBLE); \ 232c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (condition) \ 233c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru break; \ 234c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (!signal_pending(current)) { \ 235c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru schedule(); \ 236c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru continue; \ 237c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru } \ 238c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru ret = -ERESTARTSYS; \ 239c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru break; \ 240c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru } \ 241c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru finish_wait(&wq, &__wait); \ 242c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} while (0) 243c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 244c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/** 245c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * wait_event_interruptible - sleep until a condition gets true 246c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @wq: the waitqueue to wait on 247c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @condition: a C expression for the event to wait for 248c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 249c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * The process is put to sleep (TASK_INTERRUPTIBLE) until the 250c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @condition evaluates to true or a signal is received. 251c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * The @condition is checked each time the waitqueue @wq is woken up. 252c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 253c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * wake_up() has to be called after changing any variable that could 254c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * change the result of the wait condition. 255c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 256c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * The function will return -ERESTARTSYS if it was interrupted by a 257c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * signal and 0 if @condition evaluated to true. 258c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 259c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define wait_event_interruptible(wq, condition) \ 260c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru({ \ 261c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int __ret = 0; \ 262c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (!(condition)) \ 263c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __wait_event_interruptible(wq, condition, __ret); \ 264c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __ret; \ 265c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}) 266c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 267c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __wait_event_interruptible_timeout(wq, condition, ret) \ 268c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querudo { \ 269c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru DEFINE_WAIT(__wait); \ 270c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru \ 271c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru for (;;) { \ 272c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru prepare_to_wait(&wq, &__wait, TASK_INTERRUPTIBLE); \ 273c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (condition) \ 274c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru break; \ 275c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (!signal_pending(current)) { \ 276c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru ret = schedule_timeout(ret); \ 277c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (!ret) \ 278c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru break; \ 279c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru continue; \ 280c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru } \ 281c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru ret = -ERESTARTSYS; \ 282c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru break; \ 283c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru } \ 284c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru finish_wait(&wq, &__wait); \ 285c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} while (0) 286c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 287c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/** 288c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * wait_event_interruptible_timeout - sleep until a condition gets true or a timeout elapses 289c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @wq: the waitqueue to wait on 290c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @condition: a C expression for the event to wait for 291c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @timeout: timeout, in jiffies 292c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 293c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * The process is put to sleep (TASK_INTERRUPTIBLE) until the 294c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @condition evaluates to true or a signal is received. 295c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * The @condition is checked each time the waitqueue @wq is woken up. 296c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 297c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * wake_up() has to be called after changing any variable that could 298c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * change the result of the wait condition. 299c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 300c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * The function returns 0 if the @timeout elapsed, -ERESTARTSYS if it 301c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * was interrupted by a signal, and the remaining jiffies otherwise 302c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * if the condition evaluated to true before the timeout elapsed. 303c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 304c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define wait_event_interruptible_timeout(wq, condition, timeout) \ 305c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru({ \ 306c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru long __ret = timeout; \ 307c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (!(condition)) \ 308c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __wait_event_interruptible_timeout(wq, condition, __ret); \ 309c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __ret; \ 310c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}) 311c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 312c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __wait_event_interruptible_exclusive(wq, condition, ret) \ 313c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querudo { \ 314c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru DEFINE_WAIT(__wait); \ 315c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru \ 316c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru for (;;) { \ 317c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru prepare_to_wait_exclusive(&wq, &__wait, \ 318c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru TASK_INTERRUPTIBLE); \ 319c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (condition) \ 320c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru break; \ 321c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (!signal_pending(current)) { \ 322c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru schedule(); \ 323c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru continue; \ 324c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru } \ 325c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru ret = -ERESTARTSYS; \ 326c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru break; \ 327c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru } \ 328c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru finish_wait(&wq, &__wait); \ 329c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} while (0) 330c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 331c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define wait_event_interruptible_exclusive(wq, condition) \ 332c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru({ \ 333c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int __ret = 0; \ 334c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (!(condition)) \ 335c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __wait_event_interruptible_exclusive(wq, condition, __ret);\ 336c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __ret; \ 337c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}) 338c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 339c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 340c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Must be called with the spinlock in the wait_queue_head_t held. 341c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 342c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void add_wait_queue_exclusive_locked(wait_queue_head_t *q, 343c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru wait_queue_t * wait) 344c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 345c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru wait->flags |= WQ_FLAG_EXCLUSIVE; 346c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __add_wait_queue_tail(q, wait); 347c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 348c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 349c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 350c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Must be called with the spinlock in the wait_queue_head_t held. 351c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 352c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void remove_wait_queue_locked(wait_queue_head_t *q, 353c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru wait_queue_t * wait) 354c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 355c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __remove_wait_queue(q, wait); 356c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 357c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 358c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 359c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * These are the old interfaces to sleep waiting for an event. 360c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * They are racy. DO NOT use them, use the wait_event* interfaces above. 361c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * We plan to remove these interfaces during 2.7. 362c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 363c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void FASTCALL(sleep_on(wait_queue_head_t *q)); 364c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern long FASTCALL(sleep_on_timeout(wait_queue_head_t *q, 365c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru signed long timeout)); 366c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void FASTCALL(interruptible_sleep_on(wait_queue_head_t *q)); 367c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern long FASTCALL(interruptible_sleep_on_timeout(wait_queue_head_t *q, 368c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru signed long timeout)); 369c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 370c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 371c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Waitqueues which are removed from the waitqueue_head at wakeup time 372c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 373c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruvoid FASTCALL(prepare_to_wait(wait_queue_head_t *q, 374c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru wait_queue_t *wait, int state)); 375c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruvoid FASTCALL(prepare_to_wait_exclusive(wait_queue_head_t *q, 376c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru wait_queue_t *wait, int state)); 377c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruvoid FASTCALL(finish_wait(wait_queue_head_t *q, wait_queue_t *wait)); 378c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruint autoremove_wake_function(wait_queue_t *wait, unsigned mode, int sync, void *key); 379c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruint wake_bit_function(wait_queue_t *wait, unsigned mode, int sync, void *key); 380c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 381c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define DEFINE_WAIT(name) \ 382c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru wait_queue_t name = { \ 383c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru .private = current, \ 384c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru .func = autoremove_wake_function, \ 385c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru .task_list = LIST_HEAD_INIT((name).task_list), \ 386c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru } 387c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 388c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define DEFINE_WAIT_BIT(name, word, bit) \ 389c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct wait_bit_queue name = { \ 390c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru .key = __WAIT_BIT_KEY_INITIALIZER(word, bit), \ 391c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru .wait = { \ 392c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru .private = current, \ 393c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru .func = wake_bit_function, \ 394c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru .task_list = \ 395c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru LIST_HEAD_INIT((name).wait.task_list), \ 396c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru }, \ 397c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru } 398c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 399c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define init_wait(wait) \ 400c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru do { \ 401c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru (wait)->private = current; \ 402c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru (wait)->func = autoremove_wake_function; \ 403c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru INIT_LIST_HEAD(&(wait)->task_list); \ 404c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru } while (0) 405c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 406c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/** 407c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * wait_on_bit - wait for a bit to be cleared 408c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @word: the word being waited on, a kernel virtual address 409c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @bit: the bit of the word being waited on 410c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @action: the function used to sleep, which may take special actions 411c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @mode: the task state to sleep in 412c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 413c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * There is a standard hashed waitqueue table for generic use. This 414c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * is the part of the hashtable's accessor API that waits on a bit. 415c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * For instance, if one were to have waiters on a bitflag, one would 416c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * call wait_on_bit() in threads waiting for the bit to clear. 417c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * One uses wait_on_bit() where one is waiting for the bit to clear, 418c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * but has no intention of setting it. 419c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 420c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline int wait_on_bit(void *word, int bit, 421c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int (*action)(void *), unsigned mode) 422c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 423c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (!test_bit(bit, word)) 424c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return 0; 425c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return out_of_line_wait_on_bit(word, bit, action, mode); 426c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 427c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 428c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/** 429c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * wait_on_bit_lock - wait for a bit to be cleared, when wanting to set it 430c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @word: the word being waited on, a kernel virtual address 431c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @bit: the bit of the word being waited on 432c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @action: the function used to sleep, which may take special actions 433c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @mode: the task state to sleep in 434c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 435c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * There is a standard hashed waitqueue table for generic use. This 436c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * is the part of the hashtable's accessor API that waits on a bit 437c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * when one intends to set it, for instance, trying to lock bitflags. 438c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * For instance, if one were to have waiters trying to set bitflag 439c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * and waiting for it to clear before setting it, one would call 440c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * wait_on_bit() in threads waiting to be able to set the bit. 441c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * One uses wait_on_bit_lock() where one is waiting for the bit to 442c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * clear with the intention of setting it, and when done, clearing it. 443c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 444c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline int wait_on_bit_lock(void *word, int bit, 445c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int (*action)(void *), unsigned mode) 446c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 447c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (!test_and_set_bit(bit, word)) 448c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return 0; 449c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return out_of_line_wait_on_bit_lock(word, bit, action, mode); 450c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 451c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 452c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif /* __KERNEL__ */ 453c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 454c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 455