Re: [PATCH V2 2/2] nvme-multipath: enable PCI P2PDMA for multipath devices

Christoph Hellwig <[email protected]>
Newsgroups gmane.linux.raid
Message-ID <[email protected]>
On Wed, Apr 08, 2026 at 12:25:37AM -0700, Chaitanya Kulkarni wrote:
> From: Kiran Kumar Modukuri <[email protected]>
> 
> NVMe multipath does not expose BLK_FEAT_PCI_P2PDMA on the head disk
> even when the underlying controller supports it.
> 
> Set BLK_FEAT_PCI_P2PDMA in nvme_mpath_alloc_disk() when the controller
> advertises P2PDMA support via ctrl->ops->supports_pci_p2pdma.
> 
> Since multipath can match paths across different transports (e.g. PCIe
> and FC), not all paths are guaranteed to support P2PDMA. Clear
> BLK_FEAT_PCI_P2PDMA from the head disk in nvme_mpath_add_disk() if the
> newly added path does not support it, ensuring the feature is only
> advertised when every member supports it.
> 
> Signed-off-by: Kiran Kumar Modukuri <[email protected]>
> Signed-off-by: Chaitanya Kulkarni <[email protected]>
> ---
>  drivers/nvme/host/multipath.c | 18 ++++++++++++++++++
>  1 file changed, 18 insertions(+)
> 
> diff --git a/drivers/nvme/host/multipath.c b/drivers/nvme/host/multipath.c
> index ba00f0b72b85..48d920ce803f 100644
> --- a/drivers/nvme/host/multipath.c
> +++ b/drivers/nvme/host/multipath.c
> @@ -737,6 +737,9 @@ int nvme_mpath_alloc_disk(struct nvme_ctrl *ctrl, struct nvme_ns_head *head)
>  		BLK_FEAT_POLL | BLK_FEAT_ATOMIC_WRITES;
>  	if (head->ids.csi == NVME_CSI_ZNS)
>  		lim.features |= BLK_FEAT_ZONED;
> +	if (ctrl->ops && ctrl->ops->supports_pci_p2pdma &&
> +	    ctrl->ops->supports_pci_p2pdma(ctrl))
> +		lim.features |= BLK_FEAT_PCI_P2PDMA;

I think we can just add this unconditionally here, similar to all the
other feaures above the ZNS conditional as any non-supporting controller
will clear it later.

>  
>  void nvme_mpath_add_disk(struct nvme_ns *ns, __le32 anagrpid)
>  {
> +	struct nvme_ns_head *head = ns->head;
> +
> +	/*
> +	 * Clear BLK_FEAT_PCI_P2PDMA on the head disk if this path does not
> +	 * support it. Multipath may span different transports (e.g. PCIe and
> +	 * FC), so every member must support P2PDMA for it to be safe on the
> +	 * head disk.
> +	 */
> +	if (head->disk && !blk_queue_pci_p2pdma(ns->queue)) {
> +		struct queue_limits lim =
> +			queue_limits_start_update(head->disk->queue);
> +		lim.features &= ~BLK_FEAT_PCI_P2PDMA;
> +		queue_limits_commit_update(head->disk->queue, &lim);
> +	}

And this really should go into the core block code in blk_stack_limits,
so that BLK_FEAT_PCI_P2PDMA is cleared whenever a non-confirming
device is added, similar to BLK_FEAT_NOWAIT and BLK_FEAT_POLL.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.