在设备的结构体中定义 wait_queue_head_t , 该结构定义如下:
struct __wait_queue_head {
spinlock_t lock;
struct list_head task_list;
};
在需要阻塞函数中定义并初始化 wait_queue_t , 该结构定义如下:
struct __wait_queue {
unsigned int flags;
#define WQ_FLAG_EXCLUSIVE 0x01
void *private;
wait_queue_func_t func;
struct list_head task_list;
};
在需要阻塞的地方使用
static inline void __add_wait_queue(wait_queue_head_t *head, wait_queue_t *new)
{
list_add(&new->task_list, &head->task_list);
}
其中 list_add(&new->task_list, &head->task_list); 就是把需要阻塞的__wait_queue中的 task_list 加入 __wait_queue_head中的 task_list。
在需要结束阻塞的地方使用
void fastcall __wake_up(wait_queue_head_t *q, unsigned int mode,
int nr_exclusive, void *key)
{
unsigned long flags;
spin_lock_irqsave(&q->lock, flags);
__wake_up_common(q, mode, nr_exclusive, 0, key);
spin_unlock_irqrestore(&q->lock, flags);
}
唤醒 wait_queue_head_t 中等待的 _wait_queue。