diff options
| author | Peter Maydell <peter.maydell@linaro.org> | 2016-05-26 16:09:26 +0100 |
|---|---|---|
| committer | Peter Maydell <peter.maydell@linaro.org> | 2016-05-26 16:09:27 +0100 |
| commit | aef11b8d33ff9018b20ae29d87b1d674ed23dab9 (patch) | |
| tree | dc8839951876a7063facf6cce77c839ff1fc434a /migration/exec.c | |
| parent | 2c56d06bafd8933d2a9c6e0aeb5d45f7c1fb5616 (diff) | |
| parent | 12992c16d9afd8a23a94a84ad532a1adedf9e511 (diff) | |
| download | focaccia-qemu-aef11b8d33ff9018b20ae29d87b1d674ed23dab9.tar.gz focaccia-qemu-aef11b8d33ff9018b20ae29d87b1d674ed23dab9.zip | |
Merge remote-tracking branch 'remotes/amit-migration/tags/migration-2.7-2' into staging
migration: add TLS support to the migration data channel This is a big refactoring of the migration backend code - moving away from QEMUFile to the new QIOChannel framework introduced here. This brings a good level of abstraction and reduction of many lines of code. This series also adds the ability for many backends (all except RDMA) to use TLS for encrypting the migration data between the endpoints. # gpg: Signature made Thu 26 May 2016 07:07:08 BST using RSA key ID 657EF670 # gpg: Good signature from "Amit Shah <amit@amitshah.net>" # gpg: aka "Amit Shah <amit@kernel.org>" # gpg: aka "Amit Shah <amitshah@gmx.net>" * remotes/amit-migration/tags/migration-2.7-2: (28 commits) migration: remove qemu_get_fd method from QEMUFile migration: remove support for non-iovec based write handlers migration: add support for encrypting data with TLS migration: define 'tls-creds' and 'tls-hostname' migration parameters migration: don't use an array for storing migrate parameters migration: move definition of struct QEMUFile back into qemu-file.c migration: delete QEMUFile stdio implementation migration: delete QEMUFile sockets implementation migration: delete QEMUSizedBuffer struct migration: delete QEMUFile buffer implementation migration: convert savevm to use QIOChannel for writing to files migration: convert RDMA to use QIOChannel interface migration: convert exec socket protocol to use QIOChannel migration: convert fd socket protocol to use QIOChannel migration: convert tcp socket protocol to use QIOChannel migration: rename unix.c to socket.c migration: convert unix socket protocol to use QIOChannel migration: convert post-copy to use QIOChannelBuffer migration: add reporting of errors for outgoing migration migration: add helpers for creating QEMUFile from a QIOChannel ... Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Diffstat (limited to 'migration/exec.c')
| -rw-r--r-- | migration/exec.c | 62 |
1 files changed, 32 insertions, 30 deletions
diff --git a/migration/exec.c b/migration/exec.c index 559420969b..1515cc3319 100644 --- a/migration/exec.c +++ b/migration/exec.c @@ -3,10 +3,12 @@ * * Copyright IBM, Corp. 2008 * Copyright Dell MessageOne 2008 + * Copyright Red Hat, Inc. 2015-2016 * * Authors: * Anthony Liguori <aliguori@us.ibm.com> * Charles Duffy <charles_duffy@messageone.com> + * Daniel P. Berrange <berrange@redhat.com> * * This work is licensed under the terms of the GNU GPL, version 2. See * the COPYING file in the top-level directory. @@ -18,53 +20,53 @@ #include "qemu/osdep.h" #include "qapi/error.h" #include "qemu-common.h" -#include "qemu/sockets.h" -#include "qemu/main-loop.h" #include "migration/migration.h" -#include "migration/qemu-file.h" -#include "block/block.h" -#include <sys/wait.h> +#include "io/channel-command.h" +#include "trace.h" -//#define DEBUG_MIGRATION_EXEC - -#ifdef DEBUG_MIGRATION_EXEC -#define DPRINTF(fmt, ...) \ - do { printf("migration-exec: " fmt, ## __VA_ARGS__); } while (0) -#else -#define DPRINTF(fmt, ...) \ - do { } while (0) -#endif void exec_start_outgoing_migration(MigrationState *s, const char *command, Error **errp) { - s->to_dst_file = qemu_popen_cmd(command, "w"); - if (s->to_dst_file == NULL) { - error_setg_errno(errp, errno, "failed to popen the migration target"); + QIOChannel *ioc; + const char *argv[] = { "/bin/sh", "-c", command, NULL }; + + trace_migration_exec_outgoing(command); + ioc = QIO_CHANNEL(qio_channel_command_new_spawn(argv, + O_WRONLY, + errp)); + if (!ioc) { return; } - migrate_fd_connect(s); + migration_set_outgoing_channel(s, ioc, NULL); + object_unref(OBJECT(ioc)); } -static void exec_accept_incoming_migration(void *opaque) +static gboolean exec_accept_incoming_migration(QIOChannel *ioc, + GIOCondition condition, + gpointer opaque) { - QEMUFile *f = opaque; - - qemu_set_fd_handler(qemu_get_fd(f), NULL, NULL, NULL); - process_incoming_migration(f); + migration_set_incoming_channel(migrate_get_current(), ioc); + object_unref(OBJECT(ioc)); + return FALSE; /* unregister */ } void exec_start_incoming_migration(const char *command, Error **errp) { - QEMUFile *f; + QIOChannel *ioc; + const char *argv[] = { "/bin/sh", "-c", command, NULL }; - DPRINTF("Attempting to start an incoming migration\n"); - f = qemu_popen_cmd(command, "r"); - if(f == NULL) { - error_setg_errno(errp, errno, "failed to popen the migration source"); + trace_migration_exec_incoming(command); + ioc = QIO_CHANNEL(qio_channel_command_new_spawn(argv, + O_RDONLY, + errp)); + if (!ioc) { return; } - qemu_set_fd_handler(qemu_get_fd(f), exec_accept_incoming_migration, NULL, - f); + qio_channel_add_watch(ioc, + G_IO_IN, + exec_accept_incoming_migration, + NULL, + NULL); } |