Ядро Linux: как использовать request_module () и try_module_get ()
Я изо всех сил пытаюсь понять, как правильно использовать
try_module_get()
Я нашел этот интересный пост: Как поставить отметку в коде, чтобы убедиться, что внутренняя зависимость модуля ядра - ядро Linux?
Но я упускаю один момент: я могу получить request_module
работает, но я не понимаю, как использовать try_module_get
Я объясняю:
Если я использую
ret = request_module("ipt_conntrack")
модуль xt_conntrack вставлен правильно, но помечен как не используемый, потому что в соответствии с приведенным выше сообщением я не использовал try_module_get
.
Но как я могу назвать try_module_get
? Функция требуетstruct module
параметр, который я не знаю, как заполнить для модуля xt_conntrack. Я нашел несколько примеров, но все они связаны с параметром "THIS_MODULE", который в данном случае не применяется. Можете ли вы указать мне правильное направление для этого?
Спасибо за вашу помощь
1 ответ
Возможно, что-то подобное сработает. Я не тестировал.
/**
* try_find_module_get() - Try and get reference to named module
* @name: Name of module
*
* Attempt to find the named module. If not found, attempt to request the module by
* name and try to find it again. If the module is found (possibly after requesting the
* module), try and get a reference to it.
*
* Return:
* * pointer to module if found and got a reference.
* * NULL if module not found or failed to get a reference.
*/
static struct module *try_find_module_get(const char *name)
{
struct module *mod;
mutex_lock(&module_mutex);
/* Try and find the module. */
mod = find_module(name);
if (!mod) {
mutex_unlock(&module_mutex);
/* Not found. Try and request it. */
if (request_module(name))
return NULL; /* Failed to request module. */
mutex_lock(&module_mutex);
/* Module requested. Try and find it again. */
mod = find_module(name);
}
/* Try and get a reference if module found. */
if (mod && !try_module_get(mod))
mod = NULL; /* Failed to get a reference. */
mutex_unlock(&module_mutex);
return mod;
}