migration.c 25.9 KB
Newer Older
A
aliguori 已提交
1 2 3 4 5 6 7 8 9 10 11
/*
 * QEMU live migration
 *
 * Copyright IBM, Corp. 2008
 *
 * Authors:
 *  Anthony Liguori   <aliguori@us.ibm.com>
 *
 * This work is licensed under the terms of the GNU GPL, version 2.  See
 * the COPYING file in the top-level directory.
 *
12 13
 * Contributions after 2012-01-13 are licensed under the terms of the
 * GNU GPL, version 2 or (at your option) any later version.
A
aliguori 已提交
14 15 16
 */

#include "qemu-common.h"
17
#include "qemu/main-loop.h"
18
#include "migration/migration.h"
19
#include "monitor/monitor.h"
20
#include "migration/qemu-file.h"
21
#include "sysemu/sysemu.h"
22
#include "block/block.h"
23
#include "qemu/sockets.h"
24
#include "migration/block.h"
25
#include "qemu/thread.h"
L
Luiz Capitulino 已提交
26
#include "qmp-commands.h"
27
#include "trace.h"
28

29
#define MAX_THROTTLE  (32 << 20)      /* Migration speed throttling */
A
aliguori 已提交
30

J
Juan Quintela 已提交
31 32 33 34 35
/* Amount of time to allocate to each "chunk" of bandwidth-throttled
 * data. */
#define BUFFER_DELAY     100
#define XFER_LIMIT_RATIO (1000 / BUFFER_DELAY)

36 37
/* Default compression thread count */
#define DEFAULT_MIGRATE_COMPRESS_THREAD_COUNT 8
38 39 40
/* Default decompression thread count, usually decompression is at
 * least 4 times as fast as compression.*/
#define DEFAULT_MIGRATE_DECOMPRESS_THREAD_COUNT 2
41 42 43
/*0: means nocompress, 1: best speed, ... 9: best compress ratio */
#define DEFAULT_MIGRATE_COMPRESS_LEVEL 1

44 45 46
/* Migration XBZRLE default cache size */
#define DEFAULT_MIGRATE_CACHE_SIZE (64 * 1024 * 1024)

47 48 49
static NotifierList migration_state_notifiers =
    NOTIFIER_LIST_INITIALIZER(migration_state_notifiers);

D
Dr. David Alan Gilbert 已提交
50 51
static bool deferred_incoming;

52 53 54 55
/* When we add fault tolerance, we could have several
   migrations at once.  For now we don't need to add
   dynamic creation of migration */

56
/* For outgoing */
57
MigrationState *migrate_get_current(void)
58 59
{
    static MigrationState current_migration = {
60
        .state = MIGRATION_STATUS_NONE,
61
        .bandwidth_limit = MAX_THROTTLE,
62
        .xbzrle_cache_size = DEFAULT_MIGRATE_CACHE_SIZE,
63
        .mbps = -1,
64 65 66 67 68 69
        .parameters[MIGRATION_PARAMETER_COMPRESS_LEVEL] =
                DEFAULT_MIGRATE_COMPRESS_LEVEL,
        .parameters[MIGRATION_PARAMETER_COMPRESS_THREADS] =
                DEFAULT_MIGRATE_COMPRESS_THREAD_COUNT,
        .parameters[MIGRATION_PARAMETER_DECOMPRESS_THREADS] =
                DEFAULT_MIGRATE_DECOMPRESS_THREAD_COUNT,
70 71 72 73 74
    };

    return &current_migration;
}

75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
/* For incoming */
static MigrationIncomingState *mis_current;

MigrationIncomingState *migration_incoming_get_current(void)
{
    return mis_current;
}

MigrationIncomingState *migration_incoming_state_new(QEMUFile* f)
{
    mis_current = g_malloc0(sizeof(MigrationIncomingState));
    mis_current->file = f;

    return mis_current;
}

void migration_incoming_state_destroy(void)
{
    g_free(mis_current);
    mis_current = NULL;
}

D
Dr. David Alan Gilbert 已提交
97 98 99 100 101 102 103 104 105 106 107 108 109
/*
 * Called on -incoming with a defer: uri.
 * The migration can be started later after any parameters have been
 * changed.
 */
static void deferred_incoming_migration(Error **errp)
{
    if (deferred_incoming) {
        error_setg(errp, "Incoming migration already deferred");
    }
    deferred_incoming = true;
}

