LINUX.ORG.RU

Не работает wake_up_interruptible(), вызванная из tasklet-а


0

0

В модульном драйвере под ядро 2.4 в точке входа write () есть такой код:

init_waitqueue_entry(&wait,current);

add_wait_queue(&devData->wait_queue, &wait);

// Инициализирую и запускаю таймер

devData->timer.expires = jiffies + HZ*((float)devData->timeout / 1000.);

add_timer(&devData->timer);

// программирую железяку для выдачи прерываний

mppa_start_irq(devData);

// жду либо прерываний, либо таймаута

interruptible_sleep_on(&devData->wait_queue);

remove_wait_queue(&devData->wait_queue, &wait);

Так вот, если потом wake_up_interruptible(&devData->wait_queue) вызывается из обработчика таймера - все нормально, write() разблокируется, а если прерывания все-таки были и wake_up_interruptible(&devData->wait_queue) вызывается из соответствующего тасклета - то write() чего-то не разблокируется. В чем может быть дело?


> init_waitqueue_entry(&wait,current);
> add_wait_queue(&devData->wait_queue, &wait);

Лишнее, если используется interruptible_sleep_on().
Эта функция сама засунет процесс в очередь, и он
там будет висеть в двух экземплярах.

> // программирую железяку для выдачи прерываний
>
> mppa_start_irq(devData);

Прерывание приходит, вызывает wake_up_interruptible(),
процесс удаляется из очереди.

> // жду либо прерываний, либо таймаута
> interruptible_sleep_on(&devData->wait_queue);

Будет разбужен следующим прерыванием (если оно будет),
или таймером, если он не был снят обработчиком прерывания.

Еще раз рекомендую потратить пару дней и прочитать
Рубини. Сэкономите массу времени. Лично я ваши
посты больше читать не буду :)))

idle ★★★★★
()

Приблизительно вот так надо. sleep_on() можно
пользоваться только если _очень_ хорошо понимаешь,
что делаешь.

init_waitqueue_entry(&wait, current);
add_wait_queue(&devData->wait_queue, &wait);

set_current_state(TASK_INTERRUPTIBLE);

add_timer(&devData->timer);
mppa_start_irq(devData);

schedule();

del_timer_sync(&devData->timer);

remove_wait_queue(&devData->wait_queue, &wait);

if (signal_pending(current)) .......

idle ★★★★★
()
Ответ на: комментарий от idle

Спсибо за ваши рекомендации. С указанной вами книгой я стараюсь знакомиться по ходу дела - она у меня под рукой. У меня жуткая нехватка времени, по-этому вынужден обращаться с подобными вопросами на форум:-))

snilga
() автор топика
Ответ на: комментарий от snilga

Слушай, поделись, пожалуйста книгой. Сколько уже найти не могу - всю сеть излазил. Если время будет - залей,плз, на dct@ezmail.ru. Спасибо

anonymous
()

Посмотри в ядре код nterruptible_sleep_on, это поможет :) Также посмотри функции семейства wait_event, IMHO хдесь они лучше подойдут.

kiv
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.