[PATCHv3] nvme: add 'iopolicy' module parameter
Sagi Grimberg
sagi at grimberg.me
Mon Dec 20 02:36:15 PST 2021
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 at suse.de>
> Reviewed-by: Sagi Grimberg <sagi at grimberg.me>
> Reviewed-by: Chaitanya Kulkarni <kch at 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...
More information about the Linux-nvme
mailing list