Как использовать sysfs внутри модуля ядра? - PullRequest
1 голос
/ 10 декабря 2010

В пользовательском пространстве я могу просто echo noop > /sys/block/sda/queue/scheduler.

Как сделать то же самое внутри модуля ядра?

Я ожидаю что-то вроде этого (псевдокод):

struct dentry* e = sysfs_get_root();
vfs_path_lookup(e, ????, "block/sda/queue/scheduler", ???);
????;
struct something* q = ????;
????->store(q, "noop", 1);
/* some cleanup */

Как правильно его реализовать?

Мой модуль ядра просто регистрирует обработчик SysRQ и должен настроить планировщик io, когда этот SysRQ запущен (программы пользовательского пространства могут зависать в это время из-за плохого планировщика io)

Ответы [ 3 ]

3 голосов
/ 10 декабря 2010

Нет способа реализовать это должным образом. Если вы хотите сделать это в любом случае, а также понять причину, по которой это плохая идея (тм), см. статью

2 голосов
/ 10 декабря 2010

Если вы хотите что-то настроить для вашего модуля ядра, вы можете сделать это в скрипте-обертке, который вставляет ваш модуль ядра с помощью команды insmod.

И посмотрите на this статья, где говорится "Почему плохо писать файлы из ядра"

0 голосов
/ 11 декабря 2010

Неправильно неправильно, неправильно. sysfs - это интерфейс для пользовательского пространства , вы не должны использовать его внутри ядра.

Если ваш модуль хочет изменить планировщик блоков, то вам нужно решить, как это сделать внутри ядра, т.е. когда пользователь пишет в /sys/block/sda/queue/scheduler какой-то код ядра, вы должны вызывать этот код напрямую.

Сказав, что это кажется плохой идеей, как вы будете обращаться с несколькими блочными устройствами, например?

...