110
void qemu_start_incoming_migration(const char *uri, Error **errp)
A
aliguori 已提交
111
{
A
aliguori 已提交
112 113
    const char *p;

D
Dr. David Alan Gilbert 已提交
114 115 116
    if (!strcmp(uri, "defer")) {
        deferred_incoming_migration(errp);
    } else if (strstart(uri, "tcp:", &p)) {
117
        tcp_start_incoming_migration(p, errp);
M
Michael R. Hines 已提交
118
#ifdef CONFIG_RDMA
D
Dr. David Alan Gilbert 已提交
119
    } else if (strstart(uri, "rdma:", &p)) {
M
Michael R. Hines 已提交
120 121
        rdma_start_incoming_migration(p, errp);
#endif
122
#if !defined(WIN32)
D
Dr. David Alan Gilbert 已提交
123
    } else if (strstart(uri, "exec:", &p)) {
124
        exec_start_incoming_migration(p, errp);
D
Dr. David Alan Gilbert 已提交
125
    } else if (strstart(uri, "unix:", &p)) {
126
        unix_start_incoming_migration(p, errp);
D
Dr. David Alan Gilbert 已提交
127
    } else if (strstart(uri, "fd:", &p)) {
128
        fd_start_incoming_migration(p, errp);
129
#endif
D
Dr. David Alan Gilbert 已提交
130
    } else {
131
        error_setg(errp, "unknown migration protocol: %s", uri);
J
Juan Quintela 已提交
132
    }
A
aliguori 已提交
133 134
}

135
static void process_incoming_migration_co(void *opaque)
136
{
137
    QEMUFile *f = opaque;
138
    Error *local_err = NULL;
139 140
    int ret;

141 142
    migration_incoming_state_new(f);

143
    ret = qemu_loadvm_state(f);
144

145
    qemu_fclose(f);
146
    free_xbzrle_decoded_buf();
147 148
    migration_incoming_state_destroy();

149
    if (ret < 0) {
150
        error_report("load of migration failed: %s", strerror(-ret));
151
        migrate_decompress_threads_join();
152
        exit(EXIT_FAILURE);
153 154 155
    }
    qemu_announce_self();

156
    /* Make sure all file formats flush their mutable metadata */
157 158
    bdrv_invalidate_cache_all(&local_err);
    if (local_err) {
159
        error_report_err(local_err);
160
        migrate_decompress_threads_join();
161 162
        exit(EXIT_FAILURE);
    }
163

164
    if (autostart) {
165
        vm_start();
166
    } else {
167
        runstate_set(RUN_STATE_PAUSED);
168
    }
169
    migrate_decompress_threads_join();
170 171
}

172 173 174 175 176 177
void process_incoming_migration(QEMUFile *f)
{
    Coroutine *co = qemu_coroutine_create(process_incoming_migration_co);
    int fd = qemu_get_fd(f);

    assert(fd != -1);
178
    migrate_decompress_threads_create();
179
    qemu_set_nonblock(fd);
180 181 182
    qemu_coroutine_enter(co, f);
}

183 184 185 186
/* amount of nanoseconds we are willing to wait for migration to be down.
 * the choice of nanoseconds is because it is the maximum resolution that
 * get_clock() can achieve. It is an internal measure. All user-visible
 * units must be in seconds */
187
static uint64_t max_downtime = 300000000;
188 189 190 191 192 193

uint64_t migrate_max_downtime(void)
{
    return max_downtime;
}

O
Orit Wasserman 已提交
194 195 196 197 198 199 200
MigrationCapabilityStatusList *qmp_query_migrate_capabilities(Error **errp)
{
    MigrationCapabilityStatusList *head = NULL;
    MigrationCapabilityStatusList *caps;
    MigrationState *s = migrate_get_current();
    int i;

201
    caps = NULL; /* silence compiler warning */
O
Orit Wasserman 已提交
202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218
    for (i = 0; i < MIGRATION_CAPABILITY_MAX; i++) {
        if (head == NULL) {
            head = g_malloc0(sizeof(*caps));
            caps = head;
        } else {
            caps->next = g_malloc0(sizeof(*caps));
            caps = caps->next;
        }
        caps->value =
            g_malloc(sizeof(*caps->value));
        caps->value->capability = i;
        caps->value->state = s->enabled_capabilities[i];
    }

    return head;
}

219 220 221 222 223 224 225 226 227 228 229 230 231 232 233
MigrationParameters *qmp_query_migrate_parameters(Error **errp)
{
    MigrationParameters *params;
    MigrationState *s = migrate_get_current();

    params = g_malloc0(sizeof(*params));
    params->compress_level = s->parameters[MIGRATION_PARAMETER_COMPRESS_LEVEL];
    params->compress_threads =
            s->parameters[MIGRATION_PARAMETER_COMPRESS_THREADS];
    params->decompress_threads =
            s->parameters[MIGRATION_PARAMETER_DECOMPRESS_THREADS];

    return params;
}

