Драйвер устройства Linux атомарный GET, а затем SET через ioctl

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

Могу ли я заблокировать файловый дескриптор (flock()) перед вызовами и разблокировать после? Или я могу реализовать команду блокировки и разблокировки ioctl, которая устанавливает внутреннюю переменную блокировки в драйвере? Что произойдет, если процесс умрет, как очистить переменную?

Могу ли я использовать sysfs вместо ioctl для достижения того же эффекта?

1 ответ

Не легко, и это, скорее всего, неправильный подход.

Скорее, я бы пошел с подходом "условный ход". Программа userpace извлекает текущее значение, изменяет его, а затем присоединяет старое значение к IOCTL записи, который будет использоваться в качестве условия:

Успех:

read                        -> 5
write 10 if currently 5     -> okay

Неудача:

read                        -> 5
... someone else changes it ...
write 10 if currently 5     -> nope

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

Другие вопросы по тегам