struct device *get_device(struct device *dev) 这个函数用于增加形参device 的引用计数
一般和put_device 配合使用
其源码分析如下:
struct device *get_device(struct device *dev)
{
return dev ? kobj_to_dev(kobject_get(&dev->kobj)) : NULL;
}
可见如果dev 为null的话,则get_device 也返回null,如果就通过kobject_get来增加引用计数
struct kobject *kobject_get(struct kobject *kobj)
{
if (kobj) {
#如果kobj 为nul,则直接返回。否则通过kref_get来让这个device的引用计数加1
if (!kobj->state_initialized)
WARN(1, KERN_WARNING "kobject: '%s' (%p): is not "
"initialized, yet kobject_get() is being "
"called.\n", kobject_name(kobj), kobj);
kref_get(&kobj->kref);
}
return kobj;
}
这里通过kref_get 来增加引用计数
static inline void kref_get(struct kref *kref)
{
refcount_inc(&kref->refcount);
}
static inline void refcount_inc(refcount_t *r)
{
atomic_inc(&r->refs);
}
最终通过atomic_inc 来增加引用计数refs
与之对应的put_device如下,可见如果设备为null,则啥都不做,如果dev 不为null,则通过kobject_put
/**
* put_device - decrement reference count.
* @dev: device in question.
*/
void put_device(struct device *dev)
{
/* might_sleep(); */
if (dev)
kobject_put(&dev->kobj);
}
内核设备驱动API之get_device和put_device
最新推荐文章于 2024-07-17 10:37:42 发布