[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