LINUX.ORG.RU

start_kthread


0

0

Пишу драйвер для "подколеночной" ISA железяки под ядро 2.4.x. Проблема в передачи данных - требуется непрерывный исходящий поток, поэтому постоянно идет опрос железки на ее готовность и выдача данных (прерывания на передачу неработают - такая кривая железяка). В таком непрерывном режиме работает как надо, но проблема в том, что интерфейс пользователя (GUI) при этом "не отвечает" - перестают работать даже потоки в userspace.
Создал kthread (в обработчике device_write) в надежде, что он будет работать отдельно и не позволит "подвисать" в системном вызове write (а в нем я ужу подожду окончание работы потока через sleep, тем самым отдав время на перерисовку интерфейса), но оказалось, что если я вручную не буду отдавать кванты времени(cond_resched), то и этот поток (созданный через start_kthread) также все блокирует.
Получается всеравно надо самому отдавать кванты времени в созданном потоке ядра?
Решением проблемы вижу в отдаче управления перепланировщику не более чем на какоето время (не более 125 микросекунд).
Где может быть ошибка, куда посоветуете смотреть?

★★★★★

не вижу проблемы
создаем процесс ядра, который будет в цикле производить опрос устройства и класть полученные данные в буфер
read() в контексте пользовательского приложения будет читать данные из буфера
если данных нет - блокируемся (регистрируем процесс в очереди ожидания)
при получении данных делаем wake_up() процесса

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

С чтением нет проблем - оно производится по прерывынию
Проблема с записью в устройство: я даю данные на запись из userspace, а в драйвере порождаю поток ядра, который должен постоянно писать в устройство. Если я прервусь с отдачей - в канал пойдет "обрыв" данных. А прерыватся мне нужно - чтобы перерисовать и опросить интерфейс.
Для начала такой вопрос - почему поток ядра блокирует остальные потоки? Такое поведение нормально?
Причем такое поведение наблюдается если я не отдаю планировщику кванты времени через cond_resched.
А если отдаю - отдается слишком надолго.

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

> Для начала такой вопрос - почему поток ядра блокирует остальные потоки?

Видимо, потому что в 2.4 нет preemption'a

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

> Такое поведение нормально?

не нормально если процесс ядра не является процессом реального времени

> А если отдаю - отдается слишком надолго.

может, подойдет
schedule_timeout()?

> Если я прервусь с отдачей - в канал пойдет "обрыв" данных.

возможно, перед записью нужно вызвать preempt_disable() для запрета вытеснения
или устройство слишком медленное?

rei3er
()
Ответ на: комментарий от eXire

> Видимо, потому что в 2.4 нет preemption'a

а если более подробно, то в 2.4.x нет проверки TIF_NEED_RESCHED при возврате на 0-е кольцо из обработчиков асинхронных событий (исключения, прерывания)

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

делал так:
lock_kernel();
current->policy = SCHED_RR;
unlock_kernel();
поведение осталось таким же - "блокируется" все. клавиатура перестает реагировать, обновление top приостанавливается. после окончания потока передачи - можно дальше работать с системой.


schedule_timeout() не подойдет т.к. у нее минимальная задержка 1/HZ = 1/100, а мне нужны задержки 1/150 ... 1/8000

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

получается, что устройство настолько медленное, что работа с ним блокирует все остальные процессы на время, достаточное для того, чтобы заметить тормоза системы
получается, лучшего решения нет (кроме как 2+ ядерную машину использовать)

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

несколько непонимаю понятие "медленное"
оно скроее неправильное - требует непрерывного потока данных к передаче (данные вывожу в порт командой outb)
в железке нет бефера на передачу, потому и требуется постоянные опрос ее на готовность и передача очередного байта данных
основной момент, который я уяснил для ядра 2.4.х, это то что если в потоке ядра не отдавать кванты времени, то этот поток блокирует всю систему (а не только мое приложение)

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