blob: deab4e378e0c8578c8de461481f18fff0a0aea92 [file] [log] [blame]
aliguori065e2812008-11-11 16:46:33 +00001/*
2 * QEMU live migration
3 *
4 * Copyright IBM, Corp. 2008
5 * Copyright Dell MessageOne 2008
6 *
7 * Authors:
8 * Anthony Liguori <aliguori@us.ibm.com>
9 * Charles Duffy <charles_duffy@messageone.com>
10 *
11 * This work is licensed under the terms of the GNU GPL, version 2. See
12 * the COPYING file in the top-level directory.
13 *
Paolo Bonzini6b620ca2012-01-13 17:44:23 +010014 * Contributions after 2012-01-13 are licensed under the terms of the
15 * GNU GPL, version 2 or (at your option) any later version.
aliguori065e2812008-11-11 16:46:33 +000016 */
17
18#include "qemu-common.h"
Paolo Bonzini1de7afc2012-12-17 18:20:00 +010019#include "qemu/sockets.h"
Paolo Bonzinicaf71f82012-12-17 18:19:50 +010020#include "migration/migration.h"
Juan Quintela557ec5a2012-10-03 14:07:31 +020021#include "migration/qemu-file.h"
Paolo Bonzini737e1502012-12-17 18:19:44 +010022#include "block/block.h"
Blue Swirl0ffbba32010-06-04 20:01:07 +000023#include <sys/types.h>
24#include <sys/wait.h>
aliguori065e2812008-11-11 16:46:33 +000025
26//#define DEBUG_MIGRATION_EXEC
27
28#ifdef DEBUG_MIGRATION_EXEC
malcd0f2c4c2010-02-07 02:03:50 +030029#define DPRINTF(fmt, ...) \
aliguori065e2812008-11-11 16:46:33 +000030 do { printf("migration-exec: " fmt, ## __VA_ARGS__); } while (0)
31#else
malcd0f2c4c2010-02-07 02:03:50 +030032#define DPRINTF(fmt, ...) \
aliguori065e2812008-11-11 16:46:33 +000033 do { } while (0)
34#endif
35
Paolo Bonzinif37afb52012-10-02 10:02:46 +020036void exec_start_outgoing_migration(MigrationState *s, const char *command, Error **errp)
aliguori065e2812008-11-11 16:46:33 +000037{
Paolo Bonzinib3523652013-02-22 17:36:47 +010038 s->file = qemu_popen_cmd(command, "w");
39 if (s->file == NULL) {
Paolo Bonzinif37afb52012-10-02 10:02:46 +020040 error_setg_errno(errp, errno, "failed to popen the migration target");
41 return;
aliguori065e2812008-11-11 16:46:33 +000042 }
43
aliguori065e2812008-11-11 16:46:33 +000044 migrate_fd_connect(s);
aliguori065e2812008-11-11 16:46:33 +000045}
46
Chris Lalancette8a43b1e2009-05-25 16:38:23 +020047static void exec_accept_incoming_migration(void *opaque)
aliguori065e2812008-11-11 16:46:33 +000048{
Chris Lalancette8a43b1e2009-05-25 16:38:23 +020049 QEMUFile *f = opaque;
aliguori065e2812008-11-11 16:46:33 +000050
Paolo Bonzinid263a202012-08-08 10:21:26 +020051 qemu_set_fd_handler2(qemu_get_fd(f), NULL, NULL, NULL, NULL);
Paolo Bonzinia6ef2902012-08-07 10:49:13 +020052 process_incoming_migration(f);
Chris Lalancette8a43b1e2009-05-25 16:38:23 +020053}
54
Paolo Bonzini43eaae22012-10-02 18:21:18 +020055void exec_start_incoming_migration(const char *command, Error **errp)
Chris Lalancette8a43b1e2009-05-25 16:38:23 +020056{
57 QEMUFile *f;
58
malcd0f2c4c2010-02-07 02:03:50 +030059 DPRINTF("Attempting to start an incoming migration\n");
Chris Lalancette8a43b1e2009-05-25 16:38:23 +020060 f = qemu_popen_cmd(command, "r");
61 if(f == NULL) {
Paolo Bonzini43eaae22012-10-02 18:21:18 +020062 error_setg_errno(errp, errno, "failed to popen the migration source");
63 return;
Chris Lalancette8a43b1e2009-05-25 16:38:23 +020064 }
65
Paolo Bonzinid263a202012-08-08 10:21:26 +020066 qemu_set_fd_handler2(qemu_get_fd(f), NULL,
Juan Quintela1c39e2a2010-03-11 17:55:38 +010067 exec_accept_incoming_migration, NULL, f);
aliguori065e2812008-11-11 16:46:33 +000068}