2

メンバーがいるのがおかしいのですstruct cdevstruct kobject、その理由を知っている体はありますか?

4

3 に答える 3

0

次の 2 つの目的があります。

  1. kref内部で提供される参照カウント用。
static struct kobject *cdev_get(struct cdev *p)
{
    struct module *owner = p->owner;
    struct kobject *kobj;

    if (owner && !try_module_get(owner))
        return NULL;
    kobj = kobject_get_unless_zero(&p->kobj);
    if (!kobj)
        module_put(owner);
    return kobj;
}

void cdev_put(struct cdev *p)
{
    if (p) {
        struct module *owner = p->owner;
        kobject_put(&p->kobj);
        module_put(owner);
    }
}
  1. releasekrefの場合、それが十分ではない理由でもあります(krefリリースフックがありません)。
static void cdev_default_release(struct kobject *kobj)
{
    struct cdev *p = container_of(kobj, struct cdev, kobj);
    struct kobject *parent = kobj->parent;

    cdev_purge(p);
    kobject_put(parent);
}

static void cdev_dynamic_release(struct kobject *kobj)
{
    struct cdev *p = container_of(kobj, struct cdev, kobj);
    struct kobject *parent = kobj->parent;

    cdev_purge(p);
    kfree(p);
    kobject_put(parent);
}

static struct kobj_type ktype_cdev_default = {
    .release    = cdev_default_release,
};

static struct kobj_type ktype_cdev_dynamic = {
    .release    = cdev_dynamic_release,
};
于 2021-10-07T13:15:19.443 に答える