mirror of
				git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
				synced 2025-10-31 08:44:41 +00:00 
			
		
		
		
	VMW_PVSCSI: Fix the issue of DMA-API related warnings.
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 <arvindkumar@vmware.com> Cc: Josh Boyer <jwboyer@fedoraproject.org> Reviewed-by: Thomas Hellstrom <thellstrom@vmware.com> Signed-off-by: Josh Boyer <jwboyer@fedoraproject.org> Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
		
							parent
							
								
									21891a452a
								
							
						
					
					
						commit
						c965853ab0
					
				
					 2 changed files with 40 additions and 7 deletions
				
			
		|  | @ -349,9 +349,9 @@ static void pvscsi_create_sg(struct pvscsi_ctx *ctx, | ||||||
|  * Map all data buffers for a command into PCI space and |  * Map all data buffers for a command into PCI space and | ||||||
|  * setup the scatter/gather list if needed. |  * setup the scatter/gather list if needed. | ||||||
|  */ |  */ | ||||||
| static void pvscsi_map_buffers(struct pvscsi_adapter *adapter, | static int pvscsi_map_buffers(struct pvscsi_adapter *adapter, | ||||||
| 			       struct pvscsi_ctx *ctx, struct scsi_cmnd *cmd, | 			      struct pvscsi_ctx *ctx, struct scsi_cmnd *cmd, | ||||||
| 			       struct PVSCSIRingReqDesc *e) | 			      struct PVSCSIRingReqDesc *e) | ||||||
| { | { | ||||||
| 	unsigned count; | 	unsigned count; | ||||||
| 	unsigned bufflen = scsi_bufflen(cmd); | 	unsigned bufflen = scsi_bufflen(cmd); | ||||||
|  | @ -360,18 +360,30 @@ static void pvscsi_map_buffers(struct pvscsi_adapter *adapter, | ||||||
| 	e->dataLen = bufflen; | 	e->dataLen = bufflen; | ||||||
| 	e->dataAddr = 0; | 	e->dataAddr = 0; | ||||||
| 	if (bufflen == 0) | 	if (bufflen == 0) | ||||||
| 		return; | 		return 0; | ||||||
| 
 | 
 | ||||||
| 	sg = scsi_sglist(cmd); | 	sg = scsi_sglist(cmd); | ||||||
| 	count = scsi_sg_count(cmd); | 	count = scsi_sg_count(cmd); | ||||||
| 	if (count != 0) { | 	if (count != 0) { | ||||||
| 		int segs = scsi_dma_map(cmd); | 		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); | 			pvscsi_create_sg(ctx, sg, segs); | ||||||
| 
 | 
 | ||||||
| 			e->flags |= PVSCSI_FLAG_CMD_WITH_SG_LIST; | 			e->flags |= PVSCSI_FLAG_CMD_WITH_SG_LIST; | ||||||
| 			ctx->sglPA = pci_map_single(adapter->dev, ctx->sgl, | 			ctx->sglPA = pci_map_single(adapter->dev, ctx->sgl, | ||||||
| 						    SGL_SIZE, PCI_DMA_TODEVICE); | 						    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; | 			e->dataAddr = ctx->sglPA; | ||||||
| 		} else | 		} else | ||||||
| 			e->dataAddr = sg_dma_address(sg); | 			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, | 		ctx->dataPA = pci_map_single(adapter->dev, sg, bufflen, | ||||||
| 					     cmd->sc_data_direction); | 					     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; | 		e->dataAddr = ctx->dataPA; | ||||||
| 	} | 	} | ||||||
|  | 
 | ||||||
|  | 	return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void pvscsi_unmap_buffers(const struct pvscsi_adapter *adapter, | 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, | 		ctx->sensePA = pci_map_single(adapter->dev, cmd->sense_buffer, | ||||||
| 					      SCSI_SENSE_BUFFERSIZE, | 					      SCSI_SENSE_BUFFERSIZE, | ||||||
| 					      PCI_DMA_FROMDEVICE); | 					      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->senseAddr = ctx->sensePA; | ||||||
| 		e->senseLen = SCSI_SENSE_BUFFERSIZE; | 		e->senseLen = SCSI_SENSE_BUFFERSIZE; | ||||||
| 	} else { | 	} else { | ||||||
|  | @ -711,7 +736,15 @@ static int pvscsi_queue_ring(struct pvscsi_adapter *adapter, | ||||||
| 	else | 	else | ||||||
| 		e->flags = 0; | 		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); | 	e->context = pvscsi_map_context(adapter, ctx); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -26,7 +26,7 @@ | ||||||
| 
 | 
 | ||||||
| #include <linux/types.h> | #include <linux/types.h> | ||||||
| 
 | 
 | ||||||
| #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 | #define PVSCSI_MAX_NUM_SG_ENTRIES_PER_SEGMENT 128 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 Josh Boyer
						Josh Boyer