В модульном драйвере под ядро 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() чего-то не разблокируется. В чем может быть дело?