LINUX.ORG.RU

Kernel Module, ioctl, синхронизация


0

1

Доброго времени суток!

Думаю над следующим вопросом: Есть модуль ядра, в котором определена некоторая структура данных, с которой надо обеспечить синхронную работу.

Возможна ли ситуация, когда два (или более) User-Space процесса «одновременно» вызовут ioctl (запись-запись или чтение-запись) и произойдет нарушение работы со структурой данных в модуле?

Если я правильно понимаю, в этом случае необходимо в соответствующих методах использовать мьютексы? Операции модификации достаточно малы, будет ли в этом случае spinlock эффективней?

Спасибо!

Внутри модуля обычно есть все необходимые блокировки.

pathfinder ★★★★
()

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

Если передаются независимые данные, то это безопасно. В модуле, обслуживающем вызов должны быть все необходимые блокировки на свои внутренние структуры.

pathfinder ★★★★
()
Ответ на: комментарий от pathfinder

Спасибо за ответ, именно что используется одна общая структура данных, хранящаяся в модуле, поэтому я и опасаюсь коллизий. А как в таких случаях лучше выполнять блокировку (mutex, futex, spinlock или что-то еще)?

kirichenkoga
() автор топика
Ответ на: комментарий от Jetty

#include <linux/mutex.h> - такой вариант не проходит почему-то.

Сам по себе файл mutex.h находится в пакете linux-headers-.....deb, и путь его установки зависит от версии пакета (что-то вроде /usr/src/linux-headers-...common/include/linux). В /usr/include/linux только futex.h. Как в этом случае правильно разрулить пути, чтобы собиралось с различными версиями ядра?

kirichenkoga
() автор топика

По сабжу: если частота чтения превышает частоту записи, то SpinLock, иначе думать дальше=)

Divius ★★
()
Ответ на: комментарий от kirichenkoga

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

ЗЫ: AFAIK, ioctl и так вызывается под блокировкой. и это проблема. для её решения добавили новый обработчик unlocked_ioctl, который не требует блокировок самим ядром, а решает сам, блокировать ему что-нибудь или нет. но это устаревшая информация, может уже там всё втихаря поменяли :)

arsi ★★★★★
()
Ответ на: комментарий от kirichenkoga

Я рекомендую тебе определиться с путем разработки модуля для ядра. Ты либо разрабатываешь его в стиле debian-way, либо generic-way.

В первом случае тебе и правда надо будет пакет linux-headers-<VERSION> Во втором случае тебе надо просто каталог с исходниками ядра.

В обеих случаях собирать модуль надо «хитро» :) Вот пример моего Makefile:

$ cat Makefile
obj-m := fakedev.o

all:
        make -C /usr/src/linux-headers-`uname -r` M=`pwd` modules

.PHONY: clean

clean: 
        make -C /usr/src/linux-headers-`uname -r` M=`pwd` clean
Все это прекрасно работает на именно Дебиане :)

Jetty ★★★★★
()
Ответ на: комментарий от Divius

> разработчики так старательно выпиливали BKL

за такое выпиливание маленьким копчик ремешком массируют.

ananas ★★★★★
()
Ответ на: комментарий от ananas

Это, мягко говоря, отдельный вопрос. Ссылку на багрепорт в студию.

Divius ★★
()

wtfigo? можешь спать - мьютекс, не можешь - спинлок

Idle
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.