O
Orit Wasserman 已提交
234 235 236 237 238 239 240 241 242
static void get_xbzrle_cache_stats(MigrationInfo *info)
{
    if (migrate_use_xbzrle()) {
        info->has_xbzrle_cache = true;
        info->xbzrle_cache = g_malloc0(sizeof(*info->xbzrle_cache));
        info->xbzrle_cache->cache_size = migrate_xbzrle_cache_size();
        info->xbzrle_cache->bytes = xbzrle_mig_bytes_transferred();
        info->xbzrle_cache->pages = xbzrle_mig_pages_transferred();
        info->xbzrle_cache->cache_miss = xbzrle_mig_pages_cache_miss();
243
        info->xbzrle_cache->cache_miss_rate = xbzrle_mig_cache_miss_rate();
O
Orit Wasserman 已提交
244 245 246 247
        info->xbzrle_cache->overflow = xbzrle_mig_pages_overflow();
    }
}

L
Luiz Capitulino 已提交
248
MigrationInfo *qmp_query_migrate(Error **errp)
A
aliguori 已提交
249
{
L
Luiz Capitulino 已提交
250
    MigrationInfo *info = g_malloc0(sizeof(*info));
251 252 253
    MigrationState *s = migrate_get_current();

    switch (s->state) {
254
    case MIGRATION_STATUS_NONE:
255 256
        /* no migration has happened ever */
        break;
257
    case MIGRATION_STATUS_SETUP:
258
        info->has_status = true;
259
        info->has_total_time = false;
260
        break;
261 262
    case MIGRATION_STATUS_ACTIVE:
    case MIGRATION_STATUS_CANCELLING:
L
Luiz Capitulino 已提交
263
        info->has_status = true;
264
        info->has_total_time = true;
265
        info->total_time = qemu_clock_get_ms(QEMU_CLOCK_REALTIME)
266
            - s->total_time;
267 268
        info->has_expected_downtime = true;
        info->expected_downtime = s->expected_downtime;
269 270
        info->has_setup_time = true;
        info->setup_time = s->setup_time;
271

L
Luiz Capitulino 已提交
272 273 274 275 276
        info->has_ram = true;
        info->ram = g_malloc0(sizeof(*info->ram));
        info->ram->transferred = ram_bytes_transferred();
        info->ram->remaining = ram_bytes_remaining();
        info->ram->total = ram_bytes_total();
277
        info->ram->duplicate = dup_mig_pages_transferred();
278
        info->ram->skipped = skipped_mig_pages_transferred();
279 280
        info->ram->normal = norm_mig_pages_transferred();
        info->ram->normal_bytes = norm_mig_bytes_transferred();
281
        info->ram->dirty_pages_rate = s->dirty_pages_rate;
282
        info->ram->mbps = s->mbps;
283
        info->ram->dirty_sync_count = s->dirty_sync_count;
284

285
        if (blk_mig_active()) {
L
Luiz Capitulino 已提交
286 287 288 289 290
            info->has_disk = true;
            info->disk = g_malloc0(sizeof(*info->disk));
            info->disk->transferred = blk_mig_bytes_transferred();
            info->disk->remaining = blk_mig_bytes_remaining();
            info->disk->total = blk_mig_bytes_total();
A
aliguori 已提交
291
        }
O
Orit Wasserman 已提交
292 293

        get_xbzrle_cache_stats(info);
294
        break;
295
    case MIGRATION_STATUS_COMPLETED:
O
Orit Wasserman 已提交
296 297
        get_xbzrle_cache_stats(info);

L
Luiz Capitulino 已提交
298
        info->has_status = true;
299
        info->has_total_time = true;
300
        info->total_time = s->total_time;
301 302
        info->has_downtime = true;
        info->downtime = s->downtime;
303 304
        info->has_setup_time = true;
        info->setup_time = s->setup_time;
J
Juan Quintela 已提交
305 306 307 308 309 310

        info->has_ram = true;
        info->ram = g_malloc0(sizeof(*info->ram));
        info->ram->transferred = ram_bytes_transferred();
        info->ram->remaining = 0;
        info->ram->total = ram_bytes_total();
311
        info->ram->duplicate = dup_mig_pages_transferred();
312
        info->ram->skipped = skipped_mig_pages_transferred();
313 314
        info->ram->normal = norm_mig_pages_transferred();
        info->ram->normal_bytes = norm_mig_bytes_transferred();
315
        info->ram->mbps = s->mbps;
316
        info->ram->dirty_sync_count = s->dirty_sync_count;
317
        break;
318
    case MIGRATION_STATUS_FAILED:
L
Luiz Capitulino 已提交
319
        info->has_status = true;
320
        break;
321
    case MIGRATION_STATUS_CANCELLED:
L
Luiz Capitulino 已提交
322
        info->has_status = true;
323
        break;
A
aliguori 已提交
324
    }
325
    info->status = s->state;
L
Luiz Capitulino 已提交
326 327

    return info;
A
aliguori 已提交
328 329
}

