diff mbox series

[11/12] lpfc: Use sg_dma_address and sg_dma_len macros for NVMe I/O

Message ID 20220506035519.50908-12-jsmart2021@gmail.com (mailing list archive)
State Accepted
Headers show
Series lpfc: Update lpfc to revision 14.2.0.3 | expand

Commit Message

James Smart May 6, 2022, 3:55 a.m. UTC
NVME I/O problems may be seen on IOMMU enabled platforms. Adapter I/O's
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.

Signed-off-by: Nigel Kirkland <nkirkland2304@gmail.com>
Signed-off-by: James Smart <jsmart2021@gmail.com>
---
 drivers/scsi/lpfc/lpfc_nvme.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

Comments

Jerry Snitselaar May 6, 2022, 4:41 p.m. UTC | #1
On Thu, 2022-05-05 at 20:55 -0700, James Smart wrote:
> NVME I/O problems may be seen on IOMMU enabled platforms. Adapter
> I/O's
> 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.
> 
> Signed-off-by: Nigel Kirkland <nkirkland2304@gmail.com>
> Signed-off-by: James Smart <jsmart2021@gmail.com>

Tested-by: Jerry Snitselaar <jsnitsel@redhat.com>
Reviewed-by: Jerry Snitselaar <jsnitsel@redhat.com>

> ---
>  drivers/scsi/lpfc/lpfc_nvme.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/scsi/lpfc/lpfc_nvme.c
> b/drivers/scsi/lpfc/lpfc_nvme.c
> index 3aebd01e07fd..5385f4de5523 100644
> --- a/drivers/scsi/lpfc/lpfc_nvme.c
> +++ b/drivers/scsi/lpfc/lpfc_nvme.c
> @@ -1401,8 +1401,8 @@ lpfc_nvme_prep_io_dma(struct lpfc_vport *vport,
>                                 if ((nseg - 1) == i)
>                                         bf_set(lpfc_sli4_sge_last,
> sgl, 1);
>  
> -                               physaddr = data_sg->dma_address;
> -                               dma_len = data_sg->length;
> +                               physaddr = sg_dma_address(data_sg);
> +                               dma_len = sg_dma_len(data_sg);
>                                 sgl->addr_lo = cpu_to_le32(
>                                                         
> putPaddrLow(physaddr));
>                                 sgl->addr_hi = cpu_to_le32(
diff mbox series

Patch

diff --git a/drivers/scsi/lpfc/lpfc_nvme.c b/drivers/scsi/lpfc/lpfc_nvme.c
index 3aebd01e07fd..5385f4de5523 100644
--- a/drivers/scsi/lpfc/lpfc_nvme.c
+++ b/drivers/scsi/lpfc/lpfc_nvme.c
@@ -1401,8 +1401,8 @@  lpfc_nvme_prep_io_dma(struct lpfc_vport *vport,
 				if ((nseg - 1) == i)
 					bf_set(lpfc_sli4_sge_last, sgl, 1);
 
-				physaddr = data_sg->dma_address;
-				dma_len = data_sg->length;
+				physaddr = sg_dma_address(data_sg);
+				dma_len = sg_dma_len(data_sg);
 				sgl->addr_lo = cpu_to_le32(
 							 putPaddrLow(physaddr));
 				sgl->addr_hi = cpu_to_le32(