【发布时间】:2020-12-07 04:46:40
【问题描述】:
https://elixir.bootlin.com/linux/v4.5/source/kernel/sched/wait.c#L172
void prepare_to_wait(wait_queue_head_t *q, wait_queue_t *wait, int state)
{
unsigned long flags;
wait->flags &= ~WQ_FLAG_EXCLUSIVE;
spin_lock_irqsave(&q->lock, flags);
if (list_empty(&wait->task_list))
__add_wait_queue(q, wait);
set_current_state(state);
spin_unlock_irqrestore(&q->lock, flags);
}
在上面的代码中,我们可以看到 __add_wait_queue(q, wait) 仅在 list_empty(&wait->task_list) 为真时执行。
为什么当&wait->task_list不为空时,那么wait就不需要加到q(wait_queue_head_t)了?
这是否意味着如果 wait (wait_queue_t) 已经在 q (wait_queue_head_t) 中,则不要更改它?
【问题讨论】: