win32: pair qemu_memalign() with qemu_vfree()
Win32 suffers from a very big memory leak when dealing with SCSI devices. Each read/write request allocates memory with qemu_memalign (ie VirtualAlloc) but frees it with qemu_free (ie free). Pair all qemu_memalign() calls with qemu_vfree() to prevent such leaks. Signed-off-by: Herve Poussineau <hpoussin@reactos.org> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
This commit is contained in:
		
							parent
							
								
									a35aed57bf
								
							
						
					
					
						commit
						f8a83245d9
					
				
							
								
								
									
										2
									
								
								block.c
								
								
								
								
							
							
						
						
									
										2
									
								
								block.c
								
								
								
								
							| 
						 | 
					@ -1631,7 +1631,7 @@ static void multiwrite_user_cb(MultiwriteCB *mcb)
 | 
				
			||||||
    for (i = 0; i < mcb->num_callbacks; i++) {
 | 
					    for (i = 0; i < mcb->num_callbacks; i++) {
 | 
				
			||||||
        mcb->callbacks[i].cb(mcb->callbacks[i].opaque, mcb->error);
 | 
					        mcb->callbacks[i].cb(mcb->callbacks[i].opaque, mcb->error);
 | 
				
			||||||
        qemu_free(mcb->callbacks[i].free_qiov);
 | 
					        qemu_free(mcb->callbacks[i].free_qiov);
 | 
				
			||||||
        qemu_free(mcb->callbacks[i].free_buf);
 | 
					        qemu_vfree(mcb->callbacks[i].free_buf);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -591,7 +591,7 @@ static void raw_close(BlockDriverState *bs)
 | 
				
			||||||
        close(s->fd);
 | 
					        close(s->fd);
 | 
				
			||||||
        s->fd = -1;
 | 
					        s->fd = -1;
 | 
				
			||||||
        if (s->aligned_buf != NULL)
 | 
					        if (s->aligned_buf != NULL)
 | 
				
			||||||
            qemu_free(s->aligned_buf);
 | 
					            qemu_vfree(s->aligned_buf);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										2
									
								
								exec.c
								
								
								
								
							
							
						
						
									
										2
									
								
								exec.c
								
								
								
								
							| 
						 | 
					@ -3309,7 +3309,7 @@ void cpu_physical_memory_unmap(void *buffer, target_phys_addr_t len,
 | 
				
			||||||
    if (is_write) {
 | 
					    if (is_write) {
 | 
				
			||||||
        cpu_physical_memory_write(bounce.addr, bounce.buffer, access_len);
 | 
					        cpu_physical_memory_write(bounce.addr, bounce.buffer, access_len);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    qemu_free(bounce.buffer);
 | 
					    qemu_vfree(bounce.buffer);
 | 
				
			||||||
    bounce.buffer = NULL;
 | 
					    bounce.buffer = NULL;
 | 
				
			||||||
    cpu_notify_map_clients();
 | 
					    cpu_notify_map_clients();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -81,7 +81,7 @@ static SCSIDiskReq *scsi_new_request(SCSIDevice *d, uint32_t tag, uint32_t lun)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void scsi_remove_request(SCSIDiskReq *r)
 | 
					static void scsi_remove_request(SCSIDiskReq *r)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    qemu_free(r->iov.iov_base);
 | 
					    qemu_vfree(r->iov.iov_base);
 | 
				
			||||||
    scsi_req_free(&r->req);
 | 
					    scsi_req_free(&r->req);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -469,7 +469,7 @@ int main(int argc, char **argv)
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    } while (persistent || nb_fds > 1);
 | 
					    } while (persistent || nb_fds > 1);
 | 
				
			||||||
    qemu_free(data);
 | 
					    qemu_vfree(data);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    close(sharing_fds[0]);
 | 
					    close(sharing_fds[0]);
 | 
				
			||||||
    bdrv_close(bs);
 | 
					    bdrv_close(bs);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue