[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH 6/6] qapi: Convert migrate
From: |
Jan Kiszka |
Subject: |
Re: [Qemu-devel] [PATCH 6/6] qapi: Convert migrate |
Date: |
Wed, 15 Feb 2012 14:31:04 +0100 |
User-agent: |
Mozilla/5.0 (X11; U; Linux i686 (x86_64); de; rv:1.8.1.12) Gecko/20080226 SUSE/2.0.0.12-1.1 Thunderbird/2.0.0.12 Mnenhy/0.7.5.666 |
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 <address@hidden>
> Signed-off-by: Luiz Capitulino <address@hidden>
> ---
> 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
[Qemu-devel] [PATCH 6/6] qapi: Convert migrate, Luiz Capitulino, 2012/02/10
Re: [Qemu-devel] [PATCH 6/6] qapi: Convert migrate,
Jan Kiszka <=
Re: [Qemu-devel] [PATCH 0/6] qapi: Convert migrate, Jan Kiszka, 2012/02/15
- Re: [Qemu-devel] [PATCH 0/6] qapi: Convert migrate, Luiz Capitulino, 2012/02/15
- Re: [Qemu-devel] [PATCH 0/6] qapi: Convert migrate, Jan Kiszka, 2012/02/15
- Re: [Qemu-devel] [PATCH 0/6] qapi: Convert migrate, Luiz Capitulino, 2012/02/15
- Re: [Qemu-devel] [PATCH 0/6] qapi: Convert migrate, Jan Kiszka, 2012/02/15
- Re: [Qemu-devel] [PATCH 0/6] qapi: Convert migrate, Luiz Capitulino, 2012/02/15
- Re: [Qemu-devel] [PATCH 0/6] qapi: Convert migrate, Jan Kiszka, 2012/02/15