All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Daniel P. Berrange" <berrange@redhat.com>
To: Chris Lalancette <clalance@redhat.com>
Cc: kvm-devel <kvm@vger.kernel.org>
Subject: Re: [PATCH]: Add a "migrate_incoming" monitor option
Date: Thu, 31 Jul 2008 16:11:49 +0100	[thread overview]
Message-ID: <20080731151149.GH18548@redhat.com> (raw)
In-Reply-To: <4891D14B.9010304@redhat.com>

On Thu, Jul 31, 2008 at 04:50:51PM +0200, Chris Lalancette wrote:
> We've been trying to plumb libvirt to do KVM migration.  One of the stumbling
> blocks we are running into, however, is that libvirt expects to be able to use
> the Qemu monitor both before and after migration has taken place, on both the
> source and destination nodes.  After migration has taken place is no problem; we
> return to the main qemu select() loop, and we can run monitor commands.
> However, before migration, on the destination side, when we start qemu with a
> command-line like:
> 
> qemu-kvm -M pc -S blah blah -incoming tcp://0:4444
> 
> we can't run any monitor commands since the migration code is synchronously
> waiting for an incoming tcp connection.  To get around this, the following patch
> adds a new monitor command called "migrate_incoming"; it takes all of the same
> parameters as the command-line option, but just starts it later.  To make sure
> it is safe, you actually have to start with "-incoming monitor"; if you run it
> without that, it will just spit an error at you.  So with this in place, libvirt
> can do the equivalent of:
> 
> qemu-kvm -M pc -S blah blah -incoming monitor
> (qemu) info cpus
> ...other commands
> (qemu) migrate_incoming tcp://0:4444
> ...wait for migration to start, and then complete
> (qemu) info block
> ...etc.
> 
> Signed-off-by: Chris Lalancette <clalance@redhat.com>

> diff --git a/qemu/monitor.c b/qemu/monitor.c
> index 20dcca6..c11b82c 100644
> --- a/qemu/monitor.c
> +++ b/qemu/monitor.c
> @@ -504,6 +504,25 @@ static void do_cont(void)
>      vm_start();
>  }
>  
> +static void do_migrate_incoming(const char *incom)
> +{
> +    extern int incoming_monitor;
> +
> +    if (!incoming_monitor) {
> +        term_printf("FAIL: Can only use the migrate-incoming command with -incoming monitor\n");
> +    }
> +    else {
> +        int rc;
> +
> +        rc = migrate_incoming(incom);

You probably want to set  'incoming_monitor = 0' here, to protect against
someone accidentially running it multiple times.

> +	if (rc != 0) {
> +            fprintf(stderr, "Migration failed rc=%d\n", rc);
> +            exit(rc);
> +	}

And some whitespace issues here..

> +        vm_start();
> +    }
> +}
> +
>  #ifdef CONFIG_GDBSTUB
>  static void do_gdbserver(const char *port)
>  {
> @@ -1486,6 +1505,7 @@ static term_cmd_t term_cmds[] = {
>        "", "cancel the current VM migration" },
>      { "migrate_set_speed", "s", do_migrate_set_speed,
>        "value", "set maximum speed (in bytes) for migrations" },
> +    { "migrate_incoming", "s", do_migrate_incoming, "incom", "incoming string" },
>      { "cpu_set", "is", do_cpu_set_nr, "cpu [online|offline]", "change cpu state" },
>  #if defined(TARGET_I386) || defined(TARGET_X86_64)
>      { "drive_add", "iss", drive_hot_add, "pcibus pcidevfn [file=file][,if=type][,bus=n]\n"
> diff --git a/qemu/vl.c b/qemu/vl.c
> index e1762ee..9b5f113 100644
> --- a/qemu/vl.c
> +++ b/qemu/vl.c
> @@ -229,6 +229,7 @@ int cursor_hide = 1;
>  int graphic_rotate = 0;
>  int daemonize = 0;
>  const char *incoming;
> +int incoming_monitor = 0;
>  const char *option_rom[MAX_OPTION_ROMS];
>  int nb_option_roms;
>  int semihosting_enabled = 0;
> @@ -9673,11 +9675,16 @@ int main(int argc, char **argv)
>      if (incoming) {
>          int rc;
>  
> -        rc = migrate_incoming(incoming);
> -        if (rc != 0) {
> -            fprintf(stderr, "Migration failed rc=%d\n", rc);
> -            exit(rc);
> -	}
> +        if (strncmp(incoming, "monitor", 7) == 0) {
> +            incoming_monitor = 1;
> +        }
> +        else {
> +            rc = migrate_incoming(incoming);
> +            if (rc != 0) {
> +                fprintf(stderr, "Migration failed rc=%d\n", rc);
> +                exit(rc);
> +            }
> +        }

Rather than putting the strncmp("monitor")  into vl.c, I'd just leave
this part as is.  Put the logic into the 'migrate_incoming()' method
so that it just sets the 'incoming_monitor' flag and then returns
immediately. That would allwo the 'incoming_Monitor' flag to be declared
static to the migrate.c file, instead of polluting vl.c

Daniel
-- 
|: Red Hat, Engineering, London   -o-   http://people.redhat.com/berrange/ :|
|: http://libvirt.org  -o-  http://virt-manager.org  -o-  http://ovirt.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505  -o-  F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|

  reply	other threads:[~2008-07-31 15:11 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-07-31 14:50 [PATCH]: Add a "migrate_incoming" monitor option Chris Lalancette
2008-07-31 15:11 ` Daniel P. Berrange [this message]
2008-08-01  9:09   ` Chris Lalancette
2008-07-31 17:27 ` Anthony Liguori
2008-08-01  8:42   ` Daniel P. Berrange
2008-08-01  9:04     ` Chris Lalancette

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=20080731151149.GH18548@redhat.com \
    --to=berrange@redhat.com \
    --cc=clalance@redhat.com \
    --cc=kvm@vger.kernel.org \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.