为什么使用wake_up_all()而不使用wake_up_interruptible()?

时间:2019-06-19 10:01:30

标签: c linux linux-kernel

我想了解为什么下面的代码中使用了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;
}

1 个答案:

答案 0 :(得分:0)

当任务在Linux内核中等待队列时,它可以处于可中断或不可中断的等待状态。前者将被信号唤醒,而后者则不会。等待的类型由等待任务在等待队列上等待时控制。

wake_up_all()函数将唤醒在给定等待队列上等待的每个任务,包括那些可中断和不间断地等待的任务。这段代码使用wake_up_all(),因为它支持为此特定条件不间断等待的任务(请参见ttm_read_lock())。

wake_up_interruptible()函数仅可中断地等待任务唤醒,因此仅当您想要在不间断的等待中唤醒任务时才使用。