提交 a14396b6 编写于 作者: J James Smart 提交者: Martin K. Petersen

scsi: lpfc: Use sg_dma_address() and sg_dma_len() macros for NVMe I/O

NVMe I/O problems may be seen on IOMMU enabled platforms. Adapter I/Os
failing with transfer length mismatches.

The sg list processing routine for NVMe I/O is accessing the sg entry
directly for the length and address fields. On some IOMMU platforms,
contigous mappings are compressed to the first sg entry with the sum of the
lengths set to the sg entry dma_length field. The length fields are left
for later use by the unmap call. As such, the driver didn't see the actual
dma_length value, just the first entries length value.  Drivers are to use
the sg_dma_length() and sg_dma_address() macros to reference the sg
entry. The macros select the proper length field (dma_length or length) to
reference.

Fix the offending code to use the sg_dma_xxx macros.

Link: https://lore.kernel.org/r/20220506035519.50908-12-jsmart2021@gmail.comTested-by: NJerry Snitselaar <jsnitsel@redhat.com>
Reviewed-by: NJerry Snitselaar <jsnitsel@redhat.com>
Co-developed-by: NNigel Kirkland <nkirkland2304@gmail.com>
Signed-off-by: NNigel Kirkland <nkirkland2304@gmail.com>
Signed-off-by: NJames Smart <jsmart2021@gmail.com>
Signed-off-by: NMartin K. Petersen <martin.petersen@oracle.com>
上级 e6f51041
...@@ -1401,8 +1401,8 @@ lpfc_nvme_prep_io_dma(struct lpfc_vport *vport, ...@@ -1401,8 +1401,8 @@ lpfc_nvme_prep_io_dma(struct lpfc_vport *vport,
if ((nseg - 1) == i) if ((nseg - 1) == i)
bf_set(lpfc_sli4_sge_last, sgl, 1); bf_set(lpfc_sli4_sge_last, sgl, 1);
physaddr = data_sg->dma_address; physaddr = sg_dma_address(data_sg);
dma_len = data_sg->length; dma_len = sg_dma_len(data_sg);
sgl->addr_lo = cpu_to_le32( sgl->addr_lo = cpu_to_le32(
putPaddrLow(physaddr)); putPaddrLow(physaddr));
sgl->addr_hi = cpu_to_le32( sgl->addr_hi = cpu_to_le32(
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册