#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 Спасибо, чувак. Это именно то, что мне было нужно