O
Orit Wasserman 已提交
330 331 332 333 334 335
void qmp_migrate_set_capabilities(MigrationCapabilityStatusList *params,
                                  Error **errp)
{
    MigrationState *s = migrate_get_current();
    MigrationCapabilityStatusList *cap;

336 337
    if (s->state == MIGRATION_STATUS_ACTIVE ||
        s->state == MIGRATION_STATUS_SETUP) {
O
Orit Wasserman 已提交
338 339 340 341 342 343 344 345 346
        error_set(errp, QERR_MIGRATION_ACTIVE);
        return;
    }

    for (cap = params; cap; cap = cap->next) {
        s->enabled_capabilities[cap->value->capability] = cap->value->state;
    }
}

347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387
void qmp_migrate_set_parameters(bool has_compress_level,
                                int64_t compress_level,
                                bool has_compress_threads,
                                int64_t compress_threads,
                                bool has_decompress_threads,
                                int64_t decompress_threads, Error **errp)
{
    MigrationState *s = migrate_get_current();

    if (has_compress_level && (compress_level < 0 || compress_level > 9)) {
        error_set(errp, QERR_INVALID_PARAMETER_VALUE, "compress_level",
                  "is invalid, it should be in the range of 0 to 9");
        return;
    }
    if (has_compress_threads &&
            (compress_threads < 1 || compress_threads > 255)) {
        error_set(errp, QERR_INVALID_PARAMETER_VALUE,
                  "compress_threads",
                  "is invalid, it should be in the range of 1 to 255");
        return;
    }
    if (has_decompress_threads &&
            (decompress_threads < 1 || decompress_threads > 255)) {
        error_set(errp, QERR_INVALID_PARAMETER_VALUE,
                  "decompress_threads",
                  "is invalid, it should be in the range of 1 to 255");
        return;
    }

    if (has_compress_level) {
        s->parameters[MIGRATION_PARAMETER_COMPRESS_LEVEL] = compress_level;
    }
    if (has_compress_threads) {
        s->parameters[MIGRATION_PARAMETER_COMPRESS_THREADS] = compress_threads;
    }
    if (has_decompress_threads) {
        s->parameters[MIGRATION_PARAMETER_DECOMPRESS_THREADS] =
                                                    decompress_threads;
    }
}

388 389
/* shared migration helpers */

390 391 392 393 394 395 396
static void migrate_set_state(MigrationState *s, int old_state, int new_state)
{
    if (atomic_cmpxchg(&s->state, old_state, new_state) == new_state) {
        trace_migrate_set_state(new_state);
    }
}

397
static void migrate_fd_cleanup(void *opaque)
398
{
399 400 401 402 403
    MigrationState *s = opaque;

    qemu_bh_delete(s->cleanup_bh);
    s->cleanup_bh = NULL;

404
    if (s->file) {
405
        trace_migrate_fd_cleanup();
406 407 408 409
        qemu_mutex_unlock_iothread();
        qemu_thread_join(&s->thread);
        qemu_mutex_lock_iothread();

410
        migrate_compress_threads_join();
411 412
        qemu_fclose(s->file);
        s->file = NULL;
413 414
    }

415
    assert(s->state != MIGRATION_STATUS_ACTIVE);
416

417
    if (s->state != MIGRATION_STATUS_COMPLETED) {
418
        qemu_savevm_state_cancel();
419 420 421
        if (s->state == MIGRATION_STATUS_CANCELLING) {
            migrate_set_state(s, MIGRATION_STATUS_CANCELLING,
                              MIGRATION_STATUS_CANCELLED);
422
        }
423
    }
424 425

    notifier_list_notify(&migration_state_notifiers, s);
426 427
}

