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 |
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 --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(