Молча откажитесь от записи в область mmap - PullRequest
0 голосов
/ 05 апреля 2019

У меня есть драйвер устройства Linux, который позволяет процессу пользовательского пространства mmap() определенным областям пространства MMIO устройства для записи.Устройство может в какой-то момент принять решение об аннулировании доступа к региону и уведомит водителя, когда это произойдет.Драйвер (асинхронно) уведомляет процесс пользовательского пространства о прекращении использования этого региона.

Я бы хотел, чтобы драйвер немедленно убрал PTE для этого сопоставления, чтобы они могли быть возвращены в управление устройством, однако процесс пользовательского пространства можетвсе еще заканчиваю писать.Я хотел бы просто отказаться от этих записей.Пользователю не нужно знать, какие записи были сделаны на устройство, а какие были удалены.Что может сделать обработчик ошибок драйвера после замены PTE, которые могут безвредно отбрасывать записи в регион?

1 Ответ

0 голосов
/ 05 апреля 2019

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

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

В качестве альтернативы, вы можете позволить вашей задаче пространства пользователя принять SIGBUS, когда происходит это событие отзыва, ипросто укажите, что задача, использующая это устройство, должна ожидать, что это произойдет, и должна установить обработчик SIGBUS, который использует longjmp(), чтобы отменить попытку записи на устройство.Недостатком этого подхода - помимо дополнительной сложности, которую он сбрасывает в пользовательское пространство - является то, что он затрудняет использование вашего устройства из библиотеки, поскольку обработчики сигналов находятся в глобальном состоянии процесса.

...