Хронометраж в ядре Linux 2.6 - PullRequest
       11

Хронометраж в ядре Linux 2.6

9 голосов
/ 17 февраля 2009

Я прочитал главу 7 в «Драйверы устройств Linux» (которую можно найти здесь) , что время можно измерить в «jiffies». Проблема с переменной stock jiffies заключается в том, что она используется довольно часто (особенно, если для CONFIG_HZ установлено значение 1000).

В моем модуле ядра я сохраняю значение jiffies, которое будет установлено на некоторое время в будущем, и сравниваю его позднее с текущим значением 'jiffies'. Я уже узнал, что есть функции, которые принимают во внимание 32-битную упаковку jiffy, поэтому для сравнения двух значений я использую это:

if (time_after(jiffies, some_future_jiffies_value))
{
   // we've already passed the saved value
}

Вот мой вопрос: так что теперь я хочу установить 'some_future_jiffies_value' в значение "сейчас + 10 мс". Это может быть легко достигнуто следующим образом:

some_future_jiffies_value = jiffies + msecs_to_jiffies(10);

Это правильно? Что произойдет, если текущие jiffies находятся рядом с MAX_JIFFY_OFFSET и полученное значение msecs_to_jiffies (10) помещает some_future_jiffies_value за это смещение? Это происходит автоматически или я должен добавить код, чтобы проверить это? Существуют ли функции, которые избавляют меня от необходимости иметь дело с этим?

Обновление:

Чтобы избежать неприятностей, я переписал свой цикл сна:

   // Sleep for the appropriate time
   while (time_after(some_future_jiffies_value, jiffies))
   {
      set_current_state(TASK_INTERRUPTIBLE);
      schedule_timeout(1);
   }

Полагаю, это более переносимо, верно?

Обновление 2:

Большое спасибо 'ctuffli' за то, что вы нашли время вернуться к этому вопросу, а также предоставили некоторые отзывы о моих комментариях. Мой драйвер ядра теперь работает нормально, и он намного менее уродлив по сравнению с ситуацией до того, как вы предоставили мне все эти советы. Спасибо!

1 Ответ

8 голосов
/ 17 февраля 2009

То, что вы реализуете здесь, по сути является msleep_interruptible () (linux / kernel / timer.c)

/**
 * msleep_interruptible - sleep waiting for signals
 * @msecs: Time in milliseconds to sleep for
 */
unsigned long msleep_interruptible(unsigned int msecs)

Преимущество этой функции заключается в том, что спецификация указывается в миллисекундах и скрывает детали упаковки jiffies внутри. Обязательно проверяйте возвращаемые значения, так как этот вызов возвращает количество оставшихся jiffies. Ноль означает, что вызов просидел указанное количество миллисекунд, в то время как ненулевое значение указывает, что вызов был прерван во время этого большого количества ошибок.

Что касается упаковки, см. Раздел 6.2.1.2 для описания смешков и упаковки. Кроме того, этот пост пытается описать перенос в аннотации.

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