60
60
return ¤t_migration;
63
int qemu_start_incoming_migration(const char *uri)
63
int qemu_start_incoming_migration(const char *uri, Error **errp)
68
68
if (strstart(uri, "tcp:", &p))
69
ret = tcp_start_incoming_migration(p);
69
ret = tcp_start_incoming_migration(p, errp);
70
70
#if !defined(WIN32)
71
71
else if (strstart(uri, "exec:", &p))
72
72
ret = exec_start_incoming_migration(p);
142
145
case MIG_STATE_COMPLETED:
143
146
info->has_status = true;
144
147
info->status = g_strdup("completed");
149
info->has_ram = true;
150
info->ram = g_malloc0(sizeof(*info->ram));
151
info->ram->transferred = ram_bytes_transferred();
152
info->ram->remaining = 0;
153
info->ram->total = ram_bytes_total();
154
info->ram->total_time = s->total_time;
146
156
case MIG_STATE_ERROR:
147
157
info->has_status = true;
159
169
/* shared migration helpers */
161
static void migrate_fd_monitor_suspend(MigrationState *s, Monitor *mon)
163
if (monitor_suspend(mon) == 0) {
164
DPRINTF("suspending monitor\n");
166
monitor_printf(mon, "terminal does not allow synchronous "
167
"migration, continuing detached\n");
171
171
static int migrate_fd_cleanup(MigrationState *s)
260
256
DPRINTF("iterate\n");
261
ret = qemu_savevm_state_iterate(s->mon, s->file);
257
ret = qemu_savevm_state_iterate(s->file);
263
259
migrate_fd_error(s);
264
260
} else if (ret == 1) {
265
261
int old_vm_running = runstate_is_running();
267
263
DPRINTF("done iterating\n");
264
qemu_system_wakeup_request(QEMU_WAKEUP_REASON_OTHER);
268
265
vm_stop_force_state(RUN_STATE_FINISH_MIGRATE);
270
if (qemu_savevm_state_complete(s->mon, s->file) < 0) {
267
if (qemu_savevm_state_complete(s->file) < 0) {
271
268
migrate_fd_error(s);
273
270
migrate_fd_completed(s);
272
s->total_time = qemu_get_clock_ms(rt_clock) - s->total_time;
275
273
if (s->state != MIG_STATE_COMPLETED) {
276
274
if (old_vm_running) {
290
288
s->state = MIG_STATE_CANCELLED;
291
289
notifier_list_notify(&migration_state_notifiers, s);
292
qemu_savevm_state_cancel(s->mon, s->file);
290
qemu_savevm_state_cancel(s->file);
294
292
migrate_fd_cleanup(s);
367
362
migrate_fd_close);
369
364
DPRINTF("beginning savevm\n");
370
ret = qemu_savevm_state_begin(s->mon, s->file, s->blk, s->shared);
365
ret = qemu_savevm_state_begin(s->file, &s->params);
372
367
DPRINTF("failed, %d\n", ret);
373
368
migrate_fd_error(s);
376
371
migrate_fd_put_ready(s);
379
static MigrationState *migrate_init(Monitor *mon, int detach, int blk, int inc)
374
static MigrationState *migrate_init(const MigrationParams *params)
381
376
MigrationState *s = migrate_get_current();
382
377
int64_t bandwidth_limit = s->bandwidth_limit;
384
379
memset(s, 0, sizeof(*s));
385
380
s->bandwidth_limit = bandwidth_limit;
389
/* s->mon is used for two things:
390
- pass fd in fd migration
391
- suspend/resume monitor for not detached migration
394
383
s->bandwidth_limit = bandwidth_limit;
395
384
s->state = MIG_STATE_SETUP;
398
migrate_fd_monitor_suspend(s, mon);
385
s->total_time = qemu_get_clock_ms(rt_clock);
413
399
migration_blockers = g_slist_remove(migration_blockers, reason);
416
int do_migrate(Monitor *mon, const QDict *qdict, QObject **ret_data)
402
void qmp_migrate(const char *uri, bool has_blk, bool blk,
403
bool has_inc, bool inc, bool has_detach, bool detach,
418
406
MigrationState *s = migrate_get_current();
407
MigrationParams params;
420
int detach = qdict_get_try_bool(qdict, "detach", 0);
421
int blk = qdict_get_try_bool(qdict, "blk", 0);
422
int inc = qdict_get_try_bool(qdict, "inc", 0);
423
const char *uri = qdict_get_str(qdict, "uri");
426
414
if (s->state == MIG_STATE_ACTIVE) {
427
monitor_printf(mon, "migration already in progress\n");
415
error_set(errp, QERR_MIGRATION_ACTIVE);
431
if (qemu_savevm_state_blocked(mon)) {
419
if (qemu_savevm_state_blocked(errp)) {
435
423
if (migration_blockers) {
436
Error *err = migration_blockers->data;
437
qerror_report_err(err);
424
*errp = error_copy(migration_blockers->data);
441
s = migrate_init(mon, detach, blk, inc);
428
s = migrate_init(¶ms);
443
430
if (strstart(uri, "tcp:", &p)) {
444
ret = tcp_start_outgoing_migration(s, p);
431
ret = tcp_start_outgoing_migration(s, p, errp);
445
432
#if !defined(WIN32)
446
433
} else if (strstart(uri, "exec:", &p)) {
447
434
ret = exec_start_outgoing_migration(s, p);
451
438
ret = fd_start_outgoing_migration(s, p);
454
monitor_printf(mon, "unknown migration protocol: %s\n", uri);
441
error_set(errp, QERR_INVALID_PARAMETER_VALUE, "uri", "a valid migration protocol");
459
monitor_printf(mon, "migration failed: %s\n", strerror(-ret));
446
if (!error_is_set(errp)) {
447
DPRINTF("migration failed: %s\n", strerror(-ret));
448
/* FIXME: we should return meaningful errors */
449
error_set(errp, QERR_UNDEFINED_ERROR);
467
454
notifier_list_notify(&migration_state_notifiers, s);
471
457
void qmp_migrate_cancel(Error **errp)