From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:40644) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TXsRb-0001Cb-Qi for qemu-devel@nongnu.org; Mon, 12 Nov 2012 06:44:50 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1TXsRY-0008Qr-Oc for qemu-devel@nongnu.org; Mon, 12 Nov 2012 06:44:47 -0500 Received: from mail-da0-f45.google.com ([209.85.210.45]:57200) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TXsRY-0008Qn-HH for qemu-devel@nongnu.org; Mon, 12 Nov 2012 06:44:44 -0500 Received: by mail-da0-f45.google.com with SMTP id n15so2620797dad.4 for ; Mon, 12 Nov 2012 03:44:43 -0800 (PST) Sender: Paolo Bonzini Message-ID: <50A0E123.4040406@redhat.com> Date: Mon, 12 Nov 2012 12:44:35 +0100 From: Paolo Bonzini MIME-Version: 1.0 References: <1350545426-23172-1-git-send-email-quintela@redhat.com> <1350545426-23172-7-git-send-email-quintela@redhat.com> In-Reply-To: <1350545426-23172-7-git-send-email-quintela@redhat.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH 06/30] migration: stop all cpus correctly List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Juan Quintela Cc: qemu-devel@nongnu.org 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 > --- > 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) >