summaryrefslogtreecommitdiff
path: root/migration-exec.c
diff options
context:
space:
mode:
authorChris Lalancette <clalance@redhat.com>2009-05-25 16:38:23 +0200
committerAnthony Liguori <aliguori@us.ibm.com>2009-05-27 09:46:07 -0500
commit8a43b1ea7fd02a8e9a5c5ef58017b1bd059663bb (patch)
tree267c6df69d20628c38875715e1f8c97551b4834b /migration-exec.c
parentc16b5a2ca0b186de618654a576bdad9cdd2d1ab2 (diff)
downloadqemu-8a43b1ea7fd02a8e9a5c5ef58017b1bd059663bb.tar.gz
Allow monitor interaction when using migrate -exec
All, I've recently been playing around with migration via exec. Unfortunately, when starting the incoming qemu process with "-incoming exec:cmd", it suffers the same problem that -incoming tcp used to suffer; namely, that you can't interact with the monitor until after the migration has happened. This causes problems for libvirt usage of -incoming exec, since libvirt expects to be able to access the monitor ahead of time. This fairly simple patch allows you to access the monitor both before and after the migration has completed using exec. (note: developed/tested with qemu-kvm, but applies perfectly fine to qemu) Signed-off-by: Chris Lalancette <clalance@redhat.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
Diffstat (limited to 'migration-exec.c')
-rw-r--r--migration-exec.c33
1 files changed, 22 insertions, 11 deletions
diff --git a/migration-exec.c b/migration-exec.c
index f0869a1146..0dd5aff315 100644
--- a/migration-exec.c
+++ b/migration-exec.c
@@ -104,17 +104,11 @@ err_after_alloc:
return NULL;
}
-int exec_start_incoming_migration(const char *command)
+static void exec_accept_incoming_migration(void *opaque)
{
+ QEMUFile *f = opaque;
int ret;
- QEMUFile *f;
- dprintf("Attempting to start an incoming migration\n");
- f = qemu_popen_cmd(command, "r");
- if(f == NULL) {
- dprintf("Unable to apply qemu wrapper to popen file\n");
- return -errno;
- }
vm_stop(0); /* just in case */
ret = qemu_loadvm_state(f);
if (ret < 0) {
@@ -123,11 +117,28 @@ int exec_start_incoming_migration(const char *command)
}
qemu_announce_self();
dprintf("successfully loaded vm state\n");
+ /* we've successfully migrated, close the fd */
+ qemu_set_fd_handler2(qemu_popen_fd(f), NULL, NULL, NULL, NULL);
vm_start();
- qemu_fclose(f);
- return 0;
err:
qemu_fclose(f);
- return -errno;
+}
+
+int exec_start_incoming_migration(const char *command)
+{
+ QEMUFile *f;
+
+ dprintf("Attempting to start an incoming migration\n");
+ f = qemu_popen_cmd(command, "r");
+ if(f == NULL) {
+ dprintf("Unable to apply qemu wrapper to popen file\n");
+ return -errno;
+ }
+
+ qemu_set_fd_handler2(qemu_popen_fd(f), NULL,
+ exec_accept_incoming_migration, NULL,
+ (void *)(unsigned long)f);
+
+ return 0;
}