[PATCH v2] nvme-multipath: add iopolicies sysfs attribute
John Garry
john.garry at linux.dev
Tue Sep 22 07:24:06 PDT 2026
On 9/21/26 15:43, loberman at redhat.com wrote:
> From: Laurence Oberman <loberman at redhat.com>
>
> The subsystem iopolicy attribute only shows the active policy, so
> there is no way to see which policies are available.
>
> Changing the output of iopolicy would break existing userspace,
> since nvme-cli compares the value against a bare policy name. Leave
> iopolicy unchanged and add a read-only iopolicies attribute that
> lists the available policies:
>
> # cat iopolicies
> numa round-robin queue-depth
>
> The current policy is still read from iopolicy.
>
> Signed-off-by: Laurence Oberman <loberman at redhat.com>
Apart from comment below:
Reviewed-by: John Garry <john.garry at linux.dev>
> Assisted-by: Claude:claude-sonnet-5
> ---
> v2:
> - Drop the [ ] notation and list plain policy names (Christoph)
>
> drivers/nvme/host/multipath.c | 15 +++++++++++++++
> drivers/nvme/host/nvme.h | 1 +
> drivers/nvme/host/sysfs.c | 1 +
> 3 files changed, 17 insertions(+)
>
> diff --git a/drivers/nvme/host/multipath.c b/drivers/nvme/host/multipath.c
> index 75dbb58286a3..ea7d0c59587b 100644
> --- a/drivers/nvme/host/multipath.c
> +++ b/drivers/nvme/host/multipath.c
> @@ -1085,6 +1085,21 @@ static ssize_t nvme_subsys_iopolicy_store(struct device *dev,
> SUBSYS_ATTR_RW(iopolicy, S_IRUGO | S_IWUSR,
> nvme_subsys_iopolicy_show, nvme_subsys_iopolicy_store);
>
> +static ssize_t iopolicies_show(struct device *dev,
> + struct device_attribute *attr, char *buf)
> +{
> + int i, len = 0;
> +
> + for (i = 0; i < ARRAY_SIZE(nvme_iopolicy_names); i++)
> + len += sysfs_emit_at(buf, len, "%s%s", i ? " " : "",> +
nvme_iopolicy_names[i]);
> +
> + len += sysfs_emit_at(buf, len, "\n");
> + return len;
> +}
> +
> +struct device_attribute subsys_attr_iopolicies = __ATTR_RO(iopolicies);
SUBSYS_ATTR_RO already exists for this, right?
> +
> static ssize_t ana_grpid_show(struct device *dev, struct device_attribute *attr,
> char *buf)
> {
> diff --git a/drivers/nvme/host/nvme.h b/drivers/nvme/host/nvme.h
> index 75e5d5a8a77c..b419c6fc6081 100644
> --- a/drivers/nvme/host/nvme.h
> +++ b/drivers/nvme/host/nvme.h
> @@ -1098,6 +1098,7 @@ extern struct device_attribute dev_attr_multipath_failover_count;
> extern struct device_attribute dev_attr_io_requeue_no_usable_path_count;
> extern struct device_attribute dev_attr_io_fail_no_available_path_count;
> extern struct device_attribute subsys_attr_iopolicy;
> +extern struct device_attribute subsys_attr_iopolicies;
>
> static inline bool nvme_disk_is_ns_head(struct gendisk *disk)
> {
> diff --git a/drivers/nvme/host/sysfs.c b/drivers/nvme/host/sysfs.c
> index abf8edaae371..4c4518b6b7d5 100644
> --- a/drivers/nvme/host/sysfs.c
> +++ b/drivers/nvme/host/sysfs.c
> @@ -1298,6 +1298,7 @@ static struct attribute *nvme_subsys_attrs[] = {
> &subsys_attr_subsystype.attr,
> #ifdef CONFIG_NVME_MULTIPATH
> &subsys_attr_iopolicy.attr,
> + &subsys_attr_iopolicies.attr,
> #endif
> NULL,
> };
More information about the Linux-nvme
mailing list