Зачем использовать wake_up_all (), а не wake_up_interruptible ()? - PullRequest
0 голосов
/ 19 июня 2019

Я хочу понять, почему в приведенном ниже коде используется макрос 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 голосов
/ 20 июня 2019

Когда задача ожидает очереди ожидания в ядре Linux, она может находиться в режиме непрерывного или непрерывного ожидания. Первый будет разбужен сигналами, а второй нет. Тип ожидания определяется задачей ожидания, когда она ожидает очередь ожидания.

Функция wake_up_all() активирует каждую задачу, ожидающую в данной очереди ожидания, и те, и другие ожидают непрерывно и непрерывно. Этот код использует wake_up_all(), потому что он поддерживает задачи, непрерывно ожидающие этого конкретного условия (см. ttm_read_lock()).

Функция wake_up_interruptible() только запускает задачи, ожидающие прерывания, поэтому будет использоваться, только если вы не хотите вызывать задачи в режиме непрерывного ожидания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...