我想了解为什么下面的代码中使用了wake_up_all(&lock->queue)
宏,并且这个宏wake_up_interruptible()
是同一宏吗?
在这方面请指导我,谢谢。
void ttm_read_unlock(struct ttm_lock *lock)
{
spin_lock(&lock->lock);
if (--lock->rw == 0)
wake_up_all(&lock->queue);
spin_unlock(&lock->lock);
}
static bool __ttm_read_lock(struct ttm_lock *lock)
{
bool locked = false;
spin_lock(&lock->lock);
if (unlikely(lock->kill_takers))
{
send_sig(lock->signal, current, 0);
spin_unlock(&lock->lock);
return false;
}
if (lock->rw >= 0 && lock->flags == 0)
{
++lock->rw;
locked = true;
}
spin_unlock(&lock->lock);
return locked;
}
int ttm_read_lock(struct ttm_lock *lock, bool interruptible)
{
int ret = 0;
if (interruptible)
ret = wait_event_interruptible(lock->queue,__ttm_read_lock(lock));
else
wait_event(lock->queue, __ttm_read_lock(lock));
return ret;
}
答案 0 :(得分:0)
当任务在Linux内核中等待队列时,它可以处于可中断或不可中断的等待状态。前者将被信号唤醒,而后者则不会。等待的类型由等待任务在等待队列上等待时控制。
wake_up_all()
函数将唤醒在给定等待队列上等待的每个任务,包括那些可中断和不间断地等待的任务。这段代码使用wake_up_all()
,因为它支持为此特定条件不间断等待的任务(请参见ttm_read_lock()
)。
wake_up_interruptible()
函数仅可中断地等待任务唤醒,因此仅当您不想要在不间断的等待中唤醒任务时才使用。