Суть: создаю символьный драйвер он должен прокачивать 1Гбит/сек для этого имеется очередь DMA от PCI железа. Для приема я создал поток(kthread) и связал его с одним из ядер. Поток запускается и ждет события (wait_event_interrupt_timeout). Событие наступает по прерыванию(irq). Как только наступает прерывание irq делаем disable irq и выстовляем wake_up. Проснувшись поток работает пока все не вычитает. Читает и складывает в kfifo. Как только чтение окончено делаем enable irq, возвращаемся к ожиданию события. read драйвера считывает данные из kfifo. Так примерно работает драйвер. Я пытался создать нечто подобное сетевому драйверу c napi, чтобы мой поток был функцией опроса.
Некоторый нюанс по работе драйвера выяснился при отладке. При опросе можно получить что нет данных на чтение и перейти в ожидание события (irq), как бы норм, но выяснилось что драйвер не успевает все выгребать и очередь dma становиться переполненой -> железо падает. Дописан кастыль - приходиться опрашивать 100 раз есть ли данные, и если 100 раз нет, то только тогда перейти в ожидание. Кастыль помогает принять все данные. Но, выясняется другое, пользовательское приложение не успевает выгребать kfifo [не могу понять по какой причине](приложение, имеет поток на чтение, в котором стоит while(1) read(/dev/my_device)) в результате kfifo будет перезаписано потоком приема -> потеря данных.
Прошу высказать советы и пожелания по поводу улучшения или создания новой архитектуры драйвера.