All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCHv3] nvme: add 'iopolicy' module parameter
@ 2021-12-20  9:30 Hannes Reinecke
  2021-12-20 10:36 ` Sagi Grimberg
  0 siblings, 1 reply; 2+ messages in thread
From: Hannes Reinecke @ 2021-12-20  9:30 UTC (permalink / raw)
  To: Christoph Hellwig
  Cc: Sagi Grimberg, Keith Busch, linux-nvme, Hannes Reinecke,
	Chaitanya Kulkarni

While the 'iopolicy' sysfs attribute can be set at runtime, most
storage arrays prefer to use the 'round-robin' iopolicy per default.
We can use udev rules to set this, but is getting rather unwieldy
for rebranded arrays as we would have to update the udev rules
anytime a new array shows up, leading to the same mess we currently
have in multipathd for configuring the RDAC arrays.

Hence this patch adds a module parameter 'iopolicy' to allow the
admin to switch the default, and to do away with the need for a
udev rule here.

Signed-off-by: Hannes Reinecke <hare@suse.de>
Reviewed-by: Sagi Grimberg <sagi@grimberg.me>
Reviewed-by: Chaitanya Kulkarni <kch@nvidia.com>
---
 drivers/nvme/host/core.c      |  4 +---
 drivers/nvme/host/multipath.c | 27 +++++++++++++++++++++++++++
 drivers/nvme/host/nvme.h      |  4 ++++
 3 files changed, 32 insertions(+), 3 deletions(-)

diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
index 44c375a1edbb..be404004c235 100644
--- a/drivers/nvme/host/core.c
+++ b/drivers/nvme/host/core.c
@@ -2747,9 +2747,7 @@ static int nvme_init_subsystem(struct nvme_ctrl *ctrl, struct nvme_id_ctrl *id)
 		return -EINVAL;
 	}
 	subsys->awupf = le16_to_cpu(id->awupf);
-#ifdef CONFIG_NVME_MULTIPATH
-	subsys->iopolicy = NVME_IOPOLICY_NUMA;
-#endif
+	nvme_mpath_default_iopolicy(subsys);
 
 	subsys->dev.class = nvme_subsys_class;
 	subsys->dev.release = nvme_release_subsystem;
diff --git a/drivers/nvme/host/multipath.c b/drivers/nvme/host/multipath.c
index 7f2071f2460c..de98c0e05777 100644
--- a/drivers/nvme/host/multipath.c
+++ b/drivers/nvme/host/multipath.c
@@ -13,6 +13,33 @@ module_param(multipath, bool, 0444);
 MODULE_PARM_DESC(multipath,
 	"turn on native support for multiple controllers per subsystem");
 
+static int iopolicy = NVME_IOPOLICY_NUMA;
+
+static int nvme_set_iopolicy(const char *val, const struct kernel_param *kp)
+{
+	char *endp;
+	int p;
+
+	if (!val)
+		return -EINVAL;
+	p = simple_strtoul(val, &endp, 0);
+	if (p != NVME_IOPOLICY_NUMA &&
+	    p != NVME_IOPOLICY_RR)
+		return -EINVAL;
+	iopolicy = p;
+	return 0;
+}
+
+module_param_call(iopolicy, nvme_set_iopolicy, param_get_int,
+		  &iopolicy, 0644);
+MODULE_PARM_DESC(iopolicy,
+	"Default multipath I/O policy; 0 - NUMA (default), 1 - Round-robin");
+
+void nvme_mpath_default_iopolicy(struct nvme_subsystem *subsys)
+{
+	subsys->iopolicy = iopolicy;
+}
+
 void nvme_mpath_unfreeze(struct nvme_subsystem *subsys)
 {
 	struct nvme_ns_head *h;
diff --git a/drivers/nvme/host/nvme.h b/drivers/nvme/host/nvme.h
index a54096ba0552..fe224016418e 100644
--- a/drivers/nvme/host/nvme.h
+++ b/drivers/nvme/host/nvme.h
@@ -767,6 +767,7 @@ static inline bool nvme_ctrl_use_ana(struct nvme_ctrl *ctrl)
 void nvme_mpath_unfreeze(struct nvme_subsystem *subsys);
 void nvme_mpath_wait_freeze(struct nvme_subsystem *subsys);
 void nvme_mpath_start_freeze(struct nvme_subsystem *subsys);
+void nvme_mpath_default_iopolicy(struct nvme_subsystem *subsys);
 bool nvme_mpath_set_disk_name(struct nvme_ns *ns, char *disk_name, int *flags);
 void nvme_failover_req(struct request *req);
 void nvme_kick_requeue_lists(struct nvme_ctrl *ctrl);
@@ -864,6 +865,9 @@ static inline void nvme_mpath_wait_freeze(struct nvme_subsystem *subsys)
 static inline void nvme_mpath_start_freeze(struct nvme_subsystem *subsys)
 {
 }
+static inline void nvme_mpath_default_iopolicy(struct nvme_subsystem *subsys)
+{
+}
 #endif /* CONFIG_NVME_MULTIPATH */
 
 int nvme_revalidate_zones(struct nvme_ns *ns);
-- 
2.29.2



^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [PATCHv3] nvme: add 'iopolicy' module parameter
  2021-12-20  9:30 [PATCHv3] nvme: add 'iopolicy' module parameter Hannes Reinecke
@ 2021-12-20 10:36 ` Sagi Grimberg
  0 siblings, 0 replies; 2+ messages in thread
