日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

class_create

發(fā)布時間:2025/3/21 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 class_create 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

class_create函數(shù)跟蹤:

/* This is a #define to keep the compiler from merging different
?* instances of the __key variable */
#define class_create(owner, name) \
({ \
static struct lock_class_key __key;\
__class_create(owner, name, &__key);\
})


/**
?* class_create - create a struct class structure
?* @owner: pointer to the module that is to "own" this struct class
?* @name: pointer to a string for the name of this class.
?* @key: the lock_class_key for this class; used by mutex lock debugging
?*
?* This is used to create a struct class pointer that can then be used
?* in calls to device_create().
?*
?* Returns &struct class pointer on success, or ERR_PTR() on error.
?*
?* Note, the pointer created here is to be destroyed when finished by
?* making a call to class_destroy().
?*/
struct class *__class_create(struct module *owner, const char *name,
? ? struct lock_class_key *key)
{
struct class *cls;
int retval;


cls = kzalloc(sizeof(*cls), GFP_KERNEL);
if (!cls) {
retval = -ENOMEM;
goto error;
}


cls->name = name;
cls->owner = owner;
cls->class_release = class_create_release;


retval = __class_register(cls, key);
if (retval)
goto error;


return cls;


error:
kfree(cls);
return ERR_PTR(retval);
}
EXPORT_SYMBOL_GPL(__class_create);



static void class_create_release(struct class *cls)
{
pr_debug("%s called for %s\n", __func__, cls->name);
kfree(cls);
}




int __class_register(struct class *cls, struct lock_class_key *key)
{
struct subsys_private *cp;
int error;


pr_debug("device class '%s': registering\n", cls->name);


cp = kzalloc(sizeof(*cp), GFP_KERNEL);
if (!cp)
return -ENOMEM;
klist_init(&cp->klist_devices, klist_class_dev_get, klist_class_dev_put);
INIT_LIST_HEAD(&cp->interfaces);
kset_init(&cp->glue_dirs);
__mutex_init(&cp->mutex, "subsys mutex", key);
error = kobject_set_name(&cp->subsys.kobj, "%s", cls->name);
if (error) {
kfree(cp);
return error;
}


/* set the default /sys/dev directory for devices of this class */
if (!cls->dev_kobj)
cls->dev_kobj = sysfs_dev_char_kobj;


#if defined(CONFIG_BLOCK)
/* let the block class directory show up in the root of sysfs */
if (!sysfs_deprecated || cls != &block_class)
cp->subsys.kobj.kset = class_kset;
#else
cp->subsys.kobj.kset = class_kset;
#endif
cp->subsys.kobj.ktype = &class_ktype;
cp->class = cls;
cls->p = cp;


error = kset_register(&cp->subsys);
if (error) {
kfree(cp);
return error;
}
error = add_class_attrs(class_get(cls));
class_put(cls);
return error;
}
EXPORT_SYMBOL_GPL(__class_register);


先跟蹤3層,不能再多了。









總結(jié)

以上是生活随笔為你收集整理的class_create的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。