65 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			65 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| From ca0559e2350c618048f7caf80cb79c1259e7cfd2 Mon Sep 17 00:00:00 2001
 | |
| From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= <berrange@redhat.com>
 | |
| Date: Tue, 10 Jun 2025 13:37:06 +0100
 | |
| Subject: [PATCH] hw/scsi/megasas: skip automatic zero-init of large arrays
 | |
| MIME-Version: 1.0
 | |
| Content-Type: text/plain; charset=UTF-8
 | |
| Content-Transfer-Encoding: 8bit
 | |
| 
 | |
| The 'megasas_dcmd_pd_get_list' and 'megasas_dcmd_get_properties'
 | |
| methods have 4k structs used for copying data from the device.
 | |
| Skip the automatic zero-init of this array to eliminate the
 | |
| performance overhead in the I/O hot path.
 | |
| 
 | |
| The 'info' structs are manually initialized with memset(). The
 | |
| compiler ought to be intelligent enough to turn the memset()
 | |
| into a static initialization operation, and thus not duplicate
 | |
| the automatic zero-init. Replacing memset() with '{}' makes it
 | |
| unambiguous that the arrays are statically initialized.
 | |
| 
 | |
| Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
 | |
| Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
 | |
| Reviewed-by: Klaus Jensen <k.jensen@samsung.com>
 | |
| Reviewed-by: Harsh Prateek Bora <harshpb@linux.ibm.com>
 | |
| Message-id: 20250610123709.835102-29-berrange@redhat.com
 | |
| Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
 | |
| ---
 | |
|  hw/scsi/megasas.c | 7 ++-----
 | |
|  1 file changed, 2 insertions(+), 5 deletions(-)
 | |
| 
 | |
| diff --git a/hw/scsi/megasas.c b/hw/scsi/megasas.c
 | |
| index 55cd188bd5..844643d916 100644
 | |
| --- a/hw/scsi/megasas.c
 | |
| +++ b/hw/scsi/megasas.c
 | |
| @@ -981,13 +981,11 @@ static int megasas_event_wait(MegasasState *s, MegasasCmd *cmd)
 | |
|  
 | |
|  static int megasas_dcmd_pd_get_list(MegasasState *s, MegasasCmd *cmd)
 | |
|  {
 | |
| -    struct mfi_pd_list info;
 | |
| -    size_t dcmd_size = sizeof(info);
 | |
| +    struct mfi_pd_list info = {};
 | |
|      BusChild *kid;
 | |
|      uint32_t offset, dcmd_limit, num_pd_disks = 0, max_pd_disks;
 | |
|      dma_addr_t residual;
 | |
|  
 | |
| -    memset(&info, 0, dcmd_size);
 | |
|      offset = 8;
 | |
|      dcmd_limit = offset + sizeof(struct mfi_pd_address);
 | |
|      if (cmd->iov_size < dcmd_limit) {
 | |
| @@ -1429,11 +1427,10 @@ static int megasas_dcmd_cfg_read(MegasasState *s, MegasasCmd *cmd)
 | |
|  
 | |
|  static int megasas_dcmd_get_properties(MegasasState *s, MegasasCmd *cmd)
 | |
|  {
 | |
| -    struct mfi_ctrl_props info;
 | |
| +    struct mfi_ctrl_props info = {};
 | |
|      size_t dcmd_size = sizeof(info);
 | |
|      dma_addr_t residual;
 | |
|  
 | |
| -    memset(&info, 0x0, dcmd_size);
 | |
|      if (cmd->iov_size < dcmd_size) {
 | |
|          trace_megasas_dcmd_invalid_xfer_len(cmd->index, cmd->iov_size,
 | |
|                                              dcmd_size);
 | |
| -- 
 | |
| 2.47.3
 | |
| 
 |