LINUX.ORG.RU

Scatter Gather DMA передача данных в буфер драйвера (+)


0

1

Доброго времени суток.

Столкнулся со следующей проблемой:

Есть драйвер, использующий функцию get_user_pages для DMA передачи данных (scatter-gather) в пользовательский буфер. Мне нужно, чтобы он передавал не в пользовательский, а в свой (драйвера) буфер. Как это проще сделать?

Собственно, потребность возникла из за того, что при приеме высокоскоростных данных с PCI непосредственно в приложение, периодически пропускаются данные (время подготовки новой порции данных ~500 мкс). Это не компьютер, АРМ.

Заранее спасибо.


Ответ на: комментарий от frey

Спасибо за ссылку, но уже читал: там как раз этот момент не упоминается (хотя еще раз сейчас перечитаю, вдруг, пропустил) :(

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

О, похоже, то, что надо, спасибо, ушел проверять.

lleri
() автор топика

> а в свой (драйвера) буфер

Свой буфер - ты его как выделяешь? Вот так:

dma_pool_create

dma_pool_alloc

дальше map/unmap с нужным направлением?

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

Снова прошу помощи, проблема несколько видоизменилась: драйвер ожидает сигнала используя wait_event_interruptible_timeout(). Соответственно, по сигналу он должен проснуться и работать дальше. Но иногда возникает ситуация, сигнал дан, но драйвер «просыпается» только через 10+ милисекунд (и вот тут я данные теряю, соответственно). Та же проблема при попытке использования семафоров (up_interruptible). Что бы это могло быть, где копать? Я всю голову сломал :( Причем как то периодично такое происходит.

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

Какая частота таймера?

Подобная проблема была, когда один из быдлодрайверов от китайцев выключал прерывания и долго работал с устройством (драйвер был для e-ink).

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

Какого именно таймера (HZ - 100, если что)? Сам ищу пересечения с чем либо, но с PCI работает только один драйвер (вот этот самый).

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

Естественно частота системного таймера. У тебя сейчас между его «тиками» как раз проходит 10мс. Ставь 1000 и проверяй

«Пересечение» может быть с каким угодно драйверов, не обязательно PCI.

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

Поставил 1000, включил preemptive - картина не поменялась, зато отвалилось SATA :D. Пока ищу, спасибо за помощь.

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

Починил проблему? Поделись с общественностью, удовлетвори любопытство плиз

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