428
void migrate_fd_error(MigrationState *s)
429
{
430
    trace_migrate_fd_error();
431
    assert(s->file == NULL);
432 433
    s->state = MIGRATION_STATUS_FAILED;
    trace_migrate_set_state(MIGRATION_STATUS_FAILED);
434
    notifier_list_notify(&migration_state_notifiers, s);
435 436
}

437
static void migrate_fd_cancel(MigrationState *s)
438
{
439
    int old_state ;
440
    QEMUFile *f = migrate_get_current()->file;
441
    trace_migrate_fd_cancel();
442

443 444
    do {
        old_state = s->state;
445 446
        if (old_state != MIGRATION_STATUS_SETUP &&
            old_state != MIGRATION_STATUS_ACTIVE) {
447 448
            break;
        }
449 450
        migrate_set_state(s, old_state, MIGRATION_STATUS_CANCELLING);
    } while (s->state != MIGRATION_STATUS_CANCELLING);
451 452 453 454 455 456 457 458

    /*
     * If we're unlucky the migration code might be stuck somewhere in a
     * send/write while the network has failed and is waiting to timeout;
     * if we've got shutdown(2) available then we can force it to quit.
     * The outgoing qemu file gets closed in migrate_fd_cleanup that is
     * called in a bh, so there is no race against this cancel.
     */
459
    if (s->state == MIGRATION_STATUS_CANCELLING && f) {
460 461
        qemu_file_shutdown(f);
    }
462 463
}

464 465 466 467 468 469 470
void add_migration_state_change_notifier(Notifier *notify)
{
    notifier_list_add(&migration_state_notifiers, notify);
}

void remove_migration_state_change_notifier(Notifier *notify)
{
P
Paolo Bonzini 已提交
471
    notifier_remove(notify);
472 473
}

S
Stefan Hajnoczi 已提交
474
bool migration_in_setup(MigrationState *s)
475
{
476
    return s->state == MIGRATION_STATUS_SETUP;
477 478
}

479
bool migration_has_finished(MigrationState *s)
480
{
481
    return s->state == MIGRATION_STATUS_COMPLETED;
482
}
483

484 485
bool migration_has_failed(MigrationState *s)
{
486 487
    return (s->state == MIGRATION_STATUS_CANCELLED ||
            s->state == MIGRATION_STATUS_FAILED);
488 489
}

I
Isaku Yamahata 已提交
490
static MigrationState *migrate_init(const MigrationParams *params)
491
{
492
    MigrationState *s = migrate_get_current();
493
    int64_t bandwidth_limit = s->bandwidth_limit;
O
Orit Wasserman 已提交
494
    bool enabled_capabilities[MIGRATION_CAPABILITY_MAX];
495
    int64_t xbzrle_cache_size = s->xbzrle_cache_size;
496 497 498 499 500
    int compress_level = s->parameters[MIGRATION_PARAMETER_COMPRESS_LEVEL];
    int compress_thread_count =
            s->parameters[MIGRATION_PARAMETER_COMPRESS_THREADS];
    int decompress_thread_count =
            s->parameters[MIGRATION_PARAMETER_DECOMPRESS_THREADS];
O
Orit Wasserman 已提交
501 502 503

    memcpy(enabled_capabilities, s->enabled_capabilities,
           sizeof(enabled_capabilities));
504

505
    memset(s, 0, sizeof(*s));
I
Isaku Yamahata 已提交
506
    s->params = *params;
O
Orit Wasserman 已提交
507 508
    memcpy(s->enabled_capabilities, enabled_capabilities,
           sizeof(enabled_capabilities));
509
    s->xbzrle_cache_size = xbzrle_cache_size;
510

511 512 513 514 515
    s->parameters[MIGRATION_PARAMETER_COMPRESS_LEVEL] = compress_level;
    s->parameters[MIGRATION_PARAMETER_COMPRESS_THREADS] =
               compress_thread_count;
    s->parameters[MIGRATION_PARAMETER_DECOMPRESS_THREADS] =
               decompress_thread_count;
516
    s->bandwidth_limit = bandwidth_limit;
517 518
    s->state = MIGRATION_STATUS_SETUP;
    trace_migrate_set_state(MIGRATION_STATUS_SETUP);
519

520
    s->total_time = qemu_clock_get_ms(QEMU_CLOCK_REALTIME);
521 522
    return s;
}
523

A
Anthony Liguori 已提交
524 525 526 527 528 529 530 531 532 533 534 535
static GSList *migration_blockers;

void migrate_add_blocker(Error *reason)
{
    migration_blockers = g_slist_prepend(migration_blockers, reason);
}

void migrate_del_blocker(Error *reason)
{
    migration_blockers = g_slist_remove(migration_blockers, reason);
}

