From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:57050) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RxfAH-0002hx-MJ for qemu-devel@nongnu.org; Wed, 15 Feb 2012 08:45:05 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1RxfAA-0004hj-Qw for qemu-devel@nongnu.org; Wed, 15 Feb 2012 08:44:57 -0500 Received: from david.siemens.de ([192.35.17.14]:34602) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RxfAA-0004hP-Fa for qemu-devel@nongnu.org; Wed, 15 Feb 2012 08:44:50 -0500 Message-ID: <4F3BB6CE.1000205@siemens.com> Date: Wed, 15 Feb 2012 14:44:46 +0100 From: Jan Kiszka MIME-Version: 1.0 References: <1328902266-25308-1-git-send-email-lcapitulino@redhat.com> <1328902266-25308-7-git-send-email-lcapitulino@redhat.com> <4F3BB398.3080200@siemens.com> In-Reply-To: <4F3BB398.3080200@siemens.com> Content-Type: text/plain; charset=ISO-8859-15 Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH 6/6] qapi: Convert migrate List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Luiz Capitulino Cc: aliguori@us.ibm.com, qemu-devel@nongnu.org, quintela@redhat.com On 2012-02-15 14:31, Jan Kiszka wrote: > On 2012-02-10 20:31, Luiz Capitulino wrote: >> The migrate command is one of those commands where HMP and QMP completely >> mix up together. This made the conversion to the QAPI (which separates the >> command into QMP and HMP parts) a bit difficult. >> >> The first important change to be noticed is that this commit completes the >> removal of the Monitor object from migration code, started by the previous >> commit. >> >> Another important and tricky change is about supporting the non-detached >> mode. That's, if the user doesn't pass '-d' the migrate command will lock >> the monitor and will only release it when migration is finished. >> >> To support that in the new HMP command (hmp_migrate()), it was necessary >> to create a timer which runs every second and checks if the migration is >> still active. If it's, the timer callback will re-schedule itself to run >> one second in the future. If the migration has already finished, the >> monitor lock is relased and the user can use it normally. >> >> All these changes should be transparent to the user. >> >> Signed-off-by: Anthony Liguori >> Signed-off-by: Luiz Capitulino >> --- >> hmp-commands.hx | 3 +- >> hmp.c | 51 +++++++++++++++++++++++++++++++++++++++++ >> hmp.h | 1 + >> migration-fd.c | 2 +- >> migration.c | 66 ++++++++++++++---------------------------------------- >> migration.h | 3 -- >> qapi-schema.json | 21 +++++++++++++++++ >> qmp-commands.hx | 9 +------ >> savevm.c | 13 +++++----- >> sysemu.h | 2 +- >> 10 files changed, 100 insertions(+), 71 deletions(-) >> >> diff --git a/hmp-commands.hx b/hmp-commands.hx >> index 573b823..10d3f1b 100644 >> --- a/hmp-commands.hx >> +++ b/hmp-commands.hx >> @@ -792,8 +792,7 @@ ETEXI >> " full copy of disk\n\t\t\t -i for migration without " >> "shared storage with incremental copy of disk " >> "(base image shared between src and destination)", >> - .user_print = monitor_user_noop, >> - .mhandler.cmd_new = do_migrate, >> + .mhandler.cmd = hmp_migrate, >> }, >> >> >> diff --git a/hmp.c b/hmp.c >> index 8ff8c94..70bd574 100644 >> --- a/hmp.c >> +++ b/hmp.c >> @@ -14,6 +14,7 @@ >> */ >> >> #include "hmp.h" >> +#include "qemu-timer.h" >> #include "qmp-commands.h" >> >> static void hmp_handle_error(Monitor *mon, Error **errp) >> @@ -851,3 +852,53 @@ void hmp_block_job_cancel(Monitor *mon, const QDict *qdict) >> >> hmp_handle_error(mon, &error); >> } >> + >> +typedef struct MigrationStatus >> +{ >> + QEMUTimer *timer; >> + Monitor *mon; >> +} MigrationStatus; >> + >> +static void hmp_migrate_status_cb(void *opaque) >> +{ >> + MigrationStatus *status = opaque; >> + MigrationInfo *info; >> + >> + info = qmp_query_migrate(NULL); >> + if (!info->has_status || strcmp(info->status, "active") == 0) { >> + qemu_mod_timer(status->timer, qemu_get_clock_ms(rt_clock) + 1000); >> + goto out; >> + } >> + >> + monitor_resume(status->mon); > > status->mon can be NULL if suspend is not supported, see below. > >> + qemu_del_timer(status->timer); >> + g_free(status); >> + >> +out: Ah, and "else" please, no need for goto here. Jan -- Siemens AG, Corporate Technology, CT T DE IT 1 Corporate Competence Center Embedded Linux