Может ли драйвер устройства Linux ожидать завершения DMA в функции device_remove ()? - PullRequest
3 голосов
/ 12 мая 2010

Я написал драйвер устройства Linux для устройства PCI. Это устройство выполняет операции DMA. Проблема возникает при сбое программы при выполнении операции DMA.

Действительно, при сбое система device_remove() вызывает функцию (как если бы close() вызывалось). Эта функция выполняет очистку областей памяти, используемых устройством PCI, правильно освобождает выделенную память. Я имею в виду, что он работает правильно в нормальных условиях.

Но если DMA работает, когда он фактически завершится, он не сможет выполнить очистку DMA, поскольку у него больше нет доступа к данным устройства, которые были освобождены. Простым решением будет ожидание в функции close (). (Это мое понимание, но, может быть, последняя часть функции DMA никогда не выполняется?)

Является ли хорошей идеей вопить о том, что DMA фактически завершается в функции device_remove() (он же close()) драйвера устройства? Существуют ли другие способы решения этой проблемы?

1 Ответ

2 голосов
/ 12 мая 2010

Да, ждать должно работать, но:

Если вы не пытаетесь протестировать неожиданное поведение при удалении вашего PCI-устройства, я думаю, что вызов remove () должен произойти сбой, когда у вас есть DMA, идущий на / с устройства. Кроме того, я не думаю, что close () можно обрабатывать так же, как и remove (). Последний собирается полностью удалить все связанные с устройством структуры данных из памяти (например, см. Один из драйверов сетевых устройств). Другими словами, я пытаюсь сказать следующее: wait () при close (), но fail () при remove ()

Также, в зависимости от вашей ситуации, вы также можете взглянуть на подсчет ссылок для освобождения ресурсов, связанных с устройством.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...