int ref_module(struct module *a, struct module *b)实现模块a使用模块b,同时增加模块b的引用计数
其使用的例子如下:
/* Resolve a symbol for this module. I.e. if we find one, record usage. */
static const struct kernel_symbol *resolve_symbol(struct module *mod,
const struct load_info *info,
const char *name,
char ownername[])
{
struct module *owner;
const struct kernel_symbol *sym;
const s32 *crc;
int err;
err = ref_module(mod, owner);
if (err) {
sym = ERR_PTR(err);
goto getname;
}
}
其源码如下:
/* Module a uses b: caller needs module_mutex() */
int ref_module(struct module *a, struct module *b)
{
int err;
//如果模块b不存在或者模块a已经在使用模块b的话,则退出
if (b == NULL || already_uses(a, b))
return 0;
//增加模块b的引用计数
/* If module isn't available, we fail. */
err = strong_try_module_get(b);
if (err)
return err;
//分别更新模块a的target_list和模块b的source_list
err = add_module_usage(a, b);
if (err) {
module_put(b);
return err;
}
return 0;
}
/*
* Module a uses b
* - we add 'a' as a "source", 'b' as a "target" of module use
* - the module_use is added to the list of 'b' sources (so
* 'b' can walk the list to see who sourced them), and of 'a'
* targets (so 'a' can see what modules it targets).
*/
static int add_module_usage(struct module *a, struct module *b)
{
struct module_use *use;
pr_debug("Allocating new usage for %s.\n", a->name);
//module_use 表示两个模块之前的使用关系
use = kmalloc(sizeof(*use), GFP_ATOMIC);
if (!use) {
pr_warn("%s: out of memory loading\n", a->name);
return -ENOMEM;
}
//这里的source 表示模块b 被使用的模块,也就是模块a使用模块b
use->source = a;
use->target = b;
//更新模块自身的数据结构,这样就可以通过already_uses 来判断a是否使用b。从这里也可以看出already_uses(a, b)成立,already_uses(b,a)不一定成立
list_add(&use->source_list, &b->source_list);
list_add(&use->target_list, &a->target_list);
return 0;
}
模块API之ref_module
最新推荐文章于 2024-07-28 20:52:31 发布