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 <aligu...@us.ibm.com> >> Signed-off-by: Luiz Capitulino <lcapitul...@redhat.com> >> --- >> 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