Unlocked_ioctl vs normal ioctl
В моей структуре файла driver_operations у меня есть:
struct file_operations Fops = {
read: device_read,
write: device_write,
unlocked_ioctl: device_ioctl,
...
};
т.е. не используется поле ioctl. Достаточно ли этого, чтобы избежать блокировки Big Kernel и войти в device_ioctl() без какой-либо синхронизации? Или мне нужно также изменить вызовы ioctl() в части пользовательского пространства кода?
Ответы
Ответ 1
Эмм, я решил это. Также требуется изменить подпись функции device_ioctl. Нет параметра inode, и функция должна возвращаться долго. Как и в следующем патче:
-static int st_ioctl(struct inode *inode, struct file *file,
- unsigned int cmd_in, unsigned long arg)
+static long st_ioctl(struct file *file, unsigned int cmd_in, unsigned long arg)
{
(from: http://linux.derkeiler.com/Mailing-Lists/Kernel/2008-01/msg06799.html)
Ответ 2
Прочтите эту статью LWN:
http://lwn.net/Articles/119652/
Также иногда между 2.6.33 и 2.6.35 rc (используйте git -diff, чтобы узнать, какая фиксация), ядро теперь WARN, когда определено только .ioctl.
Это движение к более явной и мелкозернистой блокировке. Также обратите внимание, что только смена сигнатуры функции и указателя будет скомпилирована, но представит возможность условий гонки (в то же время будут задействованы два приложения для пользователей, выполняющих вызовы ioctl).
Ответ 3
Andi Kleem опубликовал рецепт для быстрого и грязного преобразования кода с использованием ioctl
to unlocked_ioctl
в список рассылки ядра Linux:
[ПРЕДЛОЖЕНИЕ JANITOR] Переключите функции ioctl в → unlocked_ioctl
В рецепте объясняется, как настроить параметры функции и вставить блокировку и разблокировку вызовов.