Есть такой механизм wait_event_interruptible, он хороший, вопросов нет. Но иногда, даже с RT 99 приоритетом процесс может слишком долго пробуждаться, то есть проходит слишком много времени между irq_handler и моментом, когда пробуждение отработает
Почитал хорошую статеечку https://kerneltweaks.wordpress.com/2015/03/20/quick-guide-for-choosing-correct-synchronization-mechanism-inside-linux-kernel/
И ничего умнее чем просто ставить какое то число через atomic_set в irq_handler и сделать while(atomic_read == 0) в ожидающем процессе - я не придумал. Вместо wait_event_interruptible
Ясно что идеология работы с устройствами она иная, что обмен по DMA, что IRQ оно не для чего то иного. Там всё не требует быстрой реакции чтобы всё успевало и ничего не терялось. Понятно что не для того всё это сделано, считается что поймал irq handler сделал что надо и свободен. Но что если надо немедленно это сообщить в userspace?
Такое ощущение, что kernel module он при wait_event_interruptible спит прямо вместе с процессом userspace, который вызвал этот конкретный ioctl. Может есть что то более приспособленное для этой цели?
Может какой нибудь типа disable preempt??? Система SMP, почему бы нет. Но вероятно этот wait_event_interruptible или там какой нибудь семафор - они все «хотят спать»