Укажите правильный подход в таком вопросе: Модуль должен получить от устройства данные, и сообщить проге об этом. Причем не хотелось бы спать в ioctl или read. Как это сделать идеологически правильно ?
Значит данные валятся в kernel space по DMA, при заполнении буфера модуль должен сказать проге из user space, чтоб забрала данные. Я так понимаю, что при poll/select надо эти вызовы постоянно делать, а вот еслибы user прога во время приема своими делами занималась, а как буфер заполниться модуль типа прерывания выставляет, типа забирай данные.
Совершенно верно. Я ж не знаю как у вас прога устроена. Если она threaded ничего не мешает просто read делать (чтение устройства в отдельной нити), иначе цикл (event loop) по всем интересующим file descriptor - ам. X connection - тоже file descriptor, так что можно устроить жизнь таким образом, что one-threaded программа спит большую часть времени и просыпается, когда пользователь мышой поелозит или данные с устройства придут.
Драйвер принимает данные из PCI-устройства, после заполнения одного из буферов должен сообщить юзер процессу, что данные готовы. Ну а юзер процесс ну например в файл их скидывает. При этом бы хотелось запустить драйвер один раз (через ioctl) и чтоб драйвер посылал сигналы из прерывания DMA (т.е. когда буфер заполнен). Т.е. схема такая процесс запускает DMA (ioctl), а дальше тока отлавливает сигналы от модуля об окончании приема. Модуль же при заполнении буфера входит в прерывание от DMA, посылает сигнал пользователю и перенастраивает DMA для дальнейшего приема и так по кругу... По-моему посылка сигнал kill_fasync для этого как раз то, что надо...
> А можно-ли посылать kill_fasync в top half?
из любого контекста можно. но с чего вы вообще решили,
что что-то можно делать в interrupt контексте, и нельзя
это же делать вне его?
Если юзер процесс находится в слипе и получает kill_fasync от модуля, проснется ли он ? или сделает все что надо в обработчике сигнала и дальше спать ???
> Если юзер процесс находится в слипе и получает kill_fasync от модуля,
> проснется ли он ?
ох... процесс получит сигнал. все, к ядру это отношения
не имеет.
однозначного ответа на ваш вопрос нет, читайте маны.
sigaction, sigprocmask.