内核设备驱动API之get_device和put_device

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);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值