[PATCH 03/13] libmultipath: Add path selection support
Nilay Shroff
nilay at linux.ibm.com
Mon Mar 2 04:36:50 PST 2026
On 2/25/26 9:02 PM, John Garry wrote:
> Add code for path selection.
>
> NVMe ANA is abstracted into enum mpath_access_state. The motivation here is
> so that SCSI ALUA can be used. Callbacks .is_disabled, .is_optimized,
> .get_access_state are added to get the path access state.
>
> Path selection modes round-robin, NUMA, and queue-depth are added, same
> as NVMe supports.
>
> NVMe has almost like-for-like equivalents here:
> - __mpath_find_path() -> __nvme_find_path()
> - mpath_find_path() -> nvme_find_path()
>
> and similar for all introduced callee functions.
>
> Functions mpath_set_iopolicy() and mpath_get_iopolicy() are added for
> setting default iopolicy.
>
> A separate mpath_iopolicy structure is introduced. There is no iopolicy
> member included in the mpath_head structure as it may not suit NVMe, where
> iopolicy is per-subsystem and not per namespace.
>
> Signed-off-by: John Garry <john.g.garry at oracle.com>
> ---
> include/linux/multipath.h | 36 ++++++
> lib/multipath.c | 251 ++++++++++++++++++++++++++++++++++++++
> 2 files changed, 287 insertions(+)
>
> diff --git a/include/linux/multipath.h b/include/linux/multipath.h
> index be9dd9fb83345..c964a1aba9c42 100644
> --- a/include/linux/multipath.h
> +++ b/include/linux/multipath.h
> @@ -7,6 +7,22 @@
>
> extern const struct block_device_operations mpath_ops;
>
> +enum mpath_iopolicy_e {
> + MPATH_IOPOLICY_NUMA,
> + MPATH_IOPOLICY_RR,
> + MPATH_IOPOLICY_QD,
> +};
> +
> +struct mpath_iopolicy {
> + enum mpath_iopolicy_e iopolicy;
> +};
> +
> +enum mpath_access_state {
> + MPATH_STATE_OPTIMIZED,
> + MPATH_STATE_ACTIVE,
> + MPATH_STATE_INVALID = 0xFF
> +};
Hmm so here we don't have MPATH_STATE_NONOPTIMIZED.
We are morphing NVME_ANA_NONOPTIMIZED as MPATH_STATE_ACTIVE.
Is it because SCSI doesn't have (NONOPTIMIZED) state?
> +
> struct mpath_disk {
> struct gendisk *disk;
> struct kref ref;
> @@ -18,10 +34,16 @@ struct mpath_disk {
>
> struct mpath_device {
> struct list_head siblings;
> + atomic_t nr_active;
> struct gendisk *disk;
> + int numa_node;
> };
>
I haven't seen any API which help set nr_active or numa_node.
Do we need to have those under struct mpath_head_template ?
Thanks,
--Nilay
More information about the Linux-nvme
mailing list