Прекратить выгрузку модуля ядра Linux

#c #linux #linux-kernel #linux-device-driver #kernel-module

#c #linux #linux-ядро #linux-драйвер устройства #kernel-module

Вопрос:

У меня есть один модуль ядра Linux, который основан на драйвере платформы.
Я реализовал там методы probe() и remove() .

 struct platform_driver {
    int (*probe)(struct platform_device *);
    int (*remove)(struct platform_device *);
}
  

Теперь, когда пользователь выполняет rmmod <myModule> , тогда
remove() вызывается метод. здесь я выполняю некоторую проверку условий и узнал, что пользователь не должен выполнять rmmod здесь. Здесь я не хочу выполнять какую-либо очистку и приводить к сбою этого rmmod.

Я попытался вернуть -1 или -EBUSY в remove() , но все равно после rmmod <myModule> его выгрузки он не отображается в lsmod выводе.

Есть ли какой-либо способ остановить выгрузку моего модуля в remove() методе?

Ответ №1:

Нельзя отменить (или остановить) выгрузку модуля, уже инициированную rmmod (или другими средствами). Но можно предотвратить выгрузку модуля, вызвав try_module_get его:

 // Before your module enters into the state, when its unloading is not desirable.

// Prevent unloading of the module
if(!try_module_get(THIS_MODULE)) {
  <failed to prevent module unloading>
}

<....> // This code will be protected from the module's unloading

// Allow the module to be unloaded again
module_put(THIS_MODULE);
  

Пока действует (успешный) вызов try_module_get , rmmod немедленно отклоняет выгрузку модуля без выполнения какого-либо кода модуля.

Я не уверен, будет ли try_module_get успешным вызов из module_init функции, и вызов ее из module_exit функции определенно завершится неудачей. Но во всех других местах этот вызов должен быть успешным.

Что касается module_put вызова, его не нужно выполнять из той же функции, которая вызывает try_module_get . Вы могли бы вообще не вызывать module_put , но этого следует избегать, если это возможно.

Комментарии:

1. Полу грязный взлом. Правильный способ — определить его как встроенный (используя bool в Kconfig ) и предоставить .suppress_bind_attribute (или как это называется?).

2. @0andriy: Возможно, ваш подход предпочтительнее для предотвращения выгрузки модуля навсегда , но вызов try_module_get определенно является правильным способом для предотвращения выгрузки модуля в течение некоторого времени .

3. @Tsyvarev Спасибо, чувак. Это именно то, что мне было нужно