D
Dr. David Alan Gilbert 已提交
536 537 538
void qmp_migrate_incoming(const char *uri, Error **errp)
{
    Error *local_err = NULL;
539
    static bool once = true;
D
Dr. David Alan Gilbert 已提交
540 541

    if (!deferred_incoming) {
542
        error_setg(errp, "For use with '-incoming defer'");
D
Dr. David Alan Gilbert 已提交
543 544
        return;
    }
545 546 547
    if (!once) {
        error_setg(errp, "The incoming migration has already been started");
    }
D
Dr. David Alan Gilbert 已提交
548 549 550 551 552 553 554 555

    qemu_start_incoming_migration(uri, &local_err);

    if (local_err) {
        error_propagate(errp, local_err);
        return;
    }

556
    once = false;
D
Dr. David Alan Gilbert 已提交
557 558
}

L
Luiz Capitulino 已提交
559 560 561
void qmp_migrate(const char *uri, bool has_blk, bool blk,
                 bool has_inc, bool inc, bool has_detach, bool detach,
                 Error **errp)
562
{
563
    Error *local_err = NULL;
564
    MigrationState *s = migrate_get_current();
I
Isaku Yamahata 已提交
565
    MigrationParams params;
566 567
    const char *p;

568 569
    params.blk = has_blk && blk;
    params.shared = has_inc && inc;
I
Isaku Yamahata 已提交
570

571 572 573
    if (s->state == MIGRATION_STATUS_ACTIVE ||
        s->state == MIGRATION_STATUS_SETUP ||
        s->state == MIGRATION_STATUS_CANCELLING) {
L
Luiz Capitulino 已提交
574 575
        error_set(errp, QERR_MIGRATION_ACTIVE);
        return;
576 577
    }

578 579 580 581 582
    if (runstate_check(RUN_STATE_INMIGRATE)) {
        error_setg(errp, "Guest is waiting for an incoming migration");
        return;
    }

L
Luiz Capitulino 已提交
583 584
    if (qemu_savevm_state_blocked(errp)) {
        return;
585 586
    }

A
Anthony Liguori 已提交
587
    if (migration_blockers) {
L
Luiz Capitulino 已提交
588 589
        *errp = error_copy(migration_blockers->data);
        return;
A
Anthony Liguori 已提交
590 591
    }

I
Isaku Yamahata 已提交
592
    s = migrate_init(&params);
593 594

    if (strstart(uri, "tcp:", &p)) {
595
        tcp_start_outgoing_migration(s, p, &local_err);
M
Michael R. Hines 已提交
596
#ifdef CONFIG_RDMA
597
    } else if (strstart(uri, "rdma:", &p)) {
M
Michael R. Hines 已提交
598 599
        rdma_start_outgoing_migration(s, p, &local_err);
#endif
600 601
#if !defined(WIN32)
    } else if (strstart(uri, "exec:", &p)) {
602
        exec_start_outgoing_migration(s, p, &local_err);
603
    } else if (strstart(uri, "unix:", &p)) {
604
        unix_start_outgoing_migration(s, p, &local_err);
605
    } else if (strstart(uri, "fd:", &p)) {
606
        fd_start_outgoing_migration(s, p, &local_err);
607
#endif
608
    } else {
L
Luiz Capitulino 已提交
609
        error_set(errp, QERR_INVALID_PARAMETER_VALUE, "uri", "a valid migration protocol");
610
        s->state = MIGRATION_STATUS_FAILED;
L
Luiz Capitulino 已提交
611
        return;
612 613
    }

614
    if (local_err) {
615
        migrate_fd_error(s);
616
        error_propagate(errp, local_err);
L
Luiz Capitulino 已提交
617
        return;
618
    }
619 620
}

L
Luiz Capitulino 已提交
621
void qmp_migrate_cancel(Error **errp)
622
{
623
    migrate_fd_cancel(migrate_get_current());
624 625
}

626 627 628
void qmp_migrate_set_cache_size(int64_t value, Error **errp)
{
    MigrationState *s = migrate_get_current();
629
    int64_t new_size;
630 631 632 633 634 635 636 637

    /* Check for truncation */
    if (value != (size_t)value) {
        error_set(errp, QERR_INVALID_PARAMETER_VALUE, "cache size",
                  "exceeding address space");
        return;
    }

638 639 640 641 642 643 644
    /* Cache should not be larger than guest ram size */
    if (value > ram_bytes_total()) {
        error_set(errp, QERR_INVALID_PARAMETER_VALUE, "cache size",
                  "exceeds guest ram size ");
        return;
    }

645 646 647 648 649 650 651 652
    new_size = xbzrle_cache_resize(value);
    if (new_size < 0) {
        error_set(errp, QERR_INVALID_PARAMETER_VALUE, "cache size",
                  "is smaller than page size");
        return;
    }

    s->xbzrle_cache_size = new_size;
653 654 655 656 657 658 659
}

