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

Chaitanya Kulkarni chaitanyak at nvidia.com
Mon Apr 13 19:57:58 PDT 2026


On 4/8/26 23:26, Christoph Hellwig wrote:
> On Wed, Apr 08, 2026 at 12:25:37AM -0700, Chaitanya Kulkarni wrote:
>> From: Kiran Kumar Modukuri <kmodukuri at nvidia.com>
>>
>> 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 <kmodukuri at nvidia.com>
>> Signed-off-by: Chaitanya Kulkarni <kch at nvidia.com>
>> ---
>>   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.
>
I've a V3 with all the comments fixed including the prep patch
to move the above into the block layer.

Waiting to get it tested on with Kiran's setup to generate the test log.

-ck




More information about the Linux-nvme mailing list