From: Luiz Capitulino <lcapitulino@redhat.com>
To: Alon Levy <alevy@redhat.com>
Cc: pbonzini@redhat.com, aliguori@us.ibm.com, quintela@redhat.com,
qemu-devel@nongnu.org, jan.kiszka@siemens.com
Subject: Re: [Qemu-devel] [PATCH 4/4] qapi: Convert migrate
Date: Mon, 12 Mar 2012 11:34:21 -0300 [thread overview]
Message-ID: <20120312113421.7438bb82@doriath.home> (raw)
In-Reply-To: <20120312142301.GN6256@garlic>
On Mon, 12 Mar 2012 16:23:01 +0200
Alon Levy <alevy@redhat.com> wrote:
> On Mon, Mar 12, 2012 at 11:01:54AM -0300, Luiz Capitulino wrote:
> > On Mon, 12 Mar 2012 15:49:27 +0200
> > Alon Levy <alevy@redhat.com> wrote:
> >
> > > On Mon, Mar 12, 2012 at 10:21:20AM -0300, Luiz Capitulino wrote:
> > > > On Sat, 10 Mar 2012 00:51:29 +0200
> > > > Alon Levy <alevy@redhat.com> wrote:
> > > >
> > > > > On Fri, Mar 09, 2012 at 03:13:06PM -0300, 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 is 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 <aliguori@us.ibm.com>
> > > > > > Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
> > > > > > ---
> > > > > > hmp-commands.hx | 3 +--
> > > > > > hmp.c | 56 +++++++++++++++++++++++++++++++++++++++++++++
> > > > > > 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, 105 insertions(+), 71 deletions(-)
> > > > > >
> > > > > > diff --git a/hmp-commands.hx b/hmp-commands.hx
> > > > > > index ed88877..a86f53f 100644
> > > > > > --- a/hmp-commands.hx
> > > > > > +++ b/hmp-commands.hx
> > > > > > @@ -806,8 +806,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 3a54455..0f62b3f 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)
> > > > > > @@ -856,3 +857,58 @@ 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);
> > > > > > + } else {
> > > > > > + monitor_resume(status->mon);
> > > > > > + qemu_del_timer(status->timer);
> > > > > > + g_free(status);
> > > > > > + }
> > > > > > +
> > > > > > + 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;
> > > > > > +
> > > > > > + if (monitor_suspend(mon) < 0) {
> > > > >
> > > > > So using monitor_suspend is ok? is that a possible solution for the
> > > > > screendump issue? I could pass the Monitor through the vga callback. Tbh
> > > > > I think it's ugly, but at least it doesn't introduce any new command.
> > > >
> > > > This is only valid for HMP.
> > > >
> > >
> > > Yes, I'm thinking at this point for qmp to wait for the output file to
> > > be written via repeated poll / inotify.
> >
> > Making this synchronous you mean? This will hold the global mutex for too
> > long, won't it?
>
> No, not at all what I mean. I'm talking about a libvirt change.
Oh, good idea, that's a valid workaround.
> There is
> nothing that we can do in qemu other than maybe implementing a
> qmp_suspend (automatic nack), already suggested screendump-async (nack
> by no update) and now waiting for comments on just the HMP fix for
> screendump.
Will review it shortly.
next prev parent reply other threads:[~2012-03-12 14:56 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-03-09 18:13 [Qemu-devel] [PATCH v2 0/4] qapi: Convert migrate Luiz Capitulino
2012-03-09 18:13 ` [Qemu-devel] [PATCH 1/4] QError: Introduce new errors for the migration command Luiz Capitulino
2012-03-09 18:13 ` [Qemu-devel] [PATCH 2/4] Error: Introduce error_copy() Luiz Capitulino
2012-03-09 18:13 ` [Qemu-devel] [PATCH 3/4] Purge migration of (almost) everything to do with monitors Luiz Capitulino
2012-03-09 18:20 ` Jan Kiszka
2012-03-09 18:30 ` Luiz Capitulino
2012-03-09 19:05 ` Jan Kiszka
2012-03-09 19:12 ` Anthony Liguori
2012-03-09 19:48 ` Luiz Capitulino
2012-03-09 19:57 ` Luiz Capitulino
2012-03-12 14:51 ` Kevin Wolf
2012-03-12 15:01 ` Luiz Capitulino
2012-03-09 18:31 ` Anthony Liguori
2012-03-09 18:45 ` Eric Blake
2012-03-09 18:53 ` Anthony Liguori
2012-03-09 19:42 ` Eric Blake
2012-03-09 19:48 ` Eric Blake
2012-03-09 18:59 ` Jan Kiszka
2012-03-09 18:13 ` [Qemu-devel] [PATCH 4/4] qapi: Convert migrate Luiz Capitulino
2012-03-09 18:26 ` Eric Blake
2012-03-09 18:33 ` Luiz Capitulino
2012-03-09 18:35 ` Anthony Liguori
2012-03-09 18:37 ` Luiz Capitulino
2012-03-09 22:51 ` Alon Levy
2012-03-12 13:21 ` Luiz Capitulino
2012-03-12 13:49 ` Alon Levy
2012-03-12 14:01 ` Luiz Capitulino
2012-03-12 14:23 ` Alon Levy
2012-03-12 14:34 ` Luiz Capitulino [this message]
-- strict thread matches above, loose matches on Subject: below --
2012-03-12 19:58 [Qemu-devel] [PATCH v3 0/4] " Luiz Capitulino
2012-03-12 19:59 ` [Qemu-devel] [PATCH 4/4] " Luiz Capitulino
2012-03-16 19:26 [Qemu-devel] [PULL 0/4]: QMP queue Luiz Capitulino
2012-03-16 19:26 ` [Qemu-devel] [PATCH 4/4] qapi: Convert migrate Luiz Capitulino
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20120312113421.7438bb82@doriath.home \
--to=lcapitulino@redhat.com \
--cc=alevy@redhat.com \
--cc=aliguori@us.ibm.com \
--cc=jan.kiszka@siemens.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=quintela@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).