From: Sagi Grimberg @ 2021-12-20 10:36 UTC (permalink / raw)
  To: Hannes Reinecke, Christoph Hellwig
  Cc: Keith Busch, linux-nvme, Chaitanya Kulkarni



On 12/20/21 11:30 AM, Hannes Reinecke wrote:
> While the 'iopolicy' sysfs attribute can be set at runtime, most
> storage arrays prefer to use the 'round-robin' iopolicy per default.
> We can use udev rules to set this, but is getting rather unwieldy
> for rebranded arrays as we would have to update the udev rules
> anytime a new array shows up, leading to the same mess we currently
> have in multipathd for configuring the RDAC arrays.
> 
> Hence this patch adds a module parameter 'iopolicy' to allow the
> admin to switch the default, and to do away with the need for a
> udev rule here.
> 
> Signed-off-by: Hannes Reinecke <hare@suse.de>
> Reviewed-by: Sagi Grimberg <sagi@grimberg.me>
> Reviewed-by: Chaitanya Kulkarni <kch@nvidia.com>
> ---
>   drivers/nvme/host/core.c      |  4 +---
>   drivers/nvme/host/multipath.c | 27 +++++++++++++++++++++++++++
>   drivers/nvme/host/nvme.h      |  4 ++++
>   3 files changed, 32 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
> index 44c375a1edbb..be404004c235 100644
> --- a/drivers/nvme/host/core.c
> +++ b/drivers/nvme/host/core.c
> @@ -2747,9 +2747,7 @@ static int nvme_init_subsystem(struct nvme_ctrl *ctrl, struct nvme_id_ctrl *id)
>   		return -EINVAL;
>   	}
>   	subsys->awupf = le16_to_cpu(id->awupf);
> -#ifdef CONFIG_NVME_MULTIPATH
> -	subsys->iopolicy = NVME_IOPOLICY_NUMA;
> -#endif
> +	nvme_mpath_default_iopolicy(subsys);
>   
>   	subsys->dev.class = nvme_subsys_class;
>   	subsys->dev.release = nvme_release_subsystem;
> diff --git a/drivers/nvme/host/multipath.c b/drivers/nvme/host/multipath.c
> index 7f2071f2460c..de98c0e05777 100644
> --- a/drivers/nvme/host/multipath.c
> +++ b/drivers/nvme/host/multipath.c
> @@ -13,6 +13,33 @@ module_param(multipath, bool, 0444);
>   MODULE_PARM_DESC(multipath,
>   	"turn on native support for multiple controllers per subsystem");
>   
> +static int iopolicy = NVME_IOPOLICY_NUMA;
> +
> +static int nvme_set_iopolicy(const char *val, const struct kernel_param *kp)
> +{
> +	char *endp;
> +	int p;
> +
> +	if (!val)
> +		return -EINVAL;
> +	p = simple_strtoul(val, &endp, 0);
> +	if (p != NVME_IOPOLICY_NUMA &&
> +	    p != NVME_IOPOLICY_RR)
> +		return -EINVAL;
> +	iopolicy = p;
> +	return 0;
> +}
> +
> +module_param_call(iopolicy, nvme_set_iopolicy, param_get_int,
> +		  &iopolicy, 0644);
> +MODULE_PARM_DESC(iopolicy,
> +	"Default multipath I/O policy; 0 - NUMA (default), 1 - Round-robin");

Maybe make this a string? user will set numa|round-robin ? That is the
sysfs interface iirc...


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2021-12-20 10:36 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-12-20  9:30 [PATCHv3] nvme: add 'iopolicy' module parameter Hannes Reinecke
2021-12-20 10:36 ` Sagi Grimberg

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.