Драйвер устройства 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
Таким образом, ядру не нужно сохранять какое-либо состояние, которое необходимо очистить, если программа пользовательского пространства не следует протоколу.