Skip to content
This repository has been archived by the owner on Apr 22, 2022. It is now read-only.

Commit

Permalink
Allow monitor interaction when using migrate -exec
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Chris Lalancette authored and Anthony Liguori committed May 27, 2009
1 parent c16b5a2 commit 8a43b1e
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 12 deletions.
1 change: 1 addition & 0 deletions hw/hw.h
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ QEMUFile *qemu_fopen(const char *filename, const char *mode);
QEMUFile *qemu_fopen_socket(int fd);
QEMUFile *qemu_popen(FILE *popen_file, const char *mode);
QEMUFile *qemu_popen_cmd(const char *command, const char *mode);
int qemu_popen_fd(QEMUFile *f);
void qemu_fflush(QEMUFile *f);
int qemu_fclose(QEMUFile *f);
void qemu_put_buffer(QEMUFile *f, const uint8_t *buf, int size);
Expand Down
33 changes: 22 additions & 11 deletions migration-exec.c
Original file line number Diff line number Diff line change
Expand Up @@ -104,17 +104,11 @@ MigrationState *exec_start_outgoing_migration(const char *command,
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) {
Expand All @@ -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;
}
12 changes: 11 additions & 1 deletion savevm.c
Original file line number Diff line number Diff line change
Expand Up @@ -244,7 +244,6 @@ QEMUFile *qemu_popen(FILE *popen_file, const char *mode)
} else {
s->file = qemu_fopen_ops(s, popen_put_buffer, NULL, popen_close, NULL, NULL);
}
fprintf(stderr, "qemu_popen: returning result of qemu_fopen_ops\n");
return s->file;
}

Expand All @@ -260,6 +259,17 @@ QEMUFile *qemu_popen_cmd(const char *command, const char *mode)
return qemu_popen(popen_file, mode);
}

int qemu_popen_fd(QEMUFile *f)
{
QEMUFilePopen *p;
int fd;

p = (QEMUFilePopen *)f->opaque;
fd = fileno(p->popen_file);

return fd;
}

QEMUFile *qemu_fopen_socket(int fd)
{
QEMUFileSocket *s = qemu_mallocz(sizeof(QEMUFileSocket));
Expand Down

0 comments on commit 8a43b1e

Please sign in to comment.