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;
 | 
					    SCSIRequest *req;
 | 
				
			||||||
    SCSIBus *bus = scsi_bus_from_device(d);
 | 
					    SCSIBus *bus = scsi_bus_from_device(d);
 | 
				
			||||||
    BusState *qbus = BUS(bus);
 | 
					    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->refcount = 1;
 | 
				
			||||||
    req->bus = bus;
 | 
					    req->bus = bus;
 | 
				
			||||||
    req->dev = d;
 | 
					    req->dev = d;
 | 
				
			||||||
@ -560,7 +563,6 @@ SCSIRequest *scsi_req_alloc(const SCSIReqOps *reqops, SCSIDevice *d,
 | 
				
			|||||||
    req->lun = lun;
 | 
					    req->lun = lun;
 | 
				
			||||||
    req->hba_private = hba_private;
 | 
					    req->hba_private = hba_private;
 | 
				
			||||||
    req->status = -1;
 | 
					    req->status = -1;
 | 
				
			||||||
    req->sense_len = 0;
 | 
					 | 
				
			||||||
    req->ops = reqops;
 | 
					    req->ops = reqops;
 | 
				
			||||||
    object_ref(OBJECT(d));
 | 
					    object_ref(OBJECT(d));
 | 
				
			||||||
    object_ref(OBJECT(qbus->parent));
 | 
					    object_ref(OBJECT(qbus->parent));
 | 
				
			||||||
@ -1603,7 +1605,7 @@ void scsi_req_unref(SCSIRequest *req)
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
        object_unref(OBJECT(req->dev));
 | 
					        object_unref(OBJECT(req->dev));
 | 
				
			||||||
        object_unref(OBJECT(qbus->parent));
 | 
					        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          tag;
 | 
				
			||||||
    uint32_t          lun;
 | 
					    uint32_t          lun;
 | 
				
			||||||
    uint32_t          status;
 | 
					    uint32_t          status;
 | 
				
			||||||
 | 
					    void              *hba_private;
 | 
				
			||||||
    size_t            resid;
 | 
					    size_t            resid;
 | 
				
			||||||
    SCSICommand       cmd;
 | 
					    SCSICommand       cmd;
 | 
				
			||||||
    BlockDriverAIOCB  *aiocb;
 | 
					
 | 
				
			||||||
    QEMUSGList        *sg;
 | 
					    /* Note:
 | 
				
			||||||
    bool              dma_started;
 | 
					     * - 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];
 | 
					    uint8_t           sense[SCSI_SENSE_BUF_SIZE];
 | 
				
			||||||
    uint32_t          sense_len;
 | 
					    uint32_t          sense_len;
 | 
				
			||||||
    bool              enqueued;
 | 
					    bool              enqueued;
 | 
				
			||||||
    bool              io_canceled;
 | 
					    bool              io_canceled;
 | 
				
			||||||
    bool              retry;
 | 
					    bool              retry;
 | 
				
			||||||
    void *hba_private;
 | 
					    bool              dma_started;
 | 
				
			||||||
 | 
					    BlockDriverAIOCB  *aiocb;
 | 
				
			||||||
 | 
					    QEMUSGList        *sg;
 | 
				
			||||||
    QTAILQ_ENTRY(SCSIRequest) next;
 | 
					    QTAILQ_ENTRY(SCSIRequest) next;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user