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 <[EMAIL PROTECTED]>
> 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 :| -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html