On 28/06/2016 11:01, Peter Lieven wrote: > a classic use for mmap here. > > Signed-off-by: Peter Lieven <p...@kamp.de>
They are never freed, why does mmap help? Paolo > --- > hw/core/loader.c | 16 +++++++--------- > 1 file changed, 7 insertions(+), 9 deletions(-) > > diff --git a/hw/core/loader.c b/hw/core/loader.c > index 53e0e41..f217edc 100644 > --- a/hw/core/loader.c > +++ b/hw/core/loader.c > @@ -55,6 +55,7 @@ > #include "exec/address-spaces.h" > #include "hw/boards.h" > #include "qemu/cutils.h" > +#include "qemu/mmap-alloc.h" > > #include <zlib.h> > > @@ -837,7 +838,7 @@ int rom_add_file(const char *file, const char *fw_dir, > { > MachineClass *mc = MACHINE_GET_CLASS(qdev_get_machine()); > Rom *rom; > - int rc, fd = -1; > + int fd = -1; > char devpath[100]; > > rom = g_malloc0(sizeof(*rom)); > @@ -867,12 +868,9 @@ int rom_add_file(const char *file, const char *fw_dir, > } > > rom->datasize = rom->romsize; > - rom->data = g_malloc0(rom->datasize); > - lseek(fd, 0, SEEK_SET); > - rc = read(fd, rom->data, rom->datasize); > - if (rc != rom->datasize) { > - fprintf(stderr, "rom: file %-20s: read error: rc=%d (expected > %zd)\n", > - rom->name, rc, rom->datasize); > + rom->data = mmap(NULL, rom->datasize, PROT_READ, MAP_SHARED, fd, 0); > + if (rom->data == MAP_FAILED) { > + fprintf(stderr, "rom: file %-20s: mmap error\n", rom->name); > goto err; > } > close(fd); > @@ -915,7 +913,7 @@ err: > if (fd != -1) > close(fd); > > - g_free(rom->data); > + qemu_anon_ram_munmap(rom->data, rom->romsize); > g_free(rom->path); > g_free(rom->name); > if (fw_dir) { > @@ -1013,7 +1011,7 @@ static void rom_reset(void *unused) > } > if (rom->isrom) { > /* rom needs to be written only once */ > - g_free(rom->data); > + qemu_anon_ram_munmap(rom->data, rom->datasize); > rom->data = NULL; > } > /* >