qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH 1/2] vl: Fix to create accel compat props before


From: Markus Armbruster
Subject: Re: [Qemu-devel] [PATCH 1/2] vl: Fix to create accel compat props before migration object again
Date: Fri, 29 Mar 2019 18:55:28 +0100
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/26.1 (gnu/linux)

Igor Mammedov <address@hidden> writes:

> On Fri, 29 Mar 2019 15:34:59 +0100
> Markus Armbruster <address@hidden> wrote:
>
>> Igor Mammedov <address@hidden> writes:
>> 
>> > On Wed, 27 Mar 2019 16:03:46 +0100
>> > Markus Armbruster <address@hidden> wrote:
>> >  
>> >> Recent commit cda4aa9a5a0 moved block backend creation before machine
>> >> property evaluation.  This broke block backends registering migration
>> >> blockers.  Commit e60483f2f84 fixed it by moving migration object
>> >> creation before block backend creation.  This broke migration with
>> >> Xen.  Turns out we need to configure the accelerator before we create
>> >> the migration object so that Xen's accelerator compat properties get
>> >> applied.  Fix by calling configure_accelerator() earlier, right before
>> >> migration_object_init().
>> >> 
>> >> Fixes: e60483f2f8498ae08ae79ca4c6fb03a3317f5e1e
>> >> Reported-by: Anthony PERARD <address@hidden>
>> >> Signed-off-by: Markus Armbruster <address@hidden>
>> >> ---
>> >>  vl.c | 8 ++++++--
>> >>  1 file changed, 6 insertions(+), 2 deletions(-)
>> >> 
>> >> diff --git a/vl.c b/vl.c
>> >> index d61d5604e5..28b9e9a170 100644
>> >> --- a/vl.c
>> >> +++ b/vl.c
>> >> @@ -4276,6 +4276,12 @@ int main(int argc, char **argv, char **envp)
>> >>          exit(0);
>> >>      }
>> >>  
>> >> +    /*
>> >> +     * Must run before migration_object_init() to make Xen's
>> >> +     * accelerator compat properties stick
>> >> +     */
>> >> +    configure_accelerator(current_machine, argv[0]);
>> >> +  
>> > Setting machine properties with this change happens after
>> > accelerator was initialized.
>> >
>> > It probably will break initialization of accelerator features
>> > (to name a couple kernel-irqchip, memory-encryption) that depend
>> > on machine properties being set before accelerator is initialized.  
>> 
>> I'm blind.  Can you suggest a potential reproducer for me to try?
> sure (it' difficult to move things around in vl.c and spot implicit
> dependency or not to break something while at it)
>
>
> diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c
> index 241db49..9b0d89a 100644
> --- a/accel/kvm/kvm-all.c
> +++ b/accel/kvm/kvm-all.c
> @@ -1724,6 +1724,7 @@ static int kvm_init(MachineState *ms)
>      }
>  
>      if (machine_kernel_irqchip_allowed(ms)) {
> +fprintf(stderr, "kvm_irqchip_create\n");
>          kvm_irqchip_create(ms, s);
>      }
>
> with:
>
> qemu-system-x86_64 -machine accel=kvm,kernel-irqchip=off
>
> prints "kvm_irqchip_create" after patch and doesn't with current master

Now I see.  Thank you!

machine_kernel_irqchip_allowed(m) returns m->kernel_irqchip_allowed.
machine_initfn() sets the default value, true.  -machine
kernel-irqchip=off sets it to false.

To make the latter stick, kvm_init() must run after
machine_set_property().

kvm_init() is AccelClass method init_machine(), called by
configure_accelerator() via accel_init_machine().

We have a depencency cycle:

    configure_accelerator()
    before migration_object_init()
        to make Xen's accel compat props stick
    before configure_blockdev()
        so we can create migration blockers
    before machine_set_property()
        so machine props can refer to blockdevs
    before configure_accelerator()
        to make -machine kvm-irqchip=off and similar stick

To break it, we need to split one of them.

I've long had a queasy feeling about configure_accelerator().  It needs
to run early so accelerator properties work, and it needs to run late so
it can use machine properties.

Can we split it into

    part 1: runs early, can fail, can't use machine properties
    part 2: runs late, can't fail, can use machine properties

?

If we can't, or can't for 4.0, then I guess we need to split
migration_object_init() along similar lines:

    part 1: runs early, makes migration blockers usable,
            can't use migration properties
    part 2: runs late, can use migration properties

>> >>      /*
>> >>       * Migration object can only be created after global properties
>> >>       * are applied correctly.
>> >> @@ -4297,8 +4303,6 @@ int main(int argc, char **argv, char **envp)
>> >>      current_machine->maxram_size = maxram_size;
>> >>      current_machine->ram_slots = ram_slots;
>> >>  
>> >> -    configure_accelerator(current_machine, argv[0]);
>> >> -
>> >>      if (!qtest_enabled() && machine_class->deprecation_reason) {
>> >>          error_report("Machine type '%s' is deprecated: %s",
>> >>                       machine_class->name, 
>> >> machine_class->deprecation_reason);  



reply via email to

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