int64_t qmp_query_migrate_cache_size(Error **errp)
{
    return migrate_xbzrle_cache_size();
}

L
Luiz Capitulino 已提交
660
void qmp_migrate_set_speed(int64_t value, Error **errp)
661 662 663
{
    MigrationState *s;

L
Luiz Capitulino 已提交
664 665
    if (value < 0) {
        value = 0;
666
    }
667 668 669
    if (value > SIZE_MAX) {
        value = SIZE_MAX;
    }
670

671
    s = migrate_get_current();
L
Luiz Capitulino 已提交
672
    s->bandwidth_limit = value;
673 674 675
    if (s->file) {
        qemu_file_set_rate_limit(s->file, s->bandwidth_limit / XFER_LIMIT_RATIO);
    }
676 677
}

678
void qmp_migrate_set_downtime(double value, Error **errp)
679
{
680 681 682
    value *= 1e9;
    value = MAX(0, MIN(UINT64_MAX, value));
    max_downtime = (uint64_t)value;
683
}
684

685 686 687 688 689 690 691 692 693
bool migrate_auto_converge(void)
{
    MigrationState *s;

    s = migrate_get_current();

    return s->enabled_capabilities[MIGRATION_CAPABILITY_AUTO_CONVERGE];
}

694 695 696 697 698 699 700 701 702
bool migrate_zero_blocks(void)
{
    MigrationState *s;

    s = migrate_get_current();

    return s->enabled_capabilities[MIGRATION_CAPABILITY_ZERO_BLOCKS];
}

703 704
bool migrate_use_compression(void)
{
705 706 707 708 709
    MigrationState *s;

    s = migrate_get_current();

    return s->enabled_capabilities[MIGRATION_CAPABILITY_COMPRESS];
710 711 712 713 714 715 716 717
}

int migrate_compress_level(void)
{
    MigrationState *s;

    s = migrate_get_current();

718
    return s->parameters[MIGRATION_PARAMETER_COMPRESS_LEVEL];
719 720 721 722 723 724 725 726
}

int migrate_compress_threads(void)
{
    MigrationState *s;

    s = migrate_get_current();

727
    return s->parameters[MIGRATION_PARAMETER_COMPRESS_THREADS];
728 729
}

730 731 732 733 734 735
int migrate_decompress_threads(void)
{
    MigrationState *s;

    s = migrate_get_current();

736
    return s->parameters[MIGRATION_PARAMETER_DECOMPRESS_THREADS];
737 738
}

739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755
int migrate_use_xbzrle(void)
{
    MigrationState *s;

    s = migrate_get_current();

    return s->enabled_capabilities[MIGRATION_CAPABILITY_XBZRLE];
}

int64_t migrate_xbzrle_cache_size(void)
{
    MigrationState *s;

    s = migrate_get_current();

    return s->xbzrle_cache_size;
}
756 757 758

/* migration thread support */

