Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1760225AbbLCNgJ (ORCPT ); Thu, 3 Dec 2015 08:36:09 -0500 Received: from mx2.suse.de ([195.135.220.15]:57723 "EHLO mx2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1760095AbbLCNfu (ORCPT ); Thu, 3 Dec 2015 08:35:50 -0500 Message-ID: <1449149747.3311.13.camel@suse.de> Subject: Re: [PATCH v2] VMW_PVSCSI: Fix the issue of DMA-API related warnings. From: Johannes Thumshirn To: Josh Boyer , James.Bottomley@hansenpartnership.com, arvindkumar@vmware.com, Thomas Hellstrom Cc: linux-scsi@vger.kernel.org, pv-drivers@vmware.com, linux-kernel@vger.kernel.org Date: Thu, 03 Dec 2015 14:35:47 +0100 In-Reply-To: <20151203132758.GC19092@hansolo.redhat.com> References: <20151203132758.GC19092@hansolo.redhat.com> Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.18.2 Mime-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 5035 Lines: 148 On Thu, 2015-12-03 at 08:27 -0500, Josh Boyer wrote: > The driver is missing calls to pci_dma_mapping_error() after > performing the DMA mapping, which caused DMA-API warning to > show up in dmesg's output. Though that happens only when > DMA_API_DEBUG option is enabled. This change fixes the issue > and makes pvscsi_map_buffers() function more robust. > > Signed-off-by: Arvind Kumar > Cc: Josh Boyer > Reviewed-by: Thomas Hellstrom > Signed-off-by: Josh Boyer > --- > >  v2: Use -ENOMEM instead of -1 for the error return code as suggested by >      Johannes Thumshirn > >  drivers/scsi/vmw_pvscsi.c | 45 +++++++++++++++++++++++++++++++++++++++------ >  drivers/scsi/vmw_pvscsi.h |  2 +- >  2 files changed, 40 insertions(+), 7 deletions(-) > > diff --git a/drivers/scsi/vmw_pvscsi.c b/drivers/scsi/vmw_pvscsi.c > index 0f133c1817de..6164634aff18 100644 > --- a/drivers/scsi/vmw_pvscsi.c > +++ b/drivers/scsi/vmw_pvscsi.c > @@ -349,9 +349,9 @@ static void pvscsi_create_sg(struct pvscsi_ctx *ctx, >   * Map all data buffers for a command into PCI space and >   * setup the scatter/gather list if needed. >   */ > -static void pvscsi_map_buffers(struct pvscsi_adapter *adapter, > -        struct pvscsi_ctx *ctx, struct scsi_cmnd > *cmd, > -        struct PVSCSIRingReqDesc *e) > +static int pvscsi_map_buffers(struct pvscsi_adapter *adapter, > +       struct pvscsi_ctx *ctx, struct scsi_cmnd *cmd, > +       struct PVSCSIRingReqDesc *e) >  { >   unsigned count; >   unsigned bufflen = scsi_bufflen(cmd); > @@ -360,18 +360,30 @@ static void pvscsi_map_buffers(struct pvscsi_adapter > *adapter, >   e->dataLen = bufflen; >   e->dataAddr = 0; >   if (bufflen == 0) > - return; > + return 0; >   >   sg = scsi_sglist(cmd); >   count = scsi_sg_count(cmd); >   if (count != 0) { >   int segs = scsi_dma_map(cmd); > - if (segs > 1) { > + > + if (segs == -ENOMEM) { > + scmd_printk(KERN_ERR, cmd, > +     "vmw_pvscsi: Failed to map cmd sglist > for DMA.\n"); > + return -ENOMEM; > + } else if (segs > 1) { >   pvscsi_create_sg(ctx, sg, segs); >   >   e->flags |= PVSCSI_FLAG_CMD_WITH_SG_LIST; >   ctx->sglPA = pci_map_single(adapter->dev, ctx->sgl, >       SGL_SIZE, > PCI_DMA_TODEVICE); > + if (pci_dma_mapping_error(adapter->dev, ctx->sglPA)) > { > + scmd_printk(KERN_ERR, cmd, > +     "vmw_pvscsi: Failed to map ctx > sglist for DMA.\n"); > + scsi_dma_unmap(cmd); > + ctx->sglPA = 0; > + return -ENOMEM; > + } >   e->dataAddr = ctx->sglPA; >   } else >   e->dataAddr = sg_dma_address(sg); > @@ -382,8 +394,15 @@ static void pvscsi_map_buffers(struct pvscsi_adapter > *adapter, >    */ >   ctx->dataPA = pci_map_single(adapter->dev, sg, bufflen, >        cmd->sc_data_direction); > + if (pci_dma_mapping_error(adapter->dev, ctx->dataPA)) { > + scmd_printk(KERN_ERR, cmd, > +     "vmw_pvscsi: Failed to map direct data > buffer for DMA.\n"); > + return -ENOMEM; > + } >   e->dataAddr = ctx->dataPA; >   } > + > + return 0; >  } >   >  static void pvscsi_unmap_buffers(const struct pvscsi_adapter *adapter, > @@ -690,6 +709,12 @@ static int pvscsi_queue_ring(struct pvscsi_adapter > *adapter, >   ctx->sensePA = pci_map_single(adapter->dev, cmd- > >sense_buffer, >         SCSI_SENSE_BUFFERSIZE, >         PCI_DMA_FROMDEVICE); > + if (pci_dma_mapping_error(adapter->dev, ctx->sensePA)) { > + scmd_printk(KERN_ERR, cmd, > +     "vmw_pvscsi: Failed to map sense buffer > for DMA.\n"); > + ctx->sensePA = 0; > + return -ENOMEM; > + } >   e->senseAddr = ctx->sensePA; >   e->senseLen = SCSI_SENSE_BUFFERSIZE; >   } else { > @@ -711,7 +736,15 @@ static int pvscsi_queue_ring(struct pvscsi_adapter > *adapter, >   else >   e->flags = 0; >   > - pvscsi_map_buffers(adapter, ctx, cmd, e); > + if (pvscsi_map_buffers(adapter, ctx, cmd, e) != 0) { > + if (cmd->sense_buffer) { > + pci_unmap_single(adapter->dev, ctx->sensePA, > +  SCSI_SENSE_BUFFERSIZE, > +  PCI_DMA_FROMDEVICE); > + ctx->sensePA = 0; > + } > + return -ENOMEM; > + } >   >   e->context = pvscsi_map_context(adapter, ctx); >   > diff --git a/drivers/scsi/vmw_pvscsi.h b/drivers/scsi/vmw_pvscsi.h > index ee16f0c5c47d..12712c92f37a 100644 > --- a/drivers/scsi/vmw_pvscsi.h > +++ b/drivers/scsi/vmw_pvscsi.h > @@ -26,7 +26,7 @@ >   >  #include >   > -#define PVSCSI_DRIVER_VERSION_STRING   "1.0.5.0-k" > +#define PVSCSI_DRIVER_VERSION_STRING   "1.0.6.0-k" >   >  #define PVSCSI_MAX_NUM_SG_ENTRIES_PER_SEGMENT 128 >   Reviewed-by: Johannes Thumshirn -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/