qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH 06/30] migration: stop all cpus correctly


From: Paolo Bonzini
Subject: Re: [Qemu-devel] [PATCH 06/30] migration: stop all cpus correctly
Date: Mon, 12 Nov 2012 12:44:35 +0100
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20121016 Thunderbird/16.0.1

Il 18/10/2012 09:30, Juan Quintela ha scritto:
> You can only stop all cpus from the iothread or an vcpu.  As we want
> to do it from the migration_thread, we need to do this dance with the
> botton handlers.
> 
> This patch is a request for ideas.  I can move this function to cpus.c, but
> wondered if there is an easy way of doing this?

The commit message here is stale (I think I had pointed this out
already).  Also, first_time should be a member of MigrationState,
initialized in migrate_fd_connect.

Paolo

> Signed-off-by: Juan Quintela <address@hidden>
> ---
>  migration.c | 29 +++++++++++++++++------------
>  1 file changed, 17 insertions(+), 12 deletions(-)
> 
> diff --git a/migration.c b/migration.c
> index 02f4ffa..05ef1a3 100644
> --- a/migration.c
> +++ b/migration.c
> @@ -20,6 +20,7 @@
>  #include "sysemu.h"
>  #include "block.h"
>  #include "qemu_socket.h"
> +#include "qemu-thread.h"
>  #include "block-migration.h"
>  #include "qmp-commands.h"
> 
> @@ -322,11 +323,22 @@ ssize_t migrate_fd_put_buffer(MigrationState *s, const 
> void *data,
>  void migrate_fd_put_ready(MigrationState *s)
>  {
>      int ret;
> +    static bool first_time = true;
> 
>      if (s->state != MIG_STATE_ACTIVE) {
>          DPRINTF("put_ready returning because of non-active state\n");
>          return;
>      }
> +    if (first_time) {
> +        first_time = false;
> +        DPRINTF("beginning savevm\n");
> +        ret = qemu_savevm_state_begin(s->file, &s->params);
> +        if (ret < 0) {
> +            DPRINTF("failed, %d\n", ret);
> +            migrate_fd_error(s);
> +            return;
> +        }
> +    }
> 
>      DPRINTF("iterate\n");
>      ret = qemu_savevm_state_iterate(s->file);
> @@ -339,7 +351,11 @@ void migrate_fd_put_ready(MigrationState *s)
>          DPRINTF("done iterating\n");
>          start_time = qemu_get_clock_ms(rt_clock);
>          qemu_system_wakeup_request(QEMU_WAKEUP_REASON_OTHER);
> -        vm_stop_force_state(RUN_STATE_FINISH_MIGRATE);
> +        if (old_vm_running) {
> +            vm_stop(RUN_STATE_FINISH_MIGRATE);
> +        } else {
> +            vm_stop_force_state(RUN_STATE_FINISH_MIGRATE);
> +        }
> 
>          if (qemu_savevm_state_complete(s->file) < 0) {
>              migrate_fd_error(s);
> @@ -428,19 +444,8 @@ bool migration_has_failed(MigrationState *s)
> 
>  void migrate_fd_connect(MigrationState *s)
>  {
> -    int ret;
> -
>      s->state = MIG_STATE_ACTIVE;
>      qemu_fopen_ops_buffered(s);
> -
> -    DPRINTF("beginning savevm\n");
> -    ret = qemu_savevm_state_begin(s->file, &s->params);
> -    if (ret < 0) {
> -        DPRINTF("failed, %d\n", ret);
> -        migrate_fd_error(s);
> -        return;
> -    }
> -    migrate_fd_put_ready(s);
>  }
> 
>  static MigrationState *migrate_init(const MigrationParams *params)
> 




reply via email to

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