qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH v2] pc/fwcfg: unbreak migration from qemu-2.5 an


From: Laszlo Ersek
Subject: Re: [Qemu-devel] [PATCH v2] pc/fwcfg: unbreak migration from qemu-2.5 and qemu-2.6 during firmware boot
Date: Tue, 25 Apr 2017 17:01:21 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.8.0

On 04/24/17 22:45, Igor Mammedov wrote:
> Since 2.7 commit (b2a575a Add optionrom compatible with fw_cfg DMA version)
> regressed migration during firmware exection time by
> abusing fwcfg.dma_enabled property to decide loading
> dma version of option rom AND by mistake disabling DMA
> for 2.6 and earlier globally instead of only for option rom.
> 
> so 2.6 machine type guest is broken when it already runs
> firmware in DMA mode but migrated to qemu-2.7(pc-2.6)
> at that time;
> 
> a) qemu-2.6:pc2.6 (fwcfg.dma=on,firmware=dma,oprom=mmio)
> b) qemu-2.7:pc2.6 (fwcfg.dma=off,firmware=mmio,oprom=mmio)
> 
>   to:   a     b
> from
> a       OK   FAIL
> b       OK   OK
> 
> So we currently have broken forward migration from
> qemu-2.6 to qemu-2.[789] that however could be fixed
> for 2.10 by re-enabling DMA for 2.[56] machine types
> and allowing dma capable option rom only since 2.7.
> As result qemu should end up with:
> 
> c) qemu-2.10:pc2.6 (fwcfg.dma=on,firmware=dma,oprom=mmio)
> 
>    to:  a     b    c
> from
> a      OK   FAIL  OK
> b      OK   OK    OK
> c      OK   FAIL  OK
> 
> where forward migration from qemu-2.6 to qemu-2.10 should
> work again leaving only qemu-2.[789]:pc-2.6 broken.
> 
> Patch should also help downstream to maintain migration
> the way it used to be since dma cable option rom
> is managed by new
> 
> Signed-off-by: Igor Mammedov <address@hidden>
> ---
> v2:
>   (Eduardo Habkost <address@hidden>)
>     * s/linuxboot_dma_disabled/linuxboot_dma_enabled/
>     * add comment to linuxboot_dma_enabled field
> ---
>  hw/i386/pc.c         | 9 ++++-----
>  hw/i386/pc_piix.c    | 1 +
>  hw/i386/pc_q35.c     | 1 +
>  include/hw/i386/pc.h | 7 +++----
>  4 files changed, 9 insertions(+), 9 deletions(-)

Two suggestions for the commit message:

- The last paragraph contains a typo (s/cable/capable/), plus it
generally looks unfinished. Please clean up that paragraph, or drop it.

- Since this is PC and on PC we use IO port mapped fw_cfg in the absence
of DMA (and not MMIO mapped fw_cfg), I suggest to replace all
occurrences of "mmio" with "ioport" in the commit message. Not
"critical" of course, just a bit more precise IMO.

With those (or without, as you see fit):

Reviewed-by: Laszlo Ersek <address@hidden>

In addition, if you and Eduardo agree, I would like to record that I too
worked quite a bit on the original bug analysis, so please consider adding:

Reported-by: Eduardo Habkost <address@hidden>
Analyzed-by: Laszlo Ersek <address@hidden>

Thank you very much for the patch.
Laszlo

> 
> diff --git a/hw/i386/pc.c b/hw/i386/pc.c
> index f3b372a18f..8063241140 100644
> --- a/hw/i386/pc.c
> +++ b/hw/i386/pc.c
> @@ -1047,12 +1047,10 @@ static void load_linux(PCMachineState *pcms,
>      fw_cfg_add_i32(fw_cfg, FW_CFG_SETUP_SIZE, setup_size);
>      fw_cfg_add_bytes(fw_cfg, FW_CFG_SETUP_DATA, setup, setup_size);
>  
> -    if (fw_cfg_dma_enabled(fw_cfg)) {
> +    option_rom[nb_option_roms].bootindex = 0;
> +    option_rom[nb_option_roms].name = "linuxboot.bin";
> +    if (pcmc->linuxboot_dma_enabled && fw_cfg_dma_enabled(fw_cfg)) {
>          option_rom[nb_option_roms].name = "linuxboot_dma.bin";
> -        option_rom[nb_option_roms].bootindex = 0;
> -    } else {
> -        option_rom[nb_option_roms].name = "linuxboot.bin";
> -        option_rom[nb_option_roms].bootindex = 0;
>      }
>      nb_option_roms++;
>  }
> @@ -2321,6 +2319,7 @@ static void pc_machine_class_init(ObjectClass *oc, void 
> *data)
>       * to be used at the moment, 32K should be enough for a while.  */
>      pcmc->acpi_data_size = 0x20000 + 0x8000;
>      pcmc->save_tsc_khz = true;
> +    pcmc->linuxboot_dma_enabled = true;
>      mc->get_hotplug_handler = pc_get_hotpug_handler;
>      mc->cpu_index_to_socket_id = pc_cpu_index_to_socket_id;
>      mc->possible_cpu_arch_ids = pc_possible_cpu_arch_ids;
> diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
> index 9f102aa388..a11190be46 100644
> --- a/hw/i386/pc_piix.c
> +++ b/hw/i386/pc_piix.c
> @@ -474,6 +474,7 @@ static void pc_i440fx_2_6_machine_options(MachineClass *m)
>      PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
>      pc_i440fx_2_7_machine_options(m);
>      pcmc->legacy_cpu_hotplug = true;
> +    pcmc->linuxboot_dma_enabled = false;
>      SET_MACHINE_COMPAT(m, PC_COMPAT_2_6);
>  }
>  
> diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c
> index dd792a8547..0a61a2070c 100644
> --- a/hw/i386/pc_q35.c
> +++ b/hw/i386/pc_q35.c
> @@ -335,6 +335,7 @@ static void pc_q35_2_6_machine_options(MachineClass *m)
>      PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
>      pc_q35_2_7_machine_options(m);
>      pcmc->legacy_cpu_hotplug = true;
> +    pcmc->linuxboot_dma_enabled = false;
>      SET_MACHINE_COMPAT(m, PC_COMPAT_2_6);
>  }
>  
> diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
> index f278b3ae89..a57c607a8c 100644
> --- a/include/hw/i386/pc.h
> +++ b/include/hw/i386/pc.h
> @@ -151,6 +151,9 @@ struct PCMachineClass {
>      bool save_tsc_khz;
>      /* generate legacy CPU hotplug AML */
>      bool legacy_cpu_hotplug;
> +
> +    /* use DMA capable linuxboot option rom */
> +    bool linuxboot_dma_enabled;
>  };
>  
>  #define TYPE_PC_MACHINE "generic-pc-machine"
> @@ -432,10 +435,6 @@ bool e820_get_entry(int, uint32_t, uint64_t *, uint64_t 
> *);
>  #define PC_COMPAT_2_6 \
>      HW_COMPAT_2_6 \
>      {\
> -        .driver   = "fw_cfg_io",\
> -        .property = "dma_enabled",\
> -        .value    = "off",\
> -    },{\
>          .driver   = TYPE_X86_CPU,\
>          .property = "cpuid-0xb",\
>          .value    = "off",\
> 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]