Message ID | 1406534605-18911-3-git-send-email-imammedo@redhat.com |
---|---|
State | New |
Headers | show |
On Mon, 28 Jul 2014 08:03:25 +0000 Igor Mammedov <imammedo@redhat.com> wrote: > It fixes migration failure for machine type pc-i440fx-1.7 from > QEMU 1.7/2.0 to QEMU 2.1 > > Migration fails due to ACPI tables size grows across 1.7-2.1 > versions. That causes ACPI tables ROM blob to change its size > differently for the same configurations on different QEMU versions. > As result migration code bails out when attempting to load > smaller ROM blob into a bigger one on a newer QEMU. > To trigger failure it's enough to add pci-bridge device to QEMU CLI > > Marking ACPI tables ROM blob as extend-able on migration allows > QEMU to load smaller ACPI tables from QEMU 1.7/2.0, fixing > forward migration failure introduced since 2.0 which affects > only configurations that cause ACPI ROM blob size change. > > Signed-off-by: Igor Mammedov <imammedo@redhat.com> > Reviewed-by: Laszlo Ersek <lersek@redhat.com> Self-NACK I'm sorry for mess, I've tested it on for i386 target, but patch breaks build for other targets. I'll resubmit v3 shortly. > --- > hw/core/loader.c | 6 +++++- > hw/i386/acpi-build.c | 2 +- > include/hw/loader.h | 5 +++-- > 3 files changed, 9 insertions(+), 4 deletions(-) > > diff --git a/hw/core/loader.c b/hw/core/loader.c > index 2bf6b8f..d09b894 100644 > --- a/hw/core/loader.c > +++ b/hw/core/loader.c > @@ -722,7 +722,8 @@ err: > > void *rom_add_blob(const char *name, const void *blob, size_t len, > hwaddr addr, const char *fw_file_name, > - FWCfgReadCallback fw_callback, void *callback_opaque) > + FWCfgReadCallback fw_callback, void *callback_opaque, > + bool extendable) > { > Rom *rom; > void *data = NULL; > @@ -742,6 +743,9 @@ void *rom_add_blob(const char *name, const void *blob, size_t len, > > if (rom_file_has_mr) { > data = rom_set_mr(rom, OBJECT(fw_cfg), devpath); > + if (extendable) { > + memory_region_permit_extendable_migration(rom->mr); > + } > } else { > data = rom->data; > } > diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c > index ebc5f03..651c06b 100644 > --- a/hw/i386/acpi-build.c > +++ b/hw/i386/acpi-build.c > @@ -1558,7 +1558,7 @@ static void *acpi_add_rom_blob(AcpiBuildState *build_state, GArray *blob, > const char *name) > { > return rom_add_blob(name, blob->data, acpi_data_len(blob), -1, name, > - acpi_build_update, build_state); > + acpi_build_update, build_state, true); > } > > static const VMStateDescription vmstate_acpi_build = { > diff --git a/include/hw/loader.h b/include/hw/loader.h > index 796cbf9..e5a24ac 100644 > --- a/include/hw/loader.h > +++ b/include/hw/loader.h > @@ -57,7 +57,8 @@ int rom_add_file(const char *file, const char *fw_dir, > bool option_rom); > void *rom_add_blob(const char *name, const void *blob, size_t len, > hwaddr addr, const char *fw_file_name, > - FWCfgReadCallback fw_callback, void *callback_opaque); > + FWCfgReadCallback fw_callback, void *callback_opaque, > + bool extendable); > int rom_add_elf_program(const char *name, void *data, size_t datasize, > size_t romsize, hwaddr addr); > int rom_load_all(void); > @@ -70,7 +71,7 @@ void do_info_roms(Monitor *mon, const QDict *qdict); > #define rom_add_file_fixed(_f, _a, _i) \ > rom_add_file(_f, NULL, _a, _i, false) > #define rom_add_blob_fixed(_f, _b, _l, _a) \ > - rom_add_blob(_f, _b, _l, _a, NULL, NULL, NULL) > + rom_add_blob(_f, _b, _l, _a, NULL, NULL, NULL, false) > > #define PC_ROM_MIN_VGA 0xc0000 > #define PC_ROM_MIN_OPTION 0xc8000
diff --git a/hw/core/loader.c b/hw/core/loader.c index 2bf6b8f..d09b894 100644 --- a/hw/core/loader.c +++ b/hw/core/loader.c @@ -722,7 +722,8 @@ err: void *rom_add_blob(const char *name, const void *blob, size_t len, hwaddr addr, const char *fw_file_name, - FWCfgReadCallback fw_callback, void *callback_opaque) + FWCfgReadCallback fw_callback, void *callback_opaque, + bool extendable) { Rom *rom; void *data = NULL; @@ -742,6 +743,9 @@ void *rom_add_blob(const char *name, const void *blob, size_t len, if (rom_file_has_mr) { data = rom_set_mr(rom, OBJECT(fw_cfg), devpath); + if (extendable) { + memory_region_permit_extendable_migration(rom->mr); + } } else { data = rom->data; } diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c index ebc5f03..651c06b 100644 --- a/hw/i386/acpi-build.c +++ b/hw/i386/acpi-build.c @@ -1558,7 +1558,7 @@ static void *acpi_add_rom_blob(AcpiBuildState *build_state, GArray *blob, const char *name) { return rom_add_blob(name, blob->data, acpi_data_len(blob), -1, name, - acpi_build_update, build_state); + acpi_build_update, build_state, true); } static const VMStateDescription vmstate_acpi_build = { diff --git a/include/hw/loader.h b/include/hw/loader.h index 796cbf9..e5a24ac 100644 --- a/include/hw/loader.h +++ b/include/hw/loader.h @@ -57,7 +57,8 @@ int rom_add_file(const char *file, const char *fw_dir, bool option_rom); void *rom_add_blob(const char *name, const void *blob, size_t len, hwaddr addr, const char *fw_file_name, - FWCfgReadCallback fw_callback, void *callback_opaque); + FWCfgReadCallback fw_callback, void *callback_opaque, + bool extendable); int rom_add_elf_program(const char *name, void *data, size_t datasize, size_t romsize, hwaddr addr); int rom_load_all(void); @@ -70,7 +71,7 @@ void do_info_roms(Monitor *mon, const QDict *qdict); #define rom_add_file_fixed(_f, _a, _i) \ rom_add_file(_f, NULL, _a, _i, false) #define rom_add_blob_fixed(_f, _b, _l, _a) \ - rom_add_blob(_f, _b, _l, _a, NULL, NULL, NULL) + rom_add_blob(_f, _b, _l, _a, NULL, NULL, NULL, false) #define PC_ROM_MIN_VGA 0xc0000 #define PC_ROM_MIN_OPTION 0xc8000