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: > + qapi_free_MigrationInfo(info); > +} > + > +void hmp_migrate(Monitor *mon, const QDict *qdict) > +{ > + int detach = qdict_get_try_bool(qdict, "detach", 0); > + int blk = qdict_get_try_bool(qdict, "blk", 0); > + int inc = qdict_get_try_bool(qdict, "inc", 0); > + const char *uri = qdict_get_str(qdict, "uri"); > + Error *err = NULL; > + > + qmp_migrate(uri, !!blk, blk, !!inc, inc, false, false, &err); > + if (err) { > + monitor_printf(mon, "migrate: %s\n", error_get_pretty(err)); > + error_free(err); > + return; > + } > + > + if (!detach) { > + MigrationStatus *status = g_malloc0(sizeof(*status)); > + status->timer = qemu_new_timer_ms(rt_clock, hmp_migrate_status_cb, > + status); > + status->mon = mon; > + monitor_suspend(mon); Lacks return code check and handling, see original version. > + qemu_mod_timer(status->timer, qemu_get_clock_ms(rt_clock)); > + } > +} Jan -- Siemens AG, Corporate Technology, CT T DE IT 1 Corporate Competence Center Embedded Linux