qemu-devel
[Top][All Lists]
Advanced

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

Re: [PATCH] runstate: ignore finishmigrate -> prelaunch transition


From: Dr. David Alan Gilbert
Subject: Re: [PATCH] runstate: ignore finishmigrate -> prelaunch transition
Date: Fri, 6 Dec 2019 19:52:30 +0000
User-agent: Mutt/1.12.1 (2019-06-15)

* Laurent Vivier (address@hidden) wrote:
> Commit 1bd71dce4bf2 tries to prevent a finishmigrate -> prelaunch
> transition by exiting at the beginning of the main_loop_should_exit()
> function if the state is already finishmigrate.
> 
> As the finishmigrate state is set in the migration thread it can
> happen concurrently to the function. The migration thread and the
> function are normally protected by the iothread mutex and thus the
> state should no evolve between the start of the function and its end.
> 
> Unfortunately during the function life the lock is released by
> pause_all_vcpus() just before the point we need to be sure we are
> not in finishmigrate state and if the migration thread is waiting
> for the lock it will take the opportunity to change the state
> to finishmigrate.

Ewww.
I hate those short wakeups for pause_all_vcpus; I'm sure there are loads
more corners that break.

Still, I _think_ this is an improvement, so:

Reviewed-by: Dr. David Alan Gilbert <address@hidden>

> The only way to be sure we are not in the finishmigrate state when
> we need is to check the state after the pause_all_vcpus() function.
> 
> Fixes: 1bd71dce4bf2 ("runstate: ignore exit request in finish migrate state")
> Signed-off-by: Laurent Vivier <address@hidden>
> ---
>  vl.c | 10 ++++++----
>  1 file changed, 6 insertions(+), 4 deletions(-)
> 
> diff --git a/vl.c b/vl.c
> index 6a65a64bfd64..bf0a6345d239 100644
> --- a/vl.c
> +++ b/vl.c
> @@ -1745,9 +1745,6 @@ static bool main_loop_should_exit(void)
>      RunState r;
>      ShutdownCause request;
>  
> -    if (runstate_check(RUN_STATE_FINISH_MIGRATE)) {
> -        return false;
> -    }
>      if (preconfig_exit_requested) {
>          if (runstate_check(RUN_STATE_PRECONFIG)) {
>              runstate_set(RUN_STATE_PRELAUNCH);
> @@ -1776,8 +1773,13 @@ static bool main_loop_should_exit(void)
>          pause_all_vcpus();
>          qemu_system_reset(request);
>          resume_all_vcpus();
> +        /*
> +         * runstate can change in pause_all_vcpus()
> +         * as iothread mutex is unlocked
> +         */
>          if (!runstate_check(RUN_STATE_RUNNING) &&
> -                !runstate_check(RUN_STATE_INMIGRATE)) {
> +                !runstate_check(RUN_STATE_INMIGRATE) &&
> +                !runstate_check(RUN_STATE_FINISH_MIGRATE)) {
>              runstate_set(RUN_STATE_PRELAUNCH);
>          }
>      }
> -- 
> 2.23.0
> 
--
Dr. David Alan Gilbert / address@hidden / Manchester, UK




reply via email to

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