[PATCH 1/5] nvme: track subsystems

Sagi Grimberg sagi at grimberg.me
Thu Nov 9 03:33:16 PST 2017


> +static int nvme_init_subsystem(struct nvme_ctrl *ctrl, struct nvme_id_ctrl *id)
> +{
> +	struct nvme_subsystem *subsys, *found;
> +	int ret;
> +
> +	subsys = kzalloc(sizeof(*subsys), GFP_KERNEL);
> +	if (!subsys)
> +		return -ENOMEM;
> +	ret = ida_simple_get(&nvme_subsystems_ida, 0, 0, GFP_KERNEL);
> +	if (ret < 0) {
> +		kfree(subsys);
> +		return ret;
> +	}
> +	subsys->instance = ret;
> +	mutex_init(&subsys->lock);
> +	kref_init(&subsys->ref);
> +	INIT_LIST_HEAD(&subsys->ctrls);
> +	nvme_init_subnqn(subsys, ctrl, id);
> +	memcpy(subsys->serial, id->sn, sizeof(subsys->serial));
> +	memcpy(subsys->model, id->mn, sizeof(subsys->model));
> +	memcpy(subsys->firmware_rev, id->fr, sizeof(subsys->firmware_rev));
> +	subsys->vendor_id = le16_to_cpu(id->vid);
> +	subsys->cmic = id->cmic;
> +
> +	subsys->dev.class = nvme_subsys_class;
> +	subsys->dev.release = nvme_release_subsystem;
> +	dev_set_name(&subsys->dev, "nvme-subsys%d", subsys->instance);
> +	device_initialize(&subsys->dev);
> +

Any reason to do all this before we know if we found an existing 
subsystem? Also can the enumeration become with "holes" because you
acquire a subsystem ida temporarily and free it (and another subsystem
just came in)? Not a big issue though...



More information about the Linux-nvme mailing list