Statistics
| Branch: | Revision:

root / migration.c @ 61669f9a

History | View | Annotate | Download (12.1 kB)

1 5bb7910a aliguori
/*
2 5bb7910a aliguori
 * QEMU live migration
3 5bb7910a aliguori
 *
4 5bb7910a aliguori
 * Copyright IBM, Corp. 2008
5 5bb7910a aliguori
 *
6 5bb7910a aliguori
 * Authors:
7 5bb7910a aliguori
 *  Anthony Liguori   <aliguori@us.ibm.com>
8 5bb7910a aliguori
 *
9 5bb7910a aliguori
 * This work is licensed under the terms of the GNU GPL, version 2.  See
10 5bb7910a aliguori
 * the COPYING file in the top-level directory.
11 5bb7910a aliguori
 *
12 5bb7910a aliguori
 */
13 5bb7910a aliguori
14 5bb7910a aliguori
#include "qemu-common.h"
15 5bb7910a aliguori
#include "migration.h"
16 376253ec aliguori
#include "monitor.h"
17 065e2813 aliguori
#include "buffered_file.h"
18 065e2813 aliguori
#include "sysemu.h"
19 065e2813 aliguori
#include "block.h"
20 065e2813 aliguori
#include "qemu_socket.h"
21 25f23643 Jan Kiszka
#include "block-migration.h"
22 791e7c82 Luiz Capitulino
#include "qmp-commands.h"
23 065e2813 aliguori
24 065e2813 aliguori
//#define DEBUG_MIGRATION
25 065e2813 aliguori
26 065e2813 aliguori
#ifdef DEBUG_MIGRATION
27 d0f2c4c6 malc
#define DPRINTF(fmt, ...) \
28 065e2813 aliguori
    do { printf("migration: " fmt, ## __VA_ARGS__); } while (0)
29 065e2813 aliguori
#else
30 d0f2c4c6 malc
#define DPRINTF(fmt, ...) \
31 065e2813 aliguori
    do { } while (0)
32 065e2813 aliguori
#endif
33 5bb7910a aliguori
34 7dc688ed Juan Quintela
enum {
35 7dc688ed Juan Quintela
    MIG_STATE_ERROR,
36 7dc688ed Juan Quintela
    MIG_STATE_SETUP,
37 7dc688ed Juan Quintela
    MIG_STATE_CANCELLED,
38 7dc688ed Juan Quintela
    MIG_STATE_ACTIVE,
39 7dc688ed Juan Quintela
    MIG_STATE_COMPLETED,
40 7dc688ed Juan Quintela
};
41 5bb7910a aliguori
42 d0ae46c1 Juan Quintela
#define MAX_THROTTLE  (32 << 20)      /* Migration speed throttling */
43 5bb7910a aliguori
44 99a0db9b Gerd Hoffmann
static NotifierList migration_state_notifiers =
45 99a0db9b Gerd Hoffmann
    NOTIFIER_LIST_INITIALIZER(migration_state_notifiers);
46 99a0db9b Gerd Hoffmann
47 17549e84 Juan Quintela
/* When we add fault tolerance, we could have several
48 17549e84 Juan Quintela
   migrations at once.  For now we don't need to add
49 17549e84 Juan Quintela
   dynamic creation of migration */
50 17549e84 Juan Quintela
51 17549e84 Juan Quintela
static MigrationState *migrate_get_current(void)
52 17549e84 Juan Quintela
{
53 17549e84 Juan Quintela
    static MigrationState current_migration = {
54 17549e84 Juan Quintela
        .state = MIG_STATE_SETUP,
55 d0ae46c1 Juan Quintela
        .bandwidth_limit = MAX_THROTTLE,
56 17549e84 Juan Quintela
    };
57 17549e84 Juan Quintela
58 17549e84 Juan Quintela
    return &current_migration;
59 17549e84 Juan Quintela
}
60 17549e84 Juan Quintela
61 8ca5e801 Juan Quintela
int qemu_start_incoming_migration(const char *uri)
62 5bb7910a aliguori
{
63 34c9dd8e aliguori
    const char *p;
64 8ca5e801 Juan Quintela
    int ret;
65 34c9dd8e aliguori
66 34c9dd8e aliguori
    if (strstart(uri, "tcp:", &p))
67 8ca5e801 Juan Quintela
        ret = tcp_start_incoming_migration(p);
68 065e2813 aliguori
#if !defined(WIN32)
69 065e2813 aliguori
    else if (strstart(uri, "exec:", &p))
70 8ca5e801 Juan Quintela
        ret =  exec_start_incoming_migration(p);
71 4951f65b Chris Lalancette
    else if (strstart(uri, "unix:", &p))
72 8ca5e801 Juan Quintela
        ret = unix_start_incoming_migration(p);
73 5ac1fad3 Paolo Bonzini
    else if (strstart(uri, "fd:", &p))
74 8ca5e801 Juan Quintela
        ret = fd_start_incoming_migration(p);
75 065e2813 aliguori
#endif
76 8ca5e801 Juan Quintela
    else {
77 34c9dd8e aliguori
        fprintf(stderr, "unknown migration protocol: %s\n", uri);
78 8ca5e801 Juan Quintela
        ret = -EPROTONOSUPPORT;
79 8ca5e801 Juan Quintela
    }
80 8ca5e801 Juan Quintela
    return ret;
81 5bb7910a aliguori
}
82 5bb7910a aliguori
83 511c0231 Juan Quintela
void process_incoming_migration(QEMUFile *f)
84 511c0231 Juan Quintela
{
85 511c0231 Juan Quintela
    if (qemu_loadvm_state(f) < 0) {
86 511c0231 Juan Quintela
        fprintf(stderr, "load of migration failed\n");
87 511c0231 Juan Quintela
        exit(0);
88 511c0231 Juan Quintela
    }
89 511c0231 Juan Quintela
    qemu_announce_self();
90 511c0231 Juan Quintela
    DPRINTF("successfully loaded vm state\n");
91 511c0231 Juan Quintela
92 0f15423c Anthony Liguori
    /* Make sure all file formats flush their mutable metadata */
93 0f15423c Anthony Liguori
    bdrv_invalidate_cache_all();
94 0f15423c Anthony Liguori
95 f5bbfba1 Luiz Capitulino
    if (autostart) {
96 511c0231 Juan Quintela
        vm_start();
97 f5bbfba1 Luiz Capitulino
    } else {
98 0461d5a6 Luiz Capitulino
        runstate_set(RUN_STATE_PRELAUNCH);
99 f5bbfba1 Luiz Capitulino
    }
100 511c0231 Juan Quintela
}
101 511c0231 Juan Quintela
102 a0a3fd60 Glauber Costa
/* amount of nanoseconds we are willing to wait for migration to be down.
103 a0a3fd60 Glauber Costa
 * the choice of nanoseconds is because it is the maximum resolution that
104 a0a3fd60 Glauber Costa
 * get_clock() can achieve. It is an internal measure. All user-visible
105 a0a3fd60 Glauber Costa
 * units must be in seconds */
106 a0a3fd60 Glauber Costa
static uint64_t max_downtime = 30000000;
107 a0a3fd60 Glauber Costa
108 a0a3fd60 Glauber Costa
uint64_t migrate_max_downtime(void)
109 a0a3fd60 Glauber Costa
{
110 a0a3fd60 Glauber Costa
    return max_downtime;
111 a0a3fd60 Glauber Costa
}
112 a0a3fd60 Glauber Costa
113 791e7c82 Luiz Capitulino
MigrationInfo *qmp_query_migrate(Error **errp)
114 5bb7910a aliguori
{
115 791e7c82 Luiz Capitulino
    MigrationInfo *info = g_malloc0(sizeof(*info));
116 17549e84 Juan Quintela
    MigrationState *s = migrate_get_current();
117 17549e84 Juan Quintela
118 17549e84 Juan Quintela
    switch (s->state) {
119 17549e84 Juan Quintela
    case MIG_STATE_SETUP:
120 17549e84 Juan Quintela
        /* no migration has happened ever */
121 17549e84 Juan Quintela
        break;
122 17549e84 Juan Quintela
    case MIG_STATE_ACTIVE:
123 791e7c82 Luiz Capitulino
        info->has_status = true;
124 791e7c82 Luiz Capitulino
        info->status = g_strdup("active");
125 17549e84 Juan Quintela
126 791e7c82 Luiz Capitulino
        info->has_ram = true;
127 791e7c82 Luiz Capitulino
        info->ram = g_malloc0(sizeof(*info->ram));
128 791e7c82 Luiz Capitulino
        info->ram->transferred = ram_bytes_transferred();
129 791e7c82 Luiz Capitulino
        info->ram->remaining = ram_bytes_remaining();
130 791e7c82 Luiz Capitulino
        info->ram->total = ram_bytes_total();
131 17549e84 Juan Quintela
132 17549e84 Juan Quintela
        if (blk_mig_active()) {
133 791e7c82 Luiz Capitulino
            info->has_disk = true;
134 791e7c82 Luiz Capitulino
            info->disk = g_malloc0(sizeof(*info->disk));
135 791e7c82 Luiz Capitulino
            info->disk->transferred = blk_mig_bytes_transferred();
136 791e7c82 Luiz Capitulino
            info->disk->remaining = blk_mig_bytes_remaining();
137 791e7c82 Luiz Capitulino
            info->disk->total = blk_mig_bytes_total();
138 ff8d81d8 aliguori
        }
139 17549e84 Juan Quintela
        break;
140 17549e84 Juan Quintela
    case MIG_STATE_COMPLETED:
141 791e7c82 Luiz Capitulino
        info->has_status = true;
142 791e7c82 Luiz Capitulino
        info->status = g_strdup("completed");
143 17549e84 Juan Quintela
        break;
144 17549e84 Juan Quintela
    case MIG_STATE_ERROR:
145 791e7c82 Luiz Capitulino
        info->has_status = true;
146 791e7c82 Luiz Capitulino
        info->status = g_strdup("failed");
147 17549e84 Juan Quintela
        break;
148 17549e84 Juan Quintela
    case MIG_STATE_CANCELLED:
149 791e7c82 Luiz Capitulino
        info->has_status = true;
150 791e7c82 Luiz Capitulino
        info->status = g_strdup("cancelled");
151 17549e84 Juan Quintela
        break;
152 5bb7910a aliguori
    }
153 791e7c82 Luiz Capitulino
154 791e7c82 Luiz Capitulino
    return info;
155 5bb7910a aliguori
}
156 5bb7910a aliguori
157 065e2813 aliguori
/* shared migration helpers */
158 065e2813 aliguori
159 0edda1c4 Juan Quintela
static void migrate_fd_monitor_suspend(MigrationState *s, Monitor *mon)
160 731b0364 aliguori
{
161 f327aa0c Jan Kiszka
    if (monitor_suspend(mon) == 0) {
162 d0f2c4c6 malc
        DPRINTF("suspending monitor\n");
163 f327aa0c Jan Kiszka
    } else {
164 f327aa0c Jan Kiszka
        monitor_printf(mon, "terminal does not allow synchronous "
165 cde76ee1 aliguori
                       "migration, continuing detached\n");
166 f327aa0c Jan Kiszka
    }
167 731b0364 aliguori
}
168 731b0364 aliguori
169 8b6b99b3 Juan Quintela
static int migrate_fd_cleanup(MigrationState *s)
170 065e2813 aliguori
{
171 41ef56e6 Anthony Liguori
    int ret = 0;
172 41ef56e6 Anthony Liguori
173 065e2813 aliguori
    qemu_set_fd_handler2(s->fd, NULL, NULL, NULL, NULL);
174 065e2813 aliguori
175 065e2813 aliguori
    if (s->file) {
176 d0f2c4c6 malc
        DPRINTF("closing file\n");
177 41ef56e6 Anthony Liguori
        if (qemu_fclose(s->file) != 0) {
178 41ef56e6 Anthony Liguori
            ret = -1;
179 41ef56e6 Anthony Liguori
        }
180 5d39c799 Jan Kiszka
        s->file = NULL;
181 84ec6552 Jan Kiszka
    } else {
182 84ec6552 Jan Kiszka
        if (s->mon) {
183 84ec6552 Jan Kiszka
            monitor_resume(s->mon);
184 84ec6552 Jan Kiszka
        }
185 065e2813 aliguori
    }
186 065e2813 aliguori
187 84ec6552 Jan Kiszka
    if (s->fd != -1) {
188 065e2813 aliguori
        close(s->fd);
189 84ec6552 Jan Kiszka
        s->fd = -1;
190 f327aa0c Jan Kiszka
    }
191 065e2813 aliguori
192 41ef56e6 Anthony Liguori
    return ret;
193 065e2813 aliguori
}
194 065e2813 aliguori
195 8b6b99b3 Juan Quintela
void migrate_fd_error(MigrationState *s)
196 065e2813 aliguori
{
197 8b6b99b3 Juan Quintela
    DPRINTF("setting error state\n");
198 8b6b99b3 Juan Quintela
    s->state = MIG_STATE_ERROR;
199 e0eb7390 Juan Quintela
    notifier_list_notify(&migration_state_notifiers, s);
200 8b6b99b3 Juan Quintela
    migrate_fd_cleanup(s);
201 8b6b99b3 Juan Quintela
}
202 8b6b99b3 Juan Quintela
203 458cf28e Juan Quintela
static void migrate_fd_completed(MigrationState *s)
204 458cf28e Juan Quintela
{
205 458cf28e Juan Quintela
    DPRINTF("setting completed state\n");
206 458cf28e Juan Quintela
    if (migrate_fd_cleanup(s) < 0) {
207 458cf28e Juan Quintela
        s->state = MIG_STATE_ERROR;
208 458cf28e Juan Quintela
    } else {
209 458cf28e Juan Quintela
        s->state = MIG_STATE_COMPLETED;
210 458cf28e Juan Quintela
        runstate_set(RUN_STATE_POSTMIGRATE);
211 458cf28e Juan Quintela
    }
212 e0eb7390 Juan Quintela
    notifier_list_notify(&migration_state_notifiers, s);
213 458cf28e Juan Quintela
}
214 458cf28e Juan Quintela
215 8b6b99b3 Juan Quintela
static void migrate_fd_put_notify(void *opaque)
216 065e2813 aliguori
{
217 22f00a44 Juan Quintela
    MigrationState *s = opaque;
218 065e2813 aliguori
219 065e2813 aliguori
    qemu_set_fd_handler2(s->fd, NULL, NULL, NULL, NULL);
220 065e2813 aliguori
    qemu_file_put_notify(s->file);
221 1fdc11c3 Luiz Capitulino
    if (s->file && qemu_file_get_error(s->file)) {
222 2350e13c Yoshiaki Tamura
        migrate_fd_error(s);
223 2350e13c Yoshiaki Tamura
    }
224 065e2813 aliguori
}
225 065e2813 aliguori
226 8b6b99b3 Juan Quintela
static ssize_t migrate_fd_put_buffer(void *opaque, const void *data,
227 8b6b99b3 Juan Quintela
                                     size_t size)
228 065e2813 aliguori
{
229 22f00a44 Juan Quintela
    MigrationState *s = opaque;
230 065e2813 aliguori
    ssize_t ret;
231 065e2813 aliguori
232 fdbecb5d Juan Quintela
    if (s->state != MIG_STATE_ACTIVE) {
233 fdbecb5d Juan Quintela
        return -EIO;
234 fdbecb5d Juan Quintela
    }
235 fdbecb5d Juan Quintela
236 065e2813 aliguori
    do {
237 065e2813 aliguori
        ret = s->write(s, data, size);
238 95b134ea Uri Lublin
    } while (ret == -1 && ((s->get_error(s)) == EINTR));
239 065e2813 aliguori
240 065e2813 aliguori
    if (ret == -1)
241 065e2813 aliguori
        ret = -(s->get_error(s));
242 065e2813 aliguori
243 e447b1a6 Marcelo Tosatti
    if (ret == -EAGAIN) {
244 065e2813 aliguori
        qemu_set_fd_handler2(s->fd, NULL, NULL, migrate_fd_put_notify, s);
245 e447b1a6 Marcelo Tosatti
    }
246 065e2813 aliguori
247 065e2813 aliguori
    return ret;
248 065e2813 aliguori
}
249 065e2813 aliguori
250 8b6b99b3 Juan Quintela
static void migrate_fd_put_ready(void *opaque)
251 065e2813 aliguori
{
252 22f00a44 Juan Quintela
    MigrationState *s = opaque;
253 065e2813 aliguori
    int ret;
254 065e2813 aliguori
255 065e2813 aliguori
    if (s->state != MIG_STATE_ACTIVE) {
256 d0f2c4c6 malc
        DPRINTF("put_ready returning because of non-active state\n");
257 065e2813 aliguori
        return;
258 065e2813 aliguori
    }
259 065e2813 aliguori
260 d0f2c4c6 malc
    DPRINTF("iterate\n");
261 39346385 Juan Quintela
    ret = qemu_savevm_state_iterate(s->mon, s->file);
262 39346385 Juan Quintela
    if (ret < 0) {
263 39346385 Juan Quintela
        migrate_fd_error(s);
264 39346385 Juan Quintela
    } else if (ret == 1) {
265 1354869c Luiz Capitulino
        int old_vm_running = runstate_is_running();
266 eeb34af9 Anthony Liguori
267 d0f2c4c6 malc
        DPRINTF("done iterating\n");
268 8a9236f1 Luiz Capitulino
        vm_stop_force_state(RUN_STATE_FINISH_MIGRATE);
269 065e2813 aliguori
270 67afff79 Juan Quintela
        if (qemu_savevm_state_complete(s->mon, s->file) < 0) {
271 67afff79 Juan Quintela
            migrate_fd_error(s);
272 b161d123 aliguori
        } else {
273 458cf28e Juan Quintela
            migrate_fd_completed(s);
274 b161d123 aliguori
        }
275 48a2f4d6 Juan Quintela
        if (s->state != MIG_STATE_COMPLETED) {
276 41ef56e6 Anthony Liguori
            if (old_vm_running) {
277 41ef56e6 Anthony Liguori
                vm_start();
278 41ef56e6 Anthony Liguori
            }
279 f5bbfba1 Luiz Capitulino
        }
280 065e2813 aliguori
    }
281 065e2813 aliguori
}
282 065e2813 aliguori
283 0edda1c4 Juan Quintela
static void migrate_fd_cancel(MigrationState *s)
284 065e2813 aliguori
{
285 065e2813 aliguori
    if (s->state != MIG_STATE_ACTIVE)
286 065e2813 aliguori
        return;
287 065e2813 aliguori
288 d0f2c4c6 malc
    DPRINTF("cancelling migration\n");
289 065e2813 aliguori
290 065e2813 aliguori
    s->state = MIG_STATE_CANCELLED;
291 e0eb7390 Juan Quintela
    notifier_list_notify(&migration_state_notifiers, s);
292 f327aa0c Jan Kiszka
    qemu_savevm_state_cancel(s->mon, s->file);
293 065e2813 aliguori
294 065e2813 aliguori
    migrate_fd_cleanup(s);
295 065e2813 aliguori
}
296 065e2813 aliguori
297 8b6b99b3 Juan Quintela
static void migrate_fd_wait_for_unfreeze(void *opaque)
298 065e2813 aliguori
{
299 22f00a44 Juan Quintela
    MigrationState *s = opaque;
300 065e2813 aliguori
    int ret;
301 065e2813 aliguori
302 d0f2c4c6 malc
    DPRINTF("wait for unfreeze\n");
303 065e2813 aliguori
    if (s->state != MIG_STATE_ACTIVE)
304 065e2813 aliguori
        return;
305 065e2813 aliguori
306 065e2813 aliguori
    do {
307 065e2813 aliguori
        fd_set wfds;
308 065e2813 aliguori
309 065e2813 aliguori
        FD_ZERO(&wfds);
310 065e2813 aliguori
        FD_SET(s->fd, &wfds);
311 065e2813 aliguori
312 065e2813 aliguori
        ret = select(s->fd + 1, NULL, &wfds, NULL, NULL);
313 065e2813 aliguori
    } while (ret == -1 && (s->get_error(s)) == EINTR);
314 af509450 Juan Quintela
315 af509450 Juan Quintela
    if (ret == -1) {
316 dcd1d224 Juan Quintela
        qemu_file_set_error(s->file, -s->get_error(s));
317 af509450 Juan Quintela
    }
318 065e2813 aliguori
}
319 065e2813 aliguori
320 8b6b99b3 Juan Quintela
static int migrate_fd_close(void *opaque)
321 065e2813 aliguori
{
322 22f00a44 Juan Quintela
    MigrationState *s = opaque;
323 e19252d3 Uri Lublin
324 84ec6552 Jan Kiszka
    if (s->mon) {
325 84ec6552 Jan Kiszka
        monitor_resume(s->mon);
326 84ec6552 Jan Kiszka
    }
327 e19252d3 Uri Lublin
    qemu_set_fd_handler2(s->fd, NULL, NULL, NULL, NULL);
328 065e2813 aliguori
    return s->close(s);
329 065e2813 aliguori
}
330 99a0db9b Gerd Hoffmann
331 99a0db9b Gerd Hoffmann
void add_migration_state_change_notifier(Notifier *notify)
332 99a0db9b Gerd Hoffmann
{
333 99a0db9b Gerd Hoffmann
    notifier_list_add(&migration_state_notifiers, notify);
334 99a0db9b Gerd Hoffmann
}
335 99a0db9b Gerd Hoffmann
336 99a0db9b Gerd Hoffmann
void remove_migration_state_change_notifier(Notifier *notify)
337 99a0db9b Gerd Hoffmann
{
338 99a0db9b Gerd Hoffmann
    notifier_list_remove(&migration_state_notifiers, notify);
339 99a0db9b Gerd Hoffmann
}
340 99a0db9b Gerd Hoffmann
341 afe2df69 Gerd Hoffmann
bool migration_is_active(MigrationState *s)
342 afe2df69 Gerd Hoffmann
{
343 afe2df69 Gerd Hoffmann
    return s->state == MIG_STATE_ACTIVE;
344 afe2df69 Gerd Hoffmann
}
345 afe2df69 Gerd Hoffmann
346 7073693b Juan Quintela
bool migration_has_finished(MigrationState *s)
347 99a0db9b Gerd Hoffmann
{
348 7073693b Juan Quintela
    return s->state == MIG_STATE_COMPLETED;
349 99a0db9b Gerd Hoffmann
}
350 0edda1c4 Juan Quintela
351 afe2df69 Gerd Hoffmann
bool migration_has_failed(MigrationState *s)
352 afe2df69 Gerd Hoffmann
{
353 afe2df69 Gerd Hoffmann
    return (s->state == MIG_STATE_CANCELLED ||
354 afe2df69 Gerd Hoffmann
            s->state == MIG_STATE_ERROR);
355 afe2df69 Gerd Hoffmann
}
356 afe2df69 Gerd Hoffmann
357 8b6b99b3 Juan Quintela
void migrate_fd_connect(MigrationState *s)
358 99a0db9b Gerd Hoffmann
{
359 8b6b99b3 Juan Quintela
    int ret;
360 8b6b99b3 Juan Quintela
361 d5934dde Juan Quintela
    s->state = MIG_STATE_ACTIVE;
362 8b6b99b3 Juan Quintela
    s->file = qemu_fopen_ops_buffered(s,
363 8b6b99b3 Juan Quintela
                                      s->bandwidth_limit,
364 8b6b99b3 Juan Quintela
                                      migrate_fd_put_buffer,
365 8b6b99b3 Juan Quintela
                                      migrate_fd_put_ready,
366 8b6b99b3 Juan Quintela
                                      migrate_fd_wait_for_unfreeze,
367 8b6b99b3 Juan Quintela
                                      migrate_fd_close);
368 8b6b99b3 Juan Quintela
369 8b6b99b3 Juan Quintela
    DPRINTF("beginning savevm\n");
370 8b6b99b3 Juan Quintela
    ret = qemu_savevm_state_begin(s->mon, s->file, s->blk, s->shared);
371 8b6b99b3 Juan Quintela
    if (ret < 0) {
372 8b6b99b3 Juan Quintela
        DPRINTF("failed, %d\n", ret);
373 8b6b99b3 Juan Quintela
        migrate_fd_error(s);
374 8b6b99b3 Juan Quintela
        return;
375 8b6b99b3 Juan Quintela
    }
376 8b6b99b3 Juan Quintela
    migrate_fd_put_ready(s);
377 8b6b99b3 Juan Quintela
}
378 8b6b99b3 Juan Quintela
379 d0ae46c1 Juan Quintela
static MigrationState *migrate_init(Monitor *mon, int detach, int blk, int inc)
380 0edda1c4 Juan Quintela
{
381 17549e84 Juan Quintela
    MigrationState *s = migrate_get_current();
382 d0ae46c1 Juan Quintela
    int64_t bandwidth_limit = s->bandwidth_limit;
383 0edda1c4 Juan Quintela
384 17549e84 Juan Quintela
    memset(s, 0, sizeof(*s));
385 d0ae46c1 Juan Quintela
    s->bandwidth_limit = bandwidth_limit;
386 0edda1c4 Juan Quintela
    s->blk = blk;
387 0edda1c4 Juan Quintela
    s->shared = inc;
388 1299c631 Juan Quintela
389 1299c631 Juan Quintela
    /* s->mon is used for two things:
390 1299c631 Juan Quintela
       - pass fd in fd migration
391 1299c631 Juan Quintela
       - suspend/resume monitor for not detached migration
392 1299c631 Juan Quintela
    */
393 1299c631 Juan Quintela
    s->mon = mon;
394 0edda1c4 Juan Quintela
    s->bandwidth_limit = bandwidth_limit;
395 d5934dde Juan Quintela
    s->state = MIG_STATE_SETUP;
396 0edda1c4 Juan Quintela
397 0edda1c4 Juan Quintela
    if (!detach) {
398 0edda1c4 Juan Quintela
        migrate_fd_monitor_suspend(s, mon);
399 0edda1c4 Juan Quintela
    }
400 0edda1c4 Juan Quintela
401 0edda1c4 Juan Quintela
    return s;
402 0edda1c4 Juan Quintela
}
403 cab30143 Juan Quintela
404 fa2756b7 Anthony Liguori
static GSList *migration_blockers;
405 fa2756b7 Anthony Liguori
406 fa2756b7 Anthony Liguori
void migrate_add_blocker(Error *reason)
407 fa2756b7 Anthony Liguori
{
408 fa2756b7 Anthony Liguori
    migration_blockers = g_slist_prepend(migration_blockers, reason);
409 fa2756b7 Anthony Liguori
}
410 fa2756b7 Anthony Liguori
411 fa2756b7 Anthony Liguori
void migrate_del_blocker(Error *reason)
412 fa2756b7 Anthony Liguori
{
413 fa2756b7 Anthony Liguori
    migration_blockers = g_slist_remove(migration_blockers, reason);
414 fa2756b7 Anthony Liguori
}
415 fa2756b7 Anthony Liguori
416 cab30143 Juan Quintela
int do_migrate(Monitor *mon, const QDict *qdict, QObject **ret_data)
417 cab30143 Juan Quintela
{
418 17549e84 Juan Quintela
    MigrationState *s = migrate_get_current();
419 cab30143 Juan Quintela
    const char *p;
420 cab30143 Juan Quintela
    int detach = qdict_get_try_bool(qdict, "detach", 0);
421 cab30143 Juan Quintela
    int blk = qdict_get_try_bool(qdict, "blk", 0);
422 cab30143 Juan Quintela
    int inc = qdict_get_try_bool(qdict, "inc", 0);
423 cab30143 Juan Quintela
    const char *uri = qdict_get_str(qdict, "uri");
424 cab30143 Juan Quintela
    int ret;
425 cab30143 Juan Quintela
426 17549e84 Juan Quintela
    if (s->state == MIG_STATE_ACTIVE) {
427 cab30143 Juan Quintela
        monitor_printf(mon, "migration already in progress\n");
428 cab30143 Juan Quintela
        return -1;
429 cab30143 Juan Quintela
    }
430 cab30143 Juan Quintela
431 cab30143 Juan Quintela
    if (qemu_savevm_state_blocked(mon)) {
432 cab30143 Juan Quintela
        return -1;
433 cab30143 Juan Quintela
    }
434 cab30143 Juan Quintela
435 fa2756b7 Anthony Liguori
    if (migration_blockers) {
436 fa2756b7 Anthony Liguori
        Error *err = migration_blockers->data;
437 fa2756b7 Anthony Liguori
        qerror_report_err(err);
438 fa2756b7 Anthony Liguori
        return -1;
439 fa2756b7 Anthony Liguori
    }
440 fa2756b7 Anthony Liguori
441 d0ae46c1 Juan Quintela
    s = migrate_init(mon, detach, blk, inc);
442 cab30143 Juan Quintela
443 cab30143 Juan Quintela
    if (strstart(uri, "tcp:", &p)) {
444 cab30143 Juan Quintela
        ret = tcp_start_outgoing_migration(s, p);
445 cab30143 Juan Quintela
#if !defined(WIN32)
446 cab30143 Juan Quintela
    } else if (strstart(uri, "exec:", &p)) {
447 cab30143 Juan Quintela
        ret = exec_start_outgoing_migration(s, p);
448 cab30143 Juan Quintela
    } else if (strstart(uri, "unix:", &p)) {
449 cab30143 Juan Quintela
        ret = unix_start_outgoing_migration(s, p);
450 cab30143 Juan Quintela
    } else if (strstart(uri, "fd:", &p)) {
451 cab30143 Juan Quintela
        ret = fd_start_outgoing_migration(s, p);
452 cab30143 Juan Quintela
#endif
453 99a0db9b Gerd Hoffmann
    } else {
454 cab30143 Juan Quintela
        monitor_printf(mon, "unknown migration protocol: %s\n", uri);
455 cab30143 Juan Quintela
        ret  = -EINVAL;
456 cab30143 Juan Quintela
    }
457 cab30143 Juan Quintela
458 cab30143 Juan Quintela
    if (ret < 0) {
459 17549e84 Juan Quintela
        monitor_printf(mon, "migration failed: %s\n", strerror(-ret));
460 17549e84 Juan Quintela
        return ret;
461 cab30143 Juan Quintela
    }
462 cab30143 Juan Quintela
463 1299c631 Juan Quintela
    if (detach) {
464 1299c631 Juan Quintela
        s->mon = NULL;
465 1299c631 Juan Quintela
    }
466 1299c631 Juan Quintela
467 e0eb7390 Juan Quintela
    notifier_list_notify(&migration_state_notifiers, s);
468 cab30143 Juan Quintela
    return 0;
469 cab30143 Juan Quintela
}
470 cab30143 Juan Quintela
471 cab30143 Juan Quintela
int do_migrate_cancel(Monitor *mon, const QDict *qdict, QObject **ret_data)
472 cab30143 Juan Quintela
{
473 17549e84 Juan Quintela
    migrate_fd_cancel(migrate_get_current());
474 cab30143 Juan Quintela
    return 0;
475 cab30143 Juan Quintela
}
476 cab30143 Juan Quintela
477 cab30143 Juan Quintela
int do_migrate_set_speed(Monitor *mon, const QDict *qdict, QObject **ret_data)
478 cab30143 Juan Quintela
{
479 cab30143 Juan Quintela
    int64_t d;
480 cab30143 Juan Quintela
    MigrationState *s;
481 cab30143 Juan Quintela
482 cab30143 Juan Quintela
    d = qdict_get_int(qdict, "value");
483 cab30143 Juan Quintela
    if (d < 0) {
484 cab30143 Juan Quintela
        d = 0;
485 99a0db9b Gerd Hoffmann
    }
486 cab30143 Juan Quintela
487 17549e84 Juan Quintela
    s = migrate_get_current();
488 d0ae46c1 Juan Quintela
    s->bandwidth_limit = d;
489 d0ae46c1 Juan Quintela
    qemu_file_set_rate_limit(s->file, s->bandwidth_limit);
490 cab30143 Juan Quintela
491 cab30143 Juan Quintela
    return 0;
492 cab30143 Juan Quintela
}
493 cab30143 Juan Quintela
494 cab30143 Juan Quintela
int do_migrate_set_downtime(Monitor *mon, const QDict *qdict,
495 cab30143 Juan Quintela
                            QObject **ret_data)
496 cab30143 Juan Quintela
{
497 cab30143 Juan Quintela
    double d;
498 cab30143 Juan Quintela
499 cab30143 Juan Quintela
    d = qdict_get_double(qdict, "value") * 1e9;
500 cab30143 Juan Quintela
    d = MAX(0, MIN(UINT64_MAX, d));
501 cab30143 Juan Quintela
    max_downtime = (uint64_t)d;
502 cab30143 Juan Quintela
503 cab30143 Juan Quintela
    return 0;
504 99a0db9b Gerd Hoffmann
}