scsi: Optimize scsi_req_alloc
Zeroing sense buffer for each scsi request is not efficient, we can just leave it uninitialized because sense_len is set to 0. Move the implicitly zeroed fields to the end of the structure and use a partial memset. The explicitly initialized fields (by scsi_req_alloc or scsi_req_new) are moved to the beginning of the structure, before sense buffer, to skip the memset. Also change g_malloc0 to g_slice_alloc. Signed-off-by: Fam Zheng <famz@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
		
							parent
							
								
									380f649e02
								
							
						
					
					
						commit
						61e68b3fbd
					
				| @ -551,8 +551,11 @@ SCSIRequest *scsi_req_alloc(const SCSIReqOps *reqops, SCSIDevice *d, | ||||
|     SCSIRequest *req; | ||||
|     SCSIBus *bus = scsi_bus_from_device(d); | ||||
|     BusState *qbus = BUS(bus); | ||||
|     const int memset_off = offsetof(SCSIRequest, sense) | ||||
|                            + sizeof(req->sense); | ||||
| 
 | ||||
|     req = g_malloc0(reqops->size); | ||||
|     req = g_slice_alloc(reqops->size); | ||||
|     memset((uint8_t *)req + memset_off, 0, reqops->size - memset_off); | ||||
|     req->refcount = 1; | ||||
|     req->bus = bus; | ||||
|     req->dev = d; | ||||
| @ -560,7 +563,6 @@ SCSIRequest *scsi_req_alloc(const SCSIReqOps *reqops, SCSIDevice *d, | ||||
|     req->lun = lun; | ||||
|     req->hba_private = hba_private; | ||||
|     req->status = -1; | ||||
|     req->sense_len = 0; | ||||
|     req->ops = reqops; | ||||
|     object_ref(OBJECT(d)); | ||||
|     object_ref(OBJECT(qbus->parent)); | ||||
| @ -1603,7 +1605,7 @@ void scsi_req_unref(SCSIRequest *req) | ||||
|         } | ||||
|         object_unref(OBJECT(req->dev)); | ||||
|         object_unref(OBJECT(qbus->parent)); | ||||
|         g_free(req); | ||||
|         g_slice_free1(req->ops->size, req); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -50,17 +50,24 @@ struct SCSIRequest { | ||||
|     uint32_t          tag; | ||||
|     uint32_t          lun; | ||||
|     uint32_t          status; | ||||
|     void              *hba_private; | ||||
|     size_t            resid; | ||||
|     SCSICommand       cmd; | ||||
| 
 | ||||
|     /* Note:
 | ||||
|      * - fields before sense are initialized by scsi_req_alloc; | ||||
|      * - sense[] is uninitialized; | ||||
|      * - fields after sense are memset to 0 by scsi_req_alloc. | ||||
|      * */ | ||||
| 
 | ||||
|     uint8_t           sense[SCSI_SENSE_BUF_SIZE]; | ||||
|     uint32_t          sense_len; | ||||
|     bool              enqueued; | ||||
|     bool              io_canceled; | ||||
|     bool              retry; | ||||
|     bool              dma_started; | ||||
|     BlockDriverAIOCB  *aiocb; | ||||
|     QEMUSGList        *sg; | ||||
|     bool              dma_started; | ||||
|     uint8_t sense[SCSI_SENSE_BUF_SIZE]; | ||||
|     uint32_t sense_len; | ||||
|     bool enqueued; | ||||
|     bool io_canceled; | ||||
|     bool retry; | ||||
|     void *hba_private; | ||||
|     QTAILQ_ENTRY(SCSIRequest) next; | ||||
| }; | ||||
| 
 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Fam Zheng
						Fam Zheng