[PATCH 2/2] nvme: Expose cntrltype and dctype through sysfs.
Sagi Grimberg
sagi at grimberg.me
Thu Feb 3 05:33:01 PST 2022
>>>>> From: Martin Belanger <martin.belanger at dell.com>
>>>>>
>>>>> TP8010 introduces the Discovery Controller Type (dctype) attribute.
>>>>> The dctype is returned in the response to the Identify command. This
>>>>> patch exposes the dctype through the sysfs. Since the dctype depends
>>>>> on the Controller Type (cntrltype), another attribute of the
>>>>> Identify response, the patch also exposes the cntrltype as well.
>>>>>
>>>>> Signed-off-by: Martin Belanger <martin.belanger at dell.com>
>>>>> ---
>>>>> drivers/nvme/host/core.c | 35
>>>> +++++++++++++++++++++++++++++++++++
>>>>> drivers/nvme/host/nvme.h | 3 +++
>>>>> include/linux/nvme.h | 10 +++++++++-
>>>>> 3 files changed, 47 insertions(+), 1 deletion(-)
>>>>>
>>>>> diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
>>>>> index
>>>>> 872c389dc6d3..c65d44fb65c4 100644
>>>>> --- a/drivers/nvme/host/core.c
>>>>> +++ b/drivers/nvme/host/core.c
>>>>> @@ -2992,6 +2992,9 @@ static int nvme_init_identify(struct nvme_ctrl
>>>> *ctrl)
>>>>> ctrl->max_namespaces = le32_to_cpu(id->mnan);
>>>>> ctrl->ctratt = le32_to_cpu(id->ctratt);
>>>>>
>>>>> + ctrl->cntrltype = id->cntrltype;
>>>>> + ctrl->dctype = id->dctype;
>>>>> +
>>>>> if (id->rtd3e) {
>>>>> /* us -> s */
>>>>> u32 transition_time = le32_to_cpu(id->rtd3e) /
>>>> USEC_PER_SEC; @@
>>>>> -3525,6 +3528,34 @@ static ssize_t
>>>> nvme_ctrl_fast_io_fail_tmo_store(struct device *dev,
>>>>> static DEVICE_ATTR(fast_io_fail_tmo, S_IRUGO | S_IWUSR,
>>>>> nvme_ctrl_fast_io_fail_tmo_show,
>>>> nvme_ctrl_fast_io_fail_tmo_store);
>>>>>
>>>>> +static ssize_t nvme_ctrl_cntrltype_show(struct device *dev,
>>>>> + struct device_attribute *attr, char *buf) {
>>>>> + struct nvme_ctrl *ctrl = dev_get_drvdata(dev);
>>>>> +
>>>>> + switch (ctrl->cntrltype) {
>>>>> + case NVME_CTRL_IO: return sysfs_emit(buf, "io\n");
>>>>> + case NVME_CTRL_DISC: return sysfs_emit(buf, "disc\n");
>>>>
>>>> 'discovery', please. 'disc' is misleading here.
>>>>
>>>>> + case NVME_CTRL_ADMIN: return sysfs_emit(buf, "admin\n");
>>>>> + default: return sysfs_emit(buf, "reserved\n");
>>>>> + }
>>>>> +}
>>>>> +static DEVICE_ATTR(cntrltype, S_IRUGO, nvme_ctrl_cntrltype_show,
>>>>> +NULL);
>>>>> +
>>>>> +static ssize_t nvme_ctrl_dctype_show(struct device *dev,
>>>>> + struct device_attribute *attr, char *buf) {
>>>>> + struct nvme_ctrl *ctrl = dev_get_drvdata(dev);
>>>>> +
>>>>> + switch (ctrl->dctype) {
>>>>> + case NVME_DCTYPE_NOT_REPORTED: return sysfs_emit(buf,
>>>> "nr\n");
>>>>
>>>> Please use 'none' here; 'nr' is ambiguous ('Number'?)
>>>
>>> Thanks for the review. I will apply the changes.
>>>
>>> Question: Since this was part of a set of patches, do I need to
>>> resubmit the whole set or can I just resubmit this one patch?
>>>
>> Whole series, please. And gather up the reviews when resubmitting.
>>
>>> Also, Sagi mentioned that the dctype should only be exposed for
>>> Discovery Controllers, which makes sense. However, I found that when
>>> nvme_dev_attrs_are_visible() is invoked the ctrl object is not fully
>>> configured yet (i.e. the controller is not yet identified).
>>> Is there any other way to determine the controller type prior to
>>> receiving the response to the Identify command?
>>>
>> Nope, unfortunately.
>>
>> But maybe we can lump both attributes together in to a single ctrltype; then
>> we would have 'io', 'admin', 'discovery', 'discovery-cdc', and 'discovery-ddc'.
>>
>> Hmm?
>
> I like that. I shall combine them into a single attribute.
I don't think this is a good approach.
There is already an interface to update sysfs groups, so in theory
this should do the trick:
--
diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
index c11cd3a814fd..d86828cf7720 100644
--- a/drivers/nvme/host/core.c
+++ b/drivers/nvme/host/core.c
@@ -3115,6 +3115,11 @@ int nvme_init_ctrl_finish(struct nvme_ctrl *ctrl)
return ret;
}
+ ret = sysfs_update_groups(&ctrl->device->kobj,
ctrl->device->groups);
+ if (ret)
+ return ret;
+
+
ctrl->identified = true;
return 0;
--
But probably we want add a nicer interface like
--
diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
index c11cd3a814fd..8fb94cb15fb0 100644
--- a/drivers/nvme/host/core.c
+++ b/drivers/nvme/host/core.c
@@ -3115,6 +3115,11 @@ int nvme_init_ctrl_finish(struct nvme_ctrl *ctrl)
return ret;
}
+ ret = device_update_groups(&ctrl->device);
+ if (ret)
+ return ret;
+
+
ctrl->identified = true;
return 0;
--
Where device_update_groups would be something like:
--
int device_update_groups(struct device *dev)
{
struct class *class = dev->class;
const struct device_type *type = dev->type;
int error;
if (class) {
error = device_update_groups(dev, class->dev_groups);
if (error)
return error;
}
if (type) {
error = device_update_groups(dev, type->groups);
if (error)
goto err_remove_class_groups;
}
error = device_update_groups(dev, dev->groups);
if (error)
goto err_remove_type_groups;
}
EXPORT_SYMBOL_GPL(device_update_groups);
--
More information about the Linux-nvme
mailing list