Ядро 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;
}
Другие вопросы по тегам