[PATCH 5/9] nvme: track subsystems
Sagi Grimberg
sagi at grimberg.me
Wed Oct 18 04:16:24 PDT 2017
>>> static void nvme_free_ctrl(struct kref *kref)
>>> {
>>> struct nvme_ctrl *ctrl = container_of(kref, struct nvme_ctrl, kref);
>>> + struct nvme_subsystem *subsys = ctrl->subsys;
>>> put_device(ctrl->device);
>>> nvme_release_instance(ctrl);
>>> ida_destroy(&ctrl->ns_ida);
>>> + if (subsys) {
>>> + mutex_lock(&subsys->lock);
>>> + list_del(&ctrl->subsys_entry);
>>> + mutex_unlock(&subsys->lock);
>>> + }
>>> +
>>
>> When can this happen? can a controller not have a subsys?
>
> When we fail early enough to not have set up the subsystem yet.
I think that the fact the nvme_free_ctrl cleans up after everything
that is setup in a random place is not a very good approach (just sent
a patchset that moves the uninit_ctrl cleanup back to its natural
place).
However here, given that each individual driver calls nvme_init_identify
on its own as part of its private admin configuration I don't see how
we can avoid it for now...
Hopefully we can sort this out when we centralize some more
setup/teardown logic and this subsys detach would move to where
we teardown the admin_queue (as it was added when we configured it)...
More information about the Linux-nvme
mailing list