Попытка разблокировать страницу с ожидающей операцией DMA на ней

Это вопрос о Linux (связанный с драйверами). Предположим, у нас есть какое-то оборудование, способное выполнять большие DMA-доступы (многомегабайтное чтение или запись, вы можете подумать о карте CUDA или сетевой карте). Данные, которые должны быть переданы на/с устройства, были выделены в пользовательском пространстве и помещены в пользовательское пространство.

Итак, я думаю, что правильный путь - это mlock() диапазон памяти, к которому будет осуществляться доступ с помощью DMA. Затем пользовательский процесс вызовет мой драйвер, чтобы инициировать передачу DMA. После запуска передачи мой процесс пользовательского пространства все еще работает в других потоках.

Некоторое время спустя, когда я считаю, что данные передаются, я хочу сделать munlock() диапазон памяти из потока пользовательского пространства.

Это законно? Что, если я вызову munlock() до того, как фактическая передача DMA будет завершена?

Будет ли это munlock() успешным или неудачным? Или он будет блокироваться до тех пор, пока передача DMA не будет завершена?

PS: вопрос изначально от Zan Lynx, id13422 в SO.


person osgx    schedule 21.09.2013    source источник


Ответы (1)


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

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

person CL.    schedule 22.09.2013