On Tue, 17 Feb 2015 11:05:45 +0100 "Michael S. Tsirkin" <[email protected]> wrote:
> For legacy machine types, rsdp is not in RAM, so we need a copy of rsdp > for fw cfg. We previously used g_array_free with false parameter, > but this seems to confuse people. > This also wastes a bit of memory as the buffer is unused for new > machine types. > > Let's just use plain g_memdup, and free original memory together with > the array. > > TODO: rationalize tcpalog memory management, and get rid of the mfre > parameter. > > Signed-off-by: Michael S. Tsirkin <[email protected]> Reviewed-by: Igor Mammedov <[email protected]> > --- > hw/i386/acpi-build.c | 10 ++++++---- > 1 file changed, 6 insertions(+), 4 deletions(-) > > diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c > index ffa3f00..f712277 100644 > --- a/hw/i386/acpi-build.c > +++ b/hw/i386/acpi-build.c > @@ -1257,7 +1257,7 @@ static inline void > acpi_build_tables_cleanup(AcpiBuildTables *tables, bool mfre) > { > void *linker_data = bios_linker_loader_cleanup(tables->linker); > g_free(linker_data); > - g_array_free(tables->rsdp, mfre); > + g_array_free(tables->rsdp, true); > g_array_free(tables->table_data, true); > g_array_free(tables->tcpalog, mfre); > } > @@ -1560,12 +1560,14 @@ void acpi_setup(PcGuestInfo *guest_info) > /* > * Keep for compatibility with old machine types. > * Though RSDP is small, its contents isn't immutable, so > - * update it along with the rest of tables on guest access. > + * we'll update it along with the rest of tables on guest access. > */ > + uint32_t rsdp_size = acpi_data_len(tables.rsdp); > + > + build_state->rsdp = g_memdup(tables.rsdp->data, rsdp_size); > fw_cfg_add_file_callback(guest_info->fw_cfg, ACPI_BUILD_RSDP_FILE, > acpi_build_update, build_state, > - tables.rsdp->data, > acpi_data_len(tables.rsdp)); > - build_state->rsdp = tables.rsdp->data; > + build_state->rsdp, rsdp_size); > build_state->rsdp_ram = (ram_addr_t)-1; > } else { > build_state->rsdp = NULL;