J
Juan Quintela 已提交
759
static void *migration_thread(void *opaque)
760
{
761
    MigrationState *s = opaque;
762 763
    int64_t initial_time = qemu_clock_get_ms(QEMU_CLOCK_REALTIME);
    int64_t setup_start = qemu_clock_get_ms(QEMU_CLOCK_HOST);
764
    int64_t initial_bytes = 0;
765
    int64_t max_size = 0;
766 767
    int64_t start_time = initial_time;
    bool old_vm_running = false;
768

769
    qemu_savevm_state_header(s->file);
770
    qemu_savevm_state_begin(s->file, &s->params);
771

772
    s->setup_time = qemu_clock_get_ms(QEMU_CLOCK_HOST) - setup_start;
773
    migrate_set_state(s, MIGRATION_STATUS_SETUP, MIGRATION_STATUS_ACTIVE);
774

775
    while (s->state == MIGRATION_STATUS_ACTIVE) {
776
        int64_t current_time;
777
        uint64_t pending_size;
778

779
        if (!qemu_file_rate_limit(s->file)) {
780
            pending_size = qemu_savevm_state_pending(s->file, max_size);
781
            trace_migrate_pending(pending_size, max_size);
782
            if (pending_size && pending_size >= max_size) {
783
                qemu_savevm_state_iterate(s->file);
784
            } else {
785 786
                int ret;

787
                qemu_mutex_lock_iothread();
788
                start_time = qemu_clock_get_ms(QEMU_CLOCK_REALTIME);
789
                qemu_system_wakeup_request(QEMU_WAKEUP_REASON_OTHER);
790
                old_vm_running = runstate_is_running();
791 792 793

                ret = vm_stop_force_state(RUN_STATE_FINISH_MIGRATE);
                if (ret >= 0) {
M
Matthew Garrett 已提交
794
                    qemu_file_set_rate_limit(s->file, INT64_MAX);
795 796
                    qemu_savevm_state_complete(s->file);
                }
797
                qemu_mutex_unlock_iothread();
798 799

                if (ret < 0) {
800 801
                    migrate_set_state(s, MIGRATION_STATUS_ACTIVE,
                                      MIGRATION_STATUS_FAILED);
802 803 804
                    break;
                }

P
Paolo Bonzini 已提交
805
                if (!qemu_file_get_error(s->file)) {
806 807
                    migrate_set_state(s, MIGRATION_STATUS_ACTIVE,
                                      MIGRATION_STATUS_COMPLETED);
P
Paolo Bonzini 已提交
808 809
                    break;
                }
810 811
            }
        }
812

813
        if (qemu_file_get_error(s->file)) {
814 815
            migrate_set_state(s, MIGRATION_STATUS_ACTIVE,
                              MIGRATION_STATUS_FAILED);
816 817
            break;
        }
818
        current_time = qemu_clock_get_ms(QEMU_CLOCK_REALTIME);
819
        if (current_time >= initial_time + BUFFER_DELAY) {
820
            uint64_t transferred_bytes = qemu_ftell(s->file) - initial_bytes;
821
            uint64_t time_spent = current_time - initial_time;
822 823 824
            double bandwidth = transferred_bytes / time_spent;
            max_size = bandwidth * migrate_max_downtime() / 1000000;

825 826 827
            s->mbps = time_spent ? (((double) transferred_bytes * 8.0) /
                    ((double) time_spent / 1000.0)) / 1000.0 / 1000.0 : -1;

828 829
            trace_migrate_transferred(transferred_bytes, time_spent,
                                      bandwidth, max_size);
830 831 832 833 834
            /* if we haven't sent anything, we don't want to recalculate
               10000 is a small enough number for our purposes */
            if (s->dirty_bytes_rate && transferred_bytes > 10000) {
                s->expected_downtime = s->dirty_bytes_rate / bandwidth;
            }
835

836
            qemu_file_reset_rate_limit(s->file);
837
            initial_time = current_time;
838
            initial_bytes = qemu_ftell(s->file);
839
        }
840
        if (qemu_file_rate_limit(s->file)) {
841 842 843
            /* usleep expects microseconds */
            g_usleep((initial_time + BUFFER_DELAY - current_time)*1000);
        }
844 845
    }

846
    qemu_mutex_lock_iothread();
847
    if (s->state == MIGRATION_STATUS_COMPLETED) {
848
        int64_t end_time = qemu_clock_get_ms(QEMU_CLOCK_REALTIME);
849
        uint64_t transferred_bytes = qemu_ftell(s->file);
850 851
        s->total_time = end_time - s->total_time;
        s->downtime = end_time - start_time;
852 853 854 855
        if (s->total_time) {
            s->mbps = (((double) transferred_bytes * 8.0) /
                       ((double) s->total_time)) / 1000;
        }
856 857 858 859
        runstate_set(RUN_STATE_POSTMIGRATE);
    } else {
        if (old_vm_running) {
            vm_start();
860
        }
861
    }
862
    qemu_bh_schedule(s->cleanup_bh);
863
    qemu_mutex_unlock_iothread();
864

865 866 867
    return NULL;
}

868
void migrate_fd_connect(MigrationState *s)
869
{
870 871
    /* This is a best 1st approximation. ns to ms */
    s->expected_downtime = max_downtime/1000000;
872
    s->cleanup_bh = qemu_bh_new(migrate_fd_cleanup, s);
873

874 875 876
    qemu_file_set_rate_limit(s->file,
                             s->bandwidth_limit / XFER_LIMIT_RATIO);

877 878 879
    /* Notify before starting migration thread */
    notifier_list_notify(&migration_state_notifiers, s);

880
    migrate_compress_threads_create();
881
    qemu_thread_create(&s->thread, "migration", migration_thread, s,
882
                       QEMU_THREAD_JOINABLE);
883
}