1 /* 2 * QTest testcase for migration 3 * 4 * Copyright (c) 2016-2018 Red Hat, Inc. and/or its affiliates 5 * based on the vhost-user-test.c that is: 6 * Copyright (c) 2014 Virtual Open Systems Sarl. 7 * 8 * This work is licensed under the terms of the GNU GPL, version 2 or later. 9 * See the COPYING file in the top-level directory. 10 * 11 */ 12 13 #include "qemu/osdep.h" 14 15 #include "libqtest.h" 16 #include "qapi/error.h" 17 #include "qapi/qmp/qdict.h" 18 #include "qemu/module.h" 19 #include "qemu/option.h" 20 #include "qemu/range.h" 21 #include "qemu/sockets.h" 22 #include "chardev/char.h" 23 #include "qapi/qapi-visit-sockets.h" 24 #include "qapi/qobject-input-visitor.h" 25 #include "qapi/qobject-output-visitor.h" 26 #include "crypto/tlscredspsk.h" 27 #include "qapi/qmp/qlist.h" 28 29 #include "migration-helpers.h" 30 #include "tests/migration/migration-test.h" 31 #ifdef CONFIG_GNUTLS 32 # include "tests/unit/crypto-tls-psk-helpers.h" 33 # ifdef CONFIG_TASN1 34 # include "tests/unit/crypto-tls-x509-helpers.h" 35 # endif /* CONFIG_TASN1 */ 36 #endif /* CONFIG_GNUTLS */ 37 38 /* For dirty ring test; so far only x86_64 is supported */ 39 #if defined(__linux__) && defined(HOST_X86_64) 40 #include "linux/kvm.h" 41 #endif 42 43 unsigned start_address; 44 unsigned end_address; 45 static bool uffd_feature_thread_id; 46 static QTestMigrationState src_state; 47 static QTestMigrationState dst_state; 48 49 /* 50 * An initial 3 MB offset is used as that corresponds 51 * to ~1 sec of data transfer with our bandwidth setting. 52 */ 53 #define MAGIC_OFFSET_BASE (3 * 1024 * 1024) 54 /* 55 * A further 1k is added to ensure we're not a multiple 56 * of TEST_MEM_PAGE_SIZE, thus avoid clash with writes 57 * from the migration guest workload. 58 */ 59 #define MAGIC_OFFSET_SHUFFLE 1024 60 #define MAGIC_OFFSET (MAGIC_OFFSET_BASE + MAGIC_OFFSET_SHUFFLE) 61 #define MAGIC_MARKER 0xFEED12345678CAFEULL 62 63 /* 64 * Dirtylimit stop working if dirty page rate error 65 * value less than DIRTYLIMIT_TOLERANCE_RANGE 66 */ 67 #define DIRTYLIMIT_TOLERANCE_RANGE 25 /* MB/s */ 68 69 #define ANALYZE_SCRIPT "scripts/analyze-migration.py" 70 71 #define QEMU_VM_FILE_MAGIC 0x5145564d 72 #define FILE_TEST_FILENAME "migfile" 73 #define FILE_TEST_OFFSET 0x1000 74 #define QEMU_ENV_SRC "QTEST_QEMU_BINARY_SRC" 75 #define QEMU_ENV_DST "QTEST_QEMU_BINARY_DST" 76 77 #if defined(__linux__) 78 #include <sys/syscall.h> 79 #include <sys/vfs.h> 80 #endif 81 82 #if defined(__linux__) && defined(__NR_userfaultfd) && defined(CONFIG_EVENTFD) 83 #include <sys/eventfd.h> 84 #include <sys/ioctl.h> 85 #include "qemu/userfaultfd.h" 86 87 static bool ufd_version_check(void) 88 { 89 struct uffdio_api api_struct; 90 uint64_t ioctl_mask; 91 92 int ufd = uffd_open(O_CLOEXEC); 93 94 if (ufd == -1) { 95 g_test_message("Skipping test: userfaultfd not available"); 96 return false; 97 } 98 99 api_struct.api = UFFD_API; 100 api_struct.features = 0; 101 if (ioctl(ufd, UFFDIO_API, &api_struct)) { 102 g_test_message("Skipping test: UFFDIO_API failed"); 103 return false; 104 } 105 uffd_feature_thread_id = api_struct.features & UFFD_FEATURE_THREAD_ID; 106 107 ioctl_mask = 1ULL << _UFFDIO_REGISTER | 108 1ULL << _UFFDIO_UNREGISTER; 109 if ((api_struct.ioctls & ioctl_mask) != ioctl_mask) { 110 g_test_message("Skipping test: Missing userfault feature"); 111 return false; 112 } 113 114 return true; 115 } 116 117 #else 118 static bool ufd_version_check(void) 119 { 120 g_test_message("Skipping test: Userfault not available (builtdtime)"); 121 return false; 122 } 123 124 #endif 125 126 static char *tmpfs; 127 static char *bootpath; 128 129 /* The boot file modifies memory area in [start_address, end_address) 130 * repeatedly. It outputs a 'B' at a fixed rate while it's still running. 131 */ 132 #include "tests/migration/i386/a-b-bootblock.h" 133 #include "tests/migration/aarch64/a-b-kernel.h" 134 #include "tests/migration/s390x/a-b-bios.h" 135 136 static void bootfile_create(char *dir, bool suspend_me) 137 { 138 const char *arch = qtest_get_arch(); 139 unsigned char *content; 140 size_t len; 141 142 bootpath = g_strdup_printf("%s/bootsect", dir); 143 if (strcmp(arch, "i386") == 0 || strcmp(arch, "x86_64") == 0) { 144 /* the assembled x86 boot sector should be exactly one sector large */ 145 g_assert(sizeof(x86_bootsect) == 512); 146 x86_bootsect[SYM_suspend_me - SYM_start] = suspend_me; 147 content = x86_bootsect; 148 len = sizeof(x86_bootsect); 149 } else if (g_str_equal(arch, "s390x")) { 150 content = s390x_elf; 151 len = sizeof(s390x_elf); 152 } else if (strcmp(arch, "ppc64") == 0) { 153 /* 154 * sane architectures can be programmed at the boot prompt 155 */ 156 return; 157 } else if (strcmp(arch, "aarch64") == 0) { 158 content = aarch64_kernel; 159 len = sizeof(aarch64_kernel); 160 g_assert(sizeof(aarch64_kernel) <= ARM_TEST_MAX_KERNEL_SIZE); 161 } else { 162 g_assert_not_reached(); 163 } 164 165 FILE *bootfile = fopen(bootpath, "wb"); 166 167 g_assert_cmpint(fwrite(content, len, 1, bootfile), ==, 1); 168 fclose(bootfile); 169 } 170 171 static void bootfile_delete(void) 172 { 173 unlink(bootpath); 174 g_free(bootpath); 175 bootpath = NULL; 176 } 177 178 /* 179 * Wait for some output in the serial output file, 180 * we get an 'A' followed by an endless string of 'B's 181 * but on the destination we won't have the A (unless we enabled suspend/resume) 182 */ 183 static void wait_for_serial(const char *side) 184 { 185 g_autofree char *serialpath = g_strdup_printf("%s/%s", tmpfs, side); 186 FILE *serialfile = fopen(serialpath, "r"); 187 const char *arch = qtest_get_arch(); 188 int started = (strcmp(side, "src_serial") == 0 && 189 strcmp(arch, "ppc64") == 0) ? 0 : 1; 190 191 do { 192 int readvalue = fgetc(serialfile); 193 194 if (!started) { 195 /* SLOF prints its banner before starting test, 196 * to ignore it, mark the start of the test with '_', 197 * ignore all characters until this marker 198 */ 199 switch (readvalue) { 200 case '_': 201 started = 1; 202 break; 203 case EOF: 204 fseek(serialfile, 0, SEEK_SET); 205 usleep(1000); 206 break; 207 } 208 continue; 209 } 210 switch (readvalue) { 211 case 'A': 212 /* Fine */ 213 break; 214 215 case 'B': 216 /* It's alive! */ 217 fclose(serialfile); 218 return; 219 220 case EOF: 221 started = (strcmp(side, "src_serial") == 0 && 222 strcmp(arch, "ppc64") == 0) ? 0 : 1; 223 fseek(serialfile, 0, SEEK_SET); 224 usleep(1000); 225 break; 226 227 default: 228 fprintf(stderr, "Unexpected %d on %s serial\n", readvalue, side); 229 g_assert_not_reached(); 230 } 231 } while (true); 232 } 233 234 static void wait_for_stop(QTestState *who, QTestMigrationState *state) 235 { 236 if (!state->stop_seen) { 237 qtest_qmp_eventwait(who, "STOP"); 238 } 239 } 240 241 static void wait_for_resume(QTestState *who, QTestMigrationState *state) 242 { 243 if (!state->resume_seen) { 244 qtest_qmp_eventwait(who, "RESUME"); 245 } 246 } 247 248 static void wait_for_suspend(QTestState *who, QTestMigrationState *state) 249 { 250 if (state->suspend_me && !state->suspend_seen) { 251 qtest_qmp_eventwait(who, "SUSPEND"); 252 } 253 } 254 255 /* 256 * It's tricky to use qemu's migration event capability with qtest, 257 * events suddenly appearing confuse the qmp()/hmp() responses. 258 */ 259 260 static int64_t read_ram_property_int(QTestState *who, const char *property) 261 { 262 QDict *rsp_return, *rsp_ram; 263 int64_t result; 264 265 rsp_return = migrate_query_not_failed(who); 266 if (!qdict_haskey(rsp_return, "ram")) { 267 /* Still in setup */ 268 result = 0; 269 } else { 270 rsp_ram = qdict_get_qdict(rsp_return, "ram"); 271 result = qdict_get_try_int(rsp_ram, property, 0); 272 } 273 qobject_unref(rsp_return); 274 return result; 275 } 276 277 static int64_t read_migrate_property_int(QTestState *who, const char *property) 278 { 279 QDict *rsp_return; 280 int64_t result; 281 282 rsp_return = migrate_query_not_failed(who); 283 result = qdict_get_try_int(rsp_return, property, 0); 284 qobject_unref(rsp_return); 285 return result; 286 } 287 288 static uint64_t get_migration_pass(QTestState *who) 289 { 290 return read_ram_property_int(who, "dirty-sync-count"); 291 } 292 293 static void read_blocktime(QTestState *who) 294 { 295 QDict *rsp_return; 296 297 rsp_return = migrate_query_not_failed(who); 298 g_assert(qdict_haskey(rsp_return, "postcopy-blocktime")); 299 qobject_unref(rsp_return); 300 } 301 302 /* 303 * Wait for two changes in the migration pass count, but bail if we stop. 304 */ 305 static void wait_for_migration_pass(QTestState *who) 306 { 307 uint64_t pass, prev_pass = 0, changes = 0; 308 309 while (changes < 2 && !src_state.stop_seen && !src_state.suspend_seen) { 310 usleep(1000); 311 pass = get_migration_pass(who); 312 changes += (pass != prev_pass); 313 prev_pass = pass; 314 } 315 } 316 317 static void check_guests_ram(QTestState *who) 318 { 319 /* Our ASM test will have been incrementing one byte from each page from 320 * start_address to < end_address in order. This gives us a constraint 321 * that any page's byte should be equal or less than the previous pages 322 * byte (mod 256); and they should all be equal except for one transition 323 * at the point where we meet the incrementer. (We're running this with 324 * the guest stopped). 325 */ 326 unsigned address; 327 uint8_t first_byte; 328 uint8_t last_byte; 329 bool hit_edge = false; 330 int bad = 0; 331 332 qtest_memread(who, start_address, &first_byte, 1); 333 last_byte = first_byte; 334 335 for (address = start_address + TEST_MEM_PAGE_SIZE; address < end_address; 336 address += TEST_MEM_PAGE_SIZE) 337 { 338 uint8_t b; 339 qtest_memread(who, address, &b, 1); 340 if (b != last_byte) { 341 if (((b + 1) % 256) == last_byte && !hit_edge) { 342 /* This is OK, the guest stopped at the point of 343 * incrementing the previous page but didn't get 344 * to us yet. 345 */ 346 hit_edge = true; 347 last_byte = b; 348 } else { 349 bad++; 350 if (bad <= 10) { 351 fprintf(stderr, "Memory content inconsistency at %x" 352 " first_byte = %x last_byte = %x current = %x" 353 " hit_edge = %x\n", 354 address, first_byte, last_byte, b, hit_edge); 355 } 356 } 357 } 358 } 359 if (bad >= 10) { 360 fprintf(stderr, "and in another %d pages", bad - 10); 361 } 362 g_assert(bad == 0); 363 } 364 365 static void cleanup(const char *filename) 366 { 367 g_autofree char *path = g_strdup_printf("%s/%s", tmpfs, filename); 368 369 unlink(path); 370 } 371 372 static char *SocketAddress_to_str(SocketAddress *addr) 373 { 374 switch (addr->type) { 375 case SOCKET_ADDRESS_TYPE_INET: 376 return g_strdup_printf("tcp:%s:%s", 377 addr->u.inet.host, 378 addr->u.inet.port); 379 case SOCKET_ADDRESS_TYPE_UNIX: 380 return g_strdup_printf("unix:%s", 381 addr->u.q_unix.path); 382 case SOCKET_ADDRESS_TYPE_FD: 383 return g_strdup_printf("fd:%s", addr->u.fd.str); 384 case SOCKET_ADDRESS_TYPE_VSOCK: 385 return g_strdup_printf("tcp:%s:%s", 386 addr->u.vsock.cid, 387 addr->u.vsock.port); 388 default: 389 return g_strdup("unknown address type"); 390 } 391 } 392 393 static char *migrate_get_socket_address(QTestState *who, const char *parameter) 394 { 395 QDict *rsp; 396 char *result; 397 SocketAddressList *addrs; 398 Visitor *iv = NULL; 399 QObject *object; 400 401 rsp = migrate_query(who); 402 object = qdict_get(rsp, parameter); 403 404 iv = qobject_input_visitor_new(object); 405 visit_type_SocketAddressList(iv, NULL, &addrs, &error_abort); 406 visit_free(iv); 407 408 /* we are only using a single address */ 409 result = SocketAddress_to_str(addrs->value); 410 411 qapi_free_SocketAddressList(addrs); 412 qobject_unref(rsp); 413 return result; 414 } 415 416 static long long migrate_get_parameter_int(QTestState *who, 417 const char *parameter) 418 { 419 QDict *rsp; 420 long long result; 421 422 rsp = qtest_qmp_assert_success_ref( 423 who, "{ 'execute': 'query-migrate-parameters' }"); 424 result = qdict_get_int(rsp, parameter); 425 qobject_unref(rsp); 426 return result; 427 } 428 429 static void migrate_check_parameter_int(QTestState *who, const char *parameter, 430 long long value) 431 { 432 long long result; 433 434 result = migrate_get_parameter_int(who, parameter); 435 g_assert_cmpint(result, ==, value); 436 } 437 438 static void migrate_set_parameter_int(QTestState *who, const char *parameter, 439 long long value) 440 { 441 qtest_qmp_assert_success(who, 442 "{ 'execute': 'migrate-set-parameters'," 443 "'arguments': { %s: %lld } }", 444 parameter, value); 445 migrate_check_parameter_int(who, parameter, value); 446 } 447 448 static char *migrate_get_parameter_str(QTestState *who, 449 const char *parameter) 450 { 451 QDict *rsp; 452 char *result; 453 454 rsp = qtest_qmp_assert_success_ref( 455 who, "{ 'execute': 'query-migrate-parameters' }"); 456 result = g_strdup(qdict_get_str(rsp, parameter)); 457 qobject_unref(rsp); 458 return result; 459 } 460 461 static void migrate_check_parameter_str(QTestState *who, const char *parameter, 462 const char *value) 463 { 464 g_autofree char *result = migrate_get_parameter_str(who, parameter); 465 g_assert_cmpstr(result, ==, value); 466 } 467 468 static void migrate_set_parameter_str(QTestState *who, const char *parameter, 469 const char *value) 470 { 471 qtest_qmp_assert_success(who, 472 "{ 'execute': 'migrate-set-parameters'," 473 "'arguments': { %s: %s } }", 474 parameter, value); 475 migrate_check_parameter_str(who, parameter, value); 476 } 477 478 static long long migrate_get_parameter_bool(QTestState *who, 479 const char *parameter) 480 { 481 QDict *rsp; 482 int result; 483 484 rsp = qtest_qmp_assert_success_ref( 485 who, "{ 'execute': 'query-migrate-parameters' }"); 486 result = qdict_get_bool(rsp, parameter); 487 qobject_unref(rsp); 488 return !!result; 489 } 490 491 static void migrate_check_parameter_bool(QTestState *who, const char *parameter, 492 int value) 493 { 494 int result; 495 496 result = migrate_get_parameter_bool(who, parameter); 497 g_assert_cmpint(result, ==, value); 498 } 499 500 static void migrate_set_parameter_bool(QTestState *who, const char *parameter, 501 int value) 502 { 503 qtest_qmp_assert_success(who, 504 "{ 'execute': 'migrate-set-parameters'," 505 "'arguments': { %s: %i } }", 506 parameter, value); 507 migrate_check_parameter_bool(who, parameter, value); 508 } 509 510 static void migrate_ensure_non_converge(QTestState *who) 511 { 512 /* Can't converge with 1ms downtime + 3 mbs bandwidth limit */ 513 migrate_set_parameter_int(who, "max-bandwidth", 3 * 1000 * 1000); 514 migrate_set_parameter_int(who, "downtime-limit", 1); 515 } 516 517 static void migrate_ensure_converge(QTestState *who) 518 { 519 /* Should converge with 30s downtime + 1 gbs bandwidth limit */ 520 migrate_set_parameter_int(who, "max-bandwidth", 1 * 1000 * 1000 * 1000); 521 migrate_set_parameter_int(who, "downtime-limit", 30 * 1000); 522 } 523 524 /* 525 * Our goal is to ensure that we run a single full migration 526 * iteration, and also dirty memory, ensuring that at least 527 * one further iteration is required. 528 * 529 * We can't directly synchronize with the start of a migration 530 * so we have to apply some tricks monitoring memory that is 531 * transferred. 532 * 533 * Initially we set the migration bandwidth to an insanely 534 * low value, with tiny max downtime too. This basically 535 * guarantees migration will never complete. 536 * 537 * This will result in a test that is unacceptably slow though, 538 * so we can't let the entire migration pass run at this speed. 539 * Our intent is to let it run just long enough that we can 540 * prove data prior to the marker has been transferred *AND* 541 * also prove this transferred data is dirty again. 542 * 543 * Before migration starts, we write a 64-bit magic marker 544 * into a fixed location in the src VM RAM. 545 * 546 * Then watch dst memory until the marker appears. This is 547 * proof that start_address -> MAGIC_OFFSET_BASE has been 548 * transferred. 549 * 550 * Finally we go back to the source and read a byte just 551 * before the marker until we see it flip in value. This 552 * is proof that start_address -> MAGIC_OFFSET_BASE 553 * is now dirty again. 554 * 555 * IOW, we're guaranteed at least a 2nd migration pass 556 * at this point. 557 * 558 * We can now let migration run at full speed to finish 559 * the test 560 */ 561 static void migrate_prepare_for_dirty_mem(QTestState *from) 562 { 563 /* 564 * The guest workflow iterates from start_address to 565 * end_address, writing 1 byte every TEST_MEM_PAGE_SIZE 566 * bytes. 567 * 568 * IOW, if we write to mem at a point which is NOT 569 * a multiple of TEST_MEM_PAGE_SIZE, our write won't 570 * conflict with the migration workflow. 571 * 572 * We put in a marker here, that we'll use to determine 573 * when the data has been transferred to the dst. 574 */ 575 qtest_writeq(from, start_address + MAGIC_OFFSET, MAGIC_MARKER); 576 } 577 578 static void migrate_wait_for_dirty_mem(QTestState *from, 579 QTestState *to) 580 { 581 uint64_t watch_address = start_address + MAGIC_OFFSET_BASE; 582 uint64_t marker_address = start_address + MAGIC_OFFSET; 583 uint8_t watch_byte; 584 585 /* 586 * Wait for the MAGIC_MARKER to get transferred, as an 587 * indicator that a migration pass has made some known 588 * amount of progress. 589 */ 590 do { 591 usleep(1000 * 10); 592 } while (qtest_readq(to, marker_address) != MAGIC_MARKER); 593 594 595 /* If suspended, src only iterates once, and watch_byte may never change */ 596 if (src_state.suspend_me) { 597 return; 598 } 599 600 /* 601 * Now ensure that already transferred bytes are 602 * dirty again from the guest workload. Note the 603 * guest byte value will wrap around and by chance 604 * match the original watch_byte. This is harmless 605 * as we'll eventually see a different value if we 606 * keep watching 607 */ 608 watch_byte = qtest_readb(from, watch_address); 609 do { 610 usleep(1000 * 10); 611 } while (qtest_readb(from, watch_address) == watch_byte); 612 } 613 614 615 static void migrate_pause(QTestState *who) 616 { 617 qtest_qmp_assert_success(who, "{ 'execute': 'migrate-pause' }"); 618 } 619 620 static void migrate_continue(QTestState *who, const char *state) 621 { 622 qtest_qmp_assert_success(who, 623 "{ 'execute': 'migrate-continue'," 624 " 'arguments': { 'state': %s } }", 625 state); 626 } 627 628 static void migrate_recover(QTestState *who, const char *uri) 629 { 630 qtest_qmp_assert_success(who, 631 "{ 'execute': 'migrate-recover', " 632 " 'id': 'recover-cmd', " 633 " 'arguments': { 'uri': %s } }", 634 uri); 635 } 636 637 static void migrate_cancel(QTestState *who) 638 { 639 qtest_qmp_assert_success(who, "{ 'execute': 'migrate_cancel' }"); 640 } 641 642 static void migrate_postcopy_start(QTestState *from, QTestState *to) 643 { 644 qtest_qmp_assert_success(from, "{ 'execute': 'migrate-start-postcopy' }"); 645 646 wait_for_stop(from, &src_state); 647 qtest_qmp_eventwait(to, "RESUME"); 648 } 649 650 typedef struct { 651 /* 652 * QTEST_LOG=1 may override this. When QTEST_LOG=1, we always dump errors 653 * unconditionally, because it means the user would like to be verbose. 654 */ 655 bool hide_stderr; 656 bool use_shmem; 657 /* only launch the target process */ 658 bool only_target; 659 /* Use dirty ring if true; dirty logging otherwise */ 660 bool use_dirty_ring; 661 const char *opts_source; 662 const char *opts_target; 663 /* suspend the src before migrating to dest. */ 664 bool suspend_me; 665 } MigrateStart; 666 667 /* 668 * A hook that runs after the src and dst QEMUs have been 669 * created, but before the migration is started. This can 670 * be used to set migration parameters and capabilities. 671 * 672 * Returns: NULL, or a pointer to opaque state to be 673 * later passed to the TestMigrateFinishHook 674 */ 675 typedef void * (*TestMigrateStartHook)(QTestState *from, 676 QTestState *to); 677 678 /* 679 * A hook that runs after the migration has finished, 680 * regardless of whether it succeeded or failed, but 681 * before QEMU has terminated (unless it self-terminated 682 * due to migration error) 683 * 684 * @opaque is a pointer to state previously returned 685 * by the TestMigrateStartHook if any, or NULL. 686 */ 687 typedef void (*TestMigrateFinishHook)(QTestState *from, 688 QTestState *to, 689 void *opaque); 690 691 typedef struct { 692 /* Optional: fine tune start parameters */ 693 MigrateStart start; 694 695 /* Required: the URI for the dst QEMU to listen on */ 696 const char *listen_uri; 697 698 /* 699 * Optional: the URI for the src QEMU to connect to 700 * If NULL, then it will query the dst QEMU for its actual 701 * listening address and use that as the connect address. 702 * This allows for dynamically picking a free TCP port. 703 */ 704 const char *connect_uri; 705 706 /* Optional: callback to run at start to set migration parameters */ 707 TestMigrateStartHook start_hook; 708 /* Optional: callback to run at finish to cleanup */ 709 TestMigrateFinishHook finish_hook; 710 711 /* 712 * Optional: normally we expect the migration process to complete. 713 * 714 * There can be a variety of reasons and stages in which failure 715 * can happen during tests. 716 * 717 * If a failure is expected to happen at time of establishing 718 * the connection, then MIG_TEST_FAIL will indicate that the dst 719 * QEMU is expected to stay running and accept future migration 720 * connections. 721 * 722 * If a failure is expected to happen while processing the 723 * migration stream, then MIG_TEST_FAIL_DEST_QUIT_ERR will indicate 724 * that the dst QEMU is expected to quit with non-zero exit status 725 */ 726 enum { 727 /* This test should succeed, the default */ 728 MIG_TEST_SUCCEED = 0, 729 /* This test should fail, dest qemu should keep alive */ 730 MIG_TEST_FAIL, 731 /* This test should fail, dest qemu should fail with abnormal status */ 732 MIG_TEST_FAIL_DEST_QUIT_ERR, 733 /* The QMP command for this migration should fail with an error */ 734 MIG_TEST_QMP_ERROR, 735 } result; 736 737 /* 738 * Optional: set number of migration passes to wait for, if live==true. 739 * If zero, then merely wait for a few MB of dirty data 740 */ 741 unsigned int iterations; 742 743 /* 744 * Optional: whether the guest CPUs should be running during a precopy 745 * migration test. We used to always run with live but it took much 746 * longer so we reduced live tests to only the ones that have solid 747 * reason to be tested live-only. For each of the new test cases for 748 * precopy please provide justifications to use live explicitly (please 749 * refer to existing ones with live=true), or use live=off by default. 750 */ 751 bool live; 752 753 /* Postcopy specific fields */ 754 void *postcopy_data; 755 bool postcopy_preempt; 756 bool postcopy_recovery_test_fail; 757 } MigrateCommon; 758 759 static int test_migrate_start(QTestState **from, QTestState **to, 760 const char *uri, MigrateStart *args) 761 { 762 g_autofree gchar *arch_source = NULL; 763 g_autofree gchar *arch_target = NULL; 764 /* options for source and target */ 765 g_autofree gchar *arch_opts = NULL; 766 g_autofree gchar *cmd_source = NULL; 767 g_autofree gchar *cmd_target = NULL; 768 const gchar *ignore_stderr; 769 g_autofree char *shmem_opts = NULL; 770 g_autofree char *shmem_path = NULL; 771 const char *kvm_opts = NULL; 772 const char *arch = qtest_get_arch(); 773 const char *memory_size; 774 const char *machine_alias, *machine_opts = ""; 775 g_autofree char *machine = NULL; 776 777 if (args->use_shmem) { 778 if (!g_file_test("/dev/shm", G_FILE_TEST_IS_DIR)) { 779 g_test_skip("/dev/shm is not supported"); 780 return -1; 781 } 782 } 783 784 dst_state = (QTestMigrationState) { }; 785 src_state = (QTestMigrationState) { }; 786 bootfile_create(tmpfs, args->suspend_me); 787 src_state.suspend_me = args->suspend_me; 788 789 if (strcmp(arch, "i386") == 0 || strcmp(arch, "x86_64") == 0) { 790 memory_size = "150M"; 791 792 if (g_str_equal(arch, "i386")) { 793 machine_alias = "pc"; 794 } else { 795 machine_alias = "q35"; 796 } 797 arch_opts = g_strdup_printf( 798 "-drive if=none,id=d0,file=%s,format=raw " 799 "-device ide-hd,drive=d0,secs=1,cyls=1,heads=1", bootpath); 800 start_address = X86_TEST_MEM_START; 801 end_address = X86_TEST_MEM_END; 802 } else if (g_str_equal(arch, "s390x")) { 803 memory_size = "128M"; 804 machine_alias = "s390-ccw-virtio"; 805 arch_opts = g_strdup_printf("-bios %s", bootpath); 806 start_address = S390_TEST_MEM_START; 807 end_address = S390_TEST_MEM_END; 808 } else if (strcmp(arch, "ppc64") == 0) { 809 memory_size = "256M"; 810 start_address = PPC_TEST_MEM_START; 811 end_address = PPC_TEST_MEM_END; 812 arch_source = g_strdup_printf("-prom-env 'use-nvramrc?=true' -prom-env " 813 "'nvramrc=hex .\" _\" begin %x %x " 814 "do i c@ 1 + i c! 1000 +loop .\" B\" 0 " 815 "until'", end_address, start_address); 816 machine_alias = "pseries"; 817 machine_opts = "vsmt=8"; 818 arch_opts = g_strdup("-nodefaults"); 819 } else if (strcmp(arch, "aarch64") == 0) { 820 memory_size = "150M"; 821 machine_alias = "virt"; 822 machine_opts = "gic-version=3"; 823 arch_opts = g_strdup_printf("-cpu max -kernel %s", bootpath); 824 start_address = ARM_TEST_MEM_START; 825 end_address = ARM_TEST_MEM_END; 826 } else { 827 g_assert_not_reached(); 828 } 829 830 if (!getenv("QTEST_LOG") && args->hide_stderr) { 831 #ifndef _WIN32 832 ignore_stderr = "2>/dev/null"; 833 #else 834 /* 835 * On Windows the QEMU executable is created via CreateProcess() and 836 * IO redirection does not work, so don't bother adding IO redirection 837 * to the command line. 838 */ 839 ignore_stderr = ""; 840 #endif 841 } else { 842 ignore_stderr = ""; 843 } 844 845 if (args->use_shmem) { 846 shmem_path = g_strdup_printf("/dev/shm/qemu-%d", getpid()); 847 shmem_opts = g_strdup_printf( 848 "-object memory-backend-file,id=mem0,size=%s" 849 ",mem-path=%s,share=on -numa node,memdev=mem0", 850 memory_size, shmem_path); 851 } 852 853 if (args->use_dirty_ring) { 854 kvm_opts = ",dirty-ring-size=4096"; 855 } 856 857 machine = resolve_machine_version(machine_alias, QEMU_ENV_SRC, 858 QEMU_ENV_DST); 859 860 g_test_message("Using machine type: %s", machine); 861 862 cmd_source = g_strdup_printf("-accel kvm%s -accel tcg " 863 "-machine %s,%s " 864 "-name source,debug-threads=on " 865 "-m %s " 866 "-serial file:%s/src_serial " 867 "%s %s %s %s %s", 868 kvm_opts ? kvm_opts : "", 869 machine, machine_opts, 870 memory_size, tmpfs, 871 arch_opts ? arch_opts : "", 872 arch_source ? arch_source : "", 873 shmem_opts ? shmem_opts : "", 874 args->opts_source ? args->opts_source : "", 875 ignore_stderr); 876 if (!args->only_target) { 877 *from = qtest_init_with_env(QEMU_ENV_SRC, cmd_source); 878 qtest_qmp_set_event_callback(*from, 879 migrate_watch_for_events, 880 &src_state); 881 } 882 883 cmd_target = g_strdup_printf("-accel kvm%s -accel tcg " 884 "-machine %s,%s " 885 "-name target,debug-threads=on " 886 "-m %s " 887 "-serial file:%s/dest_serial " 888 "-incoming %s " 889 "%s %s %s %s %s", 890 kvm_opts ? kvm_opts : "", 891 machine, machine_opts, 892 memory_size, tmpfs, uri, 893 arch_opts ? arch_opts : "", 894 arch_target ? arch_target : "", 895 shmem_opts ? shmem_opts : "", 896 args->opts_target ? args->opts_target : "", 897 ignore_stderr); 898 *to = qtest_init_with_env(QEMU_ENV_DST, cmd_target); 899 qtest_qmp_set_event_callback(*to, 900 migrate_watch_for_events, 901 &dst_state); 902 903 /* 904 * Remove shmem file immediately to avoid memory leak in test failed case. 905 * It's valid because QEMU has already opened this file 906 */ 907 if (args->use_shmem) { 908 unlink(shmem_path); 909 } 910 911 return 0; 912 } 913 914 static void test_migrate_end(QTestState *from, QTestState *to, bool test_dest) 915 { 916 unsigned char dest_byte_a, dest_byte_b, dest_byte_c, dest_byte_d; 917 918 qtest_quit(from); 919 920 if (test_dest) { 921 qtest_memread(to, start_address, &dest_byte_a, 1); 922 923 /* Destination still running, wait for a byte to change */ 924 do { 925 qtest_memread(to, start_address, &dest_byte_b, 1); 926 usleep(1000 * 10); 927 } while (dest_byte_a == dest_byte_b); 928 929 qtest_qmp_assert_success(to, "{ 'execute' : 'stop'}"); 930 931 /* With it stopped, check nothing changes */ 932 qtest_memread(to, start_address, &dest_byte_c, 1); 933 usleep(1000 * 200); 934 qtest_memread(to, start_address, &dest_byte_d, 1); 935 g_assert_cmpint(dest_byte_c, ==, dest_byte_d); 936 937 check_guests_ram(to); 938 } 939 940 qtest_quit(to); 941 942 cleanup("migsocket"); 943 cleanup("src_serial"); 944 cleanup("dest_serial"); 945 cleanup(FILE_TEST_FILENAME); 946 } 947 948 #ifdef CONFIG_GNUTLS 949 struct TestMigrateTLSPSKData { 950 char *workdir; 951 char *workdiralt; 952 char *pskfile; 953 char *pskfilealt; 954 }; 955 956 static void * 957 test_migrate_tls_psk_start_common(QTestState *from, 958 QTestState *to, 959 bool mismatch) 960 { 961 struct TestMigrateTLSPSKData *data = 962 g_new0(struct TestMigrateTLSPSKData, 1); 963 964 data->workdir = g_strdup_printf("%s/tlscredspsk0", tmpfs); 965 data->pskfile = g_strdup_printf("%s/%s", data->workdir, 966 QCRYPTO_TLS_CREDS_PSKFILE); 967 g_mkdir_with_parents(data->workdir, 0700); 968 test_tls_psk_init(data->pskfile); 969 970 if (mismatch) { 971 data->workdiralt = g_strdup_printf("%s/tlscredspskalt0", tmpfs); 972 data->pskfilealt = g_strdup_printf("%s/%s", data->workdiralt, 973 QCRYPTO_TLS_CREDS_PSKFILE); 974 g_mkdir_with_parents(data->workdiralt, 0700); 975 test_tls_psk_init_alt(data->pskfilealt); 976 } 977 978 qtest_qmp_assert_success(from, 979 "{ 'execute': 'object-add'," 980 " 'arguments': { 'qom-type': 'tls-creds-psk'," 981 " 'id': 'tlscredspsk0'," 982 " 'endpoint': 'client'," 983 " 'dir': %s," 984 " 'username': 'qemu'} }", 985 data->workdir); 986 987 qtest_qmp_assert_success(to, 988 "{ 'execute': 'object-add'," 989 " 'arguments': { 'qom-type': 'tls-creds-psk'," 990 " 'id': 'tlscredspsk0'," 991 " 'endpoint': 'server'," 992 " 'dir': %s } }", 993 mismatch ? data->workdiralt : data->workdir); 994 995 migrate_set_parameter_str(from, "tls-creds", "tlscredspsk0"); 996 migrate_set_parameter_str(to, "tls-creds", "tlscredspsk0"); 997 998 return data; 999 } 1000 1001 static void * 1002 test_migrate_tls_psk_start_match(QTestState *from, 1003 QTestState *to) 1004 { 1005 return test_migrate_tls_psk_start_common(from, to, false); 1006 } 1007 1008 static void * 1009 test_migrate_tls_psk_start_mismatch(QTestState *from, 1010 QTestState *to) 1011 { 1012 return test_migrate_tls_psk_start_common(from, to, true); 1013 } 1014 1015 static void 1016 test_migrate_tls_psk_finish(QTestState *from, 1017 QTestState *to, 1018 void *opaque) 1019 { 1020 struct TestMigrateTLSPSKData *data = opaque; 1021 1022 test_tls_psk_cleanup(data->pskfile); 1023 if (data->pskfilealt) { 1024 test_tls_psk_cleanup(data->pskfilealt); 1025 } 1026 rmdir(data->workdir); 1027 if (data->workdiralt) { 1028 rmdir(data->workdiralt); 1029 } 1030 1031 g_free(data->workdiralt); 1032 g_free(data->pskfilealt); 1033 g_free(data->workdir); 1034 g_free(data->pskfile); 1035 g_free(data); 1036 } 1037 1038 #ifdef CONFIG_TASN1 1039 typedef struct { 1040 char *workdir; 1041 char *keyfile; 1042 char *cacert; 1043 char *servercert; 1044 char *serverkey; 1045 char *clientcert; 1046 char *clientkey; 1047 } TestMigrateTLSX509Data; 1048 1049 typedef struct { 1050 bool verifyclient; 1051 bool clientcert; 1052 bool hostileclient; 1053 bool authzclient; 1054 const char *certhostname; 1055 const char *certipaddr; 1056 } TestMigrateTLSX509; 1057 1058 static void * 1059 test_migrate_tls_x509_start_common(QTestState *from, 1060 QTestState *to, 1061 TestMigrateTLSX509 *args) 1062 { 1063 TestMigrateTLSX509Data *data = g_new0(TestMigrateTLSX509Data, 1); 1064 1065 data->workdir = g_strdup_printf("%s/tlscredsx5090", tmpfs); 1066 data->keyfile = g_strdup_printf("%s/key.pem", data->workdir); 1067 1068 data->cacert = g_strdup_printf("%s/ca-cert.pem", data->workdir); 1069 data->serverkey = g_strdup_printf("%s/server-key.pem", data->workdir); 1070 data->servercert = g_strdup_printf("%s/server-cert.pem", data->workdir); 1071 if (args->clientcert) { 1072 data->clientkey = g_strdup_printf("%s/client-key.pem", data->workdir); 1073 data->clientcert = g_strdup_printf("%s/client-cert.pem", data->workdir); 1074 } 1075 1076 g_mkdir_with_parents(data->workdir, 0700); 1077 1078 test_tls_init(data->keyfile); 1079 #ifndef _WIN32 1080 g_assert(link(data->keyfile, data->serverkey) == 0); 1081 #else 1082 g_assert(CreateHardLink(data->serverkey, data->keyfile, NULL) != 0); 1083 #endif 1084 if (args->clientcert) { 1085 #ifndef _WIN32 1086 g_assert(link(data->keyfile, data->clientkey) == 0); 1087 #else 1088 g_assert(CreateHardLink(data->clientkey, data->keyfile, NULL) != 0); 1089 #endif 1090 } 1091 1092 TLS_ROOT_REQ_SIMPLE(cacertreq, data->cacert); 1093 if (args->clientcert) { 1094 TLS_CERT_REQ_SIMPLE_CLIENT(servercertreq, cacertreq, 1095 args->hostileclient ? 1096 QCRYPTO_TLS_TEST_CLIENT_HOSTILE_NAME : 1097 QCRYPTO_TLS_TEST_CLIENT_NAME, 1098 data->clientcert); 1099 } 1100 1101 TLS_CERT_REQ_SIMPLE_SERVER(clientcertreq, cacertreq, 1102 data->servercert, 1103 args->certhostname, 1104 args->certipaddr); 1105 1106 qtest_qmp_assert_success(from, 1107 "{ 'execute': 'object-add'," 1108 " 'arguments': { 'qom-type': 'tls-creds-x509'," 1109 " 'id': 'tlscredsx509client0'," 1110 " 'endpoint': 'client'," 1111 " 'dir': %s," 1112 " 'sanity-check': true," 1113 " 'verify-peer': true} }", 1114 data->workdir); 1115 migrate_set_parameter_str(from, "tls-creds", "tlscredsx509client0"); 1116 if (args->certhostname) { 1117 migrate_set_parameter_str(from, "tls-hostname", args->certhostname); 1118 } 1119 1120 qtest_qmp_assert_success(to, 1121 "{ 'execute': 'object-add'," 1122 " 'arguments': { 'qom-type': 'tls-creds-x509'," 1123 " 'id': 'tlscredsx509server0'," 1124 " 'endpoint': 'server'," 1125 " 'dir': %s," 1126 " 'sanity-check': true," 1127 " 'verify-peer': %i} }", 1128 data->workdir, args->verifyclient); 1129 migrate_set_parameter_str(to, "tls-creds", "tlscredsx509server0"); 1130 1131 if (args->authzclient) { 1132 qtest_qmp_assert_success(to, 1133 "{ 'execute': 'object-add'," 1134 " 'arguments': { 'qom-type': 'authz-simple'," 1135 " 'id': 'tlsauthz0'," 1136 " 'identity': %s} }", 1137 "CN=" QCRYPTO_TLS_TEST_CLIENT_NAME); 1138 migrate_set_parameter_str(to, "tls-authz", "tlsauthz0"); 1139 } 1140 1141 return data; 1142 } 1143 1144 /* 1145 * The normal case: match server's cert hostname against 1146 * whatever host we were telling QEMU to connect to (if any) 1147 */ 1148 static void * 1149 test_migrate_tls_x509_start_default_host(QTestState *from, 1150 QTestState *to) 1151 { 1152 TestMigrateTLSX509 args = { 1153 .verifyclient = true, 1154 .clientcert = true, 1155 .certipaddr = "127.0.0.1" 1156 }; 1157 return test_migrate_tls_x509_start_common(from, to, &args); 1158 } 1159 1160 /* 1161 * The unusual case: the server's cert is different from 1162 * the address we're telling QEMU to connect to (if any), 1163 * so we must give QEMU an explicit hostname to validate 1164 */ 1165 static void * 1166 test_migrate_tls_x509_start_override_host(QTestState *from, 1167 QTestState *to) 1168 { 1169 TestMigrateTLSX509 args = { 1170 .verifyclient = true, 1171 .clientcert = true, 1172 .certhostname = "qemu.org", 1173 }; 1174 return test_migrate_tls_x509_start_common(from, to, &args); 1175 } 1176 1177 /* 1178 * The unusual case: the server's cert is different from 1179 * the address we're telling QEMU to connect to, and so we 1180 * expect the client to reject the server 1181 */ 1182 static void * 1183 test_migrate_tls_x509_start_mismatch_host(QTestState *from, 1184 QTestState *to) 1185 { 1186 TestMigrateTLSX509 args = { 1187 .verifyclient = true, 1188 .clientcert = true, 1189 .certipaddr = "10.0.0.1", 1190 }; 1191 return test_migrate_tls_x509_start_common(from, to, &args); 1192 } 1193 1194 static void * 1195 test_migrate_tls_x509_start_friendly_client(QTestState *from, 1196 QTestState *to) 1197 { 1198 TestMigrateTLSX509 args = { 1199 .verifyclient = true, 1200 .clientcert = true, 1201 .authzclient = true, 1202 .certipaddr = "127.0.0.1", 1203 }; 1204 return test_migrate_tls_x509_start_common(from, to, &args); 1205 } 1206 1207 static void * 1208 test_migrate_tls_x509_start_hostile_client(QTestState *from, 1209 QTestState *to) 1210 { 1211 TestMigrateTLSX509 args = { 1212 .verifyclient = true, 1213 .clientcert = true, 1214 .hostileclient = true, 1215 .authzclient = true, 1216 .certipaddr = "127.0.0.1", 1217 }; 1218 return test_migrate_tls_x509_start_common(from, to, &args); 1219 } 1220 1221 /* 1222 * The case with no client certificate presented, 1223 * and no server verification 1224 */ 1225 static void * 1226 test_migrate_tls_x509_start_allow_anon_client(QTestState *from, 1227 QTestState *to) 1228 { 1229 TestMigrateTLSX509 args = { 1230 .certipaddr = "127.0.0.1", 1231 }; 1232 return test_migrate_tls_x509_start_common(from, to, &args); 1233 } 1234 1235 /* 1236 * The case with no client certificate presented, 1237 * and server verification rejecting 1238 */ 1239 static void * 1240 test_migrate_tls_x509_start_reject_anon_client(QTestState *from, 1241 QTestState *to) 1242 { 1243 TestMigrateTLSX509 args = { 1244 .verifyclient = true, 1245 .certipaddr = "127.0.0.1", 1246 }; 1247 return test_migrate_tls_x509_start_common(from, to, &args); 1248 } 1249 1250 static void 1251 test_migrate_tls_x509_finish(QTestState *from, 1252 QTestState *to, 1253 void *opaque) 1254 { 1255 TestMigrateTLSX509Data *data = opaque; 1256 1257 test_tls_cleanup(data->keyfile); 1258 g_free(data->keyfile); 1259 1260 unlink(data->cacert); 1261 g_free(data->cacert); 1262 unlink(data->servercert); 1263 g_free(data->servercert); 1264 unlink(data->serverkey); 1265 g_free(data->serverkey); 1266 1267 if (data->clientcert) { 1268 unlink(data->clientcert); 1269 g_free(data->clientcert); 1270 } 1271 if (data->clientkey) { 1272 unlink(data->clientkey); 1273 g_free(data->clientkey); 1274 } 1275 1276 rmdir(data->workdir); 1277 g_free(data->workdir); 1278 1279 g_free(data); 1280 } 1281 #endif /* CONFIG_TASN1 */ 1282 #endif /* CONFIG_GNUTLS */ 1283 1284 static void * 1285 test_migrate_compress_start(QTestState *from, 1286 QTestState *to) 1287 { 1288 migrate_set_parameter_int(from, "compress-level", 1); 1289 migrate_set_parameter_int(from, "compress-threads", 4); 1290 migrate_set_parameter_bool(from, "compress-wait-thread", true); 1291 migrate_set_parameter_int(to, "decompress-threads", 4); 1292 1293 migrate_set_capability(from, "compress", true); 1294 migrate_set_capability(to, "compress", true); 1295 1296 return NULL; 1297 } 1298 1299 static void * 1300 test_migrate_compress_nowait_start(QTestState *from, 1301 QTestState *to) 1302 { 1303 migrate_set_parameter_int(from, "compress-level", 9); 1304 migrate_set_parameter_int(from, "compress-threads", 1); 1305 migrate_set_parameter_bool(from, "compress-wait-thread", false); 1306 migrate_set_parameter_int(to, "decompress-threads", 1); 1307 1308 migrate_set_capability(from, "compress", true); 1309 migrate_set_capability(to, "compress", true); 1310 1311 return NULL; 1312 } 1313 1314 static int migrate_postcopy_prepare(QTestState **from_ptr, 1315 QTestState **to_ptr, 1316 MigrateCommon *args) 1317 { 1318 QTestState *from, *to; 1319 1320 if (test_migrate_start(&from, &to, "defer", &args->start)) { 1321 return -1; 1322 } 1323 1324 if (args->start_hook) { 1325 args->postcopy_data = args->start_hook(from, to); 1326 } 1327 1328 migrate_set_capability(from, "postcopy-ram", true); 1329 migrate_set_capability(to, "postcopy-ram", true); 1330 migrate_set_capability(to, "postcopy-blocktime", true); 1331 1332 if (args->postcopy_preempt) { 1333 migrate_set_capability(from, "postcopy-preempt", true); 1334 migrate_set_capability(to, "postcopy-preempt", true); 1335 } 1336 1337 migrate_ensure_non_converge(from); 1338 1339 migrate_prepare_for_dirty_mem(from); 1340 qtest_qmp_assert_success(to, "{ 'execute': 'migrate-incoming'," 1341 " 'arguments': { " 1342 " 'channels': [ { 'channel-type': 'main'," 1343 " 'addr': { 'transport': 'socket'," 1344 " 'type': 'inet'," 1345 " 'host': '127.0.0.1'," 1346 " 'port': '0' } } ] } }"); 1347 1348 /* Wait for the first serial output from the source */ 1349 wait_for_serial("src_serial"); 1350 wait_for_suspend(from, &src_state); 1351 1352 g_autofree char *uri = migrate_get_socket_address(to, "socket-address"); 1353 migrate_qmp(from, uri, "{}"); 1354 1355 migrate_wait_for_dirty_mem(from, to); 1356 1357 *from_ptr = from; 1358 *to_ptr = to; 1359 1360 return 0; 1361 } 1362 1363 static void migrate_postcopy_complete(QTestState *from, QTestState *to, 1364 MigrateCommon *args) 1365 { 1366 wait_for_migration_complete(from); 1367 1368 if (args->start.suspend_me) { 1369 /* wakeup succeeds only if guest is suspended */ 1370 qtest_qmp_assert_success(to, "{'execute': 'system_wakeup'}"); 1371 } 1372 1373 /* Make sure we get at least one "B" on destination */ 1374 wait_for_serial("dest_serial"); 1375 1376 if (uffd_feature_thread_id) { 1377 read_blocktime(to); 1378 } 1379 1380 if (args->finish_hook) { 1381 args->finish_hook(from, to, args->postcopy_data); 1382 args->postcopy_data = NULL; 1383 } 1384 1385 test_migrate_end(from, to, true); 1386 } 1387 1388 static void test_postcopy_common(MigrateCommon *args) 1389 { 1390 QTestState *from, *to; 1391 1392 if (migrate_postcopy_prepare(&from, &to, args)) { 1393 return; 1394 } 1395 migrate_postcopy_start(from, to); 1396 migrate_postcopy_complete(from, to, args); 1397 } 1398 1399 static void test_postcopy(void) 1400 { 1401 MigrateCommon args = { }; 1402 1403 test_postcopy_common(&args); 1404 } 1405 1406 static void test_postcopy_suspend(void) 1407 { 1408 MigrateCommon args = { 1409 .start.suspend_me = true, 1410 }; 1411 1412 test_postcopy_common(&args); 1413 } 1414 1415 static void test_postcopy_compress(void) 1416 { 1417 MigrateCommon args = { 1418 .start_hook = test_migrate_compress_start 1419 }; 1420 1421 test_postcopy_common(&args); 1422 } 1423 1424 static void test_postcopy_preempt(void) 1425 { 1426 MigrateCommon args = { 1427 .postcopy_preempt = true, 1428 }; 1429 1430 test_postcopy_common(&args); 1431 } 1432 1433 #ifdef CONFIG_GNUTLS 1434 static void test_postcopy_tls_psk(void) 1435 { 1436 MigrateCommon args = { 1437 .start_hook = test_migrate_tls_psk_start_match, 1438 .finish_hook = test_migrate_tls_psk_finish, 1439 }; 1440 1441 test_postcopy_common(&args); 1442 } 1443 1444 static void test_postcopy_preempt_tls_psk(void) 1445 { 1446 MigrateCommon args = { 1447 .postcopy_preempt = true, 1448 .start_hook = test_migrate_tls_psk_start_match, 1449 .finish_hook = test_migrate_tls_psk_finish, 1450 }; 1451 1452 test_postcopy_common(&args); 1453 } 1454 #endif 1455 1456 static void wait_for_postcopy_status(QTestState *one, const char *status) 1457 { 1458 wait_for_migration_status(one, status, 1459 (const char * []) { "failed", "active", 1460 "completed", NULL }); 1461 } 1462 1463 #ifndef _WIN32 1464 static void postcopy_recover_fail(QTestState *from, QTestState *to) 1465 { 1466 int ret, pair1[2], pair2[2]; 1467 char c; 1468 1469 /* Create two unrelated socketpairs */ 1470 ret = qemu_socketpair(PF_LOCAL, SOCK_STREAM, 0, pair1); 1471 g_assert_cmpint(ret, ==, 0); 1472 1473 ret = qemu_socketpair(PF_LOCAL, SOCK_STREAM, 0, pair2); 1474 g_assert_cmpint(ret, ==, 0); 1475 1476 /* 1477 * Give the guests unpaired ends of the sockets, so they'll all blocked 1478 * at reading. This mimics a wrong channel established. 1479 */ 1480 qtest_qmp_fds_assert_success(from, &pair1[0], 1, 1481 "{ 'execute': 'getfd'," 1482 " 'arguments': { 'fdname': 'fd-mig' }}"); 1483 qtest_qmp_fds_assert_success(to, &pair2[0], 1, 1484 "{ 'execute': 'getfd'," 1485 " 'arguments': { 'fdname': 'fd-mig' }}"); 1486 1487 /* 1488 * Write the 1st byte as QEMU_VM_COMMAND (0x8) for the dest socket, to 1489 * emulate the 1st byte of a real recovery, but stops from there to 1490 * keep dest QEMU in RECOVER. This is needed so that we can kick off 1491 * the recover process on dest QEMU (by triggering the G_IO_IN event). 1492 * 1493 * NOTE: this trick is not needed on src QEMUs, because src doesn't 1494 * rely on an pre-existing G_IO_IN event, so it will always trigger the 1495 * upcoming recovery anyway even if it can read nothing. 1496 */ 1497 #define QEMU_VM_COMMAND 0x08 1498 c = QEMU_VM_COMMAND; 1499 ret = send(pair2[1], &c, 1, 0); 1500 g_assert_cmpint(ret, ==, 1); 1501 1502 migrate_recover(to, "fd:fd-mig"); 1503 migrate_qmp(from, "fd:fd-mig", "{'resume': true}"); 1504 1505 /* 1506 * Make sure both QEMU instances will go into RECOVER stage, then test 1507 * kicking them out using migrate-pause. 1508 */ 1509 wait_for_postcopy_status(from, "postcopy-recover"); 1510 wait_for_postcopy_status(to, "postcopy-recover"); 1511 1512 /* 1513 * This would be issued by the admin upon noticing the hang, we should 1514 * make sure we're able to kick this out. 1515 */ 1516 migrate_pause(from); 1517 wait_for_postcopy_status(from, "postcopy-paused"); 1518 1519 /* Do the same test on dest */ 1520 migrate_pause(to); 1521 wait_for_postcopy_status(to, "postcopy-paused"); 1522 1523 close(pair1[0]); 1524 close(pair1[1]); 1525 close(pair2[0]); 1526 close(pair2[1]); 1527 } 1528 #endif /* _WIN32 */ 1529 1530 static void test_postcopy_recovery_common(MigrateCommon *args) 1531 { 1532 QTestState *from, *to; 1533 g_autofree char *uri = NULL; 1534 1535 /* Always hide errors for postcopy recover tests since they're expected */ 1536 args->start.hide_stderr = true; 1537 1538 if (migrate_postcopy_prepare(&from, &to, args)) { 1539 return; 1540 } 1541 1542 /* Turn postcopy speed down, 4K/s is slow enough on any machines */ 1543 migrate_set_parameter_int(from, "max-postcopy-bandwidth", 4096); 1544 1545 /* Now we start the postcopy */ 1546 migrate_postcopy_start(from, to); 1547 1548 /* 1549 * Wait until postcopy is really started; we can only run the 1550 * migrate-pause command during a postcopy 1551 */ 1552 wait_for_migration_status(from, "postcopy-active", NULL); 1553 1554 /* 1555 * Manually stop the postcopy migration. This emulates a network 1556 * failure with the migration socket 1557 */ 1558 migrate_pause(from); 1559 1560 /* 1561 * Wait for destination side to reach postcopy-paused state. The 1562 * migrate-recover command can only succeed if destination machine 1563 * is in the paused state 1564 */ 1565 wait_for_postcopy_status(to, "postcopy-paused"); 1566 wait_for_postcopy_status(from, "postcopy-paused"); 1567 1568 #ifndef _WIN32 1569 if (args->postcopy_recovery_test_fail) { 1570 /* 1571 * Test when a wrong socket specified for recover, and then the 1572 * ability to kick it out, and continue with a correct socket. 1573 */ 1574 postcopy_recover_fail(from, to); 1575 /* continue with a good recovery */ 1576 } 1577 #endif /* _WIN32 */ 1578 1579 /* 1580 * Create a new socket to emulate a new channel that is different 1581 * from the broken migration channel; tell the destination to 1582 * listen to the new port 1583 */ 1584 uri = g_strdup_printf("unix:%s/migsocket-recover", tmpfs); 1585 migrate_recover(to, uri); 1586 1587 /* 1588 * Try to rebuild the migration channel using the resume flag and 1589 * the newly created channel 1590 */ 1591 migrate_qmp(from, uri, "{'resume': true}"); 1592 1593 /* Restore the postcopy bandwidth to unlimited */ 1594 migrate_set_parameter_int(from, "max-postcopy-bandwidth", 0); 1595 1596 migrate_postcopy_complete(from, to, args); 1597 } 1598 1599 static void test_postcopy_recovery(void) 1600 { 1601 MigrateCommon args = { }; 1602 1603 test_postcopy_recovery_common(&args); 1604 } 1605 1606 static void test_postcopy_recovery_compress(void) 1607 { 1608 MigrateCommon args = { 1609 .start_hook = test_migrate_compress_start 1610 }; 1611 1612 test_postcopy_recovery_common(&args); 1613 } 1614 1615 #ifndef _WIN32 1616 static void test_postcopy_recovery_double_fail(void) 1617 { 1618 MigrateCommon args = { 1619 .postcopy_recovery_test_fail = true, 1620 }; 1621 1622 test_postcopy_recovery_common(&args); 1623 } 1624 #endif /* _WIN32 */ 1625 1626 #ifdef CONFIG_GNUTLS 1627 static void test_postcopy_recovery_tls_psk(void) 1628 { 1629 MigrateCommon args = { 1630 .start_hook = test_migrate_tls_psk_start_match, 1631 .finish_hook = test_migrate_tls_psk_finish, 1632 }; 1633 1634 test_postcopy_recovery_common(&args); 1635 } 1636 #endif 1637 1638 static void test_postcopy_preempt_recovery(void) 1639 { 1640 MigrateCommon args = { 1641 .postcopy_preempt = true, 1642 }; 1643 1644 test_postcopy_recovery_common(&args); 1645 } 1646 1647 #ifdef CONFIG_GNUTLS 1648 /* This contains preempt+recovery+tls test altogether */ 1649 static void test_postcopy_preempt_all(void) 1650 { 1651 MigrateCommon args = { 1652 .postcopy_preempt = true, 1653 .start_hook = test_migrate_tls_psk_start_match, 1654 .finish_hook = test_migrate_tls_psk_finish, 1655 }; 1656 1657 test_postcopy_recovery_common(&args); 1658 } 1659 1660 #endif 1661 1662 static void test_baddest(void) 1663 { 1664 MigrateStart args = { 1665 .hide_stderr = true 1666 }; 1667 QTestState *from, *to; 1668 1669 if (test_migrate_start(&from, &to, "tcp:127.0.0.1:0", &args)) { 1670 return; 1671 } 1672 migrate_qmp(from, "tcp:127.0.0.1:0", "{}"); 1673 wait_for_migration_fail(from, false); 1674 test_migrate_end(from, to, false); 1675 } 1676 1677 #ifndef _WIN32 1678 static void test_analyze_script(void) 1679 { 1680 MigrateStart args = { 1681 .opts_source = "-uuid 11111111-1111-1111-1111-111111111111", 1682 }; 1683 QTestState *from, *to; 1684 g_autofree char *uri = NULL; 1685 g_autofree char *file = NULL; 1686 int pid, wstatus; 1687 const char *python = g_getenv("PYTHON"); 1688 1689 if (!python) { 1690 g_test_skip("PYTHON variable not set"); 1691 return; 1692 } 1693 1694 /* dummy url */ 1695 if (test_migrate_start(&from, &to, "tcp:127.0.0.1:0", &args)) { 1696 return; 1697 } 1698 1699 /* 1700 * Setting these two capabilities causes the "configuration" 1701 * vmstate to include subsections for them. The script needs to 1702 * parse those subsections properly. 1703 */ 1704 migrate_set_capability(from, "validate-uuid", true); 1705 migrate_set_capability(from, "x-ignore-shared", true); 1706 1707 file = g_strdup_printf("%s/migfile", tmpfs); 1708 uri = g_strdup_printf("exec:cat > %s", file); 1709 1710 migrate_ensure_converge(from); 1711 migrate_qmp(from, uri, "{}"); 1712 wait_for_migration_complete(from); 1713 1714 pid = fork(); 1715 if (!pid) { 1716 close(1); 1717 open("/dev/null", O_WRONLY); 1718 execl(python, python, ANALYZE_SCRIPT, "-f", file, NULL); 1719 g_assert_not_reached(); 1720 } 1721 1722 g_assert(waitpid(pid, &wstatus, 0) == pid); 1723 if (WIFEXITED(wstatus) && WEXITSTATUS(wstatus) != 0) { 1724 g_test_message("Failed to analyze the migration stream"); 1725 g_test_fail(); 1726 } 1727 test_migrate_end(from, to, false); 1728 cleanup("migfile"); 1729 } 1730 #endif 1731 1732 static void test_precopy_common(MigrateCommon *args) 1733 { 1734 QTestState *from, *to; 1735 void *data_hook = NULL; 1736 g_autofree char *connect_uri = NULL; 1737 1738 if (test_migrate_start(&from, &to, args->listen_uri, &args->start)) { 1739 return; 1740 } 1741 1742 if (args->start_hook) { 1743 data_hook = args->start_hook(from, to); 1744 } 1745 1746 /* Wait for the first serial output from the source */ 1747 if (args->result == MIG_TEST_SUCCEED) { 1748 wait_for_serial("src_serial"); 1749 wait_for_suspend(from, &src_state); 1750 } 1751 1752 if (args->live) { 1753 migrate_ensure_non_converge(from); 1754 migrate_prepare_for_dirty_mem(from); 1755 } else { 1756 /* 1757 * Testing non-live migration, we allow it to run at 1758 * full speed to ensure short test case duration. 1759 * For tests expected to fail, we don't need to 1760 * change anything. 1761 */ 1762 if (args->result == MIG_TEST_SUCCEED) { 1763 qtest_qmp_assert_success(from, "{ 'execute' : 'stop'}"); 1764 wait_for_stop(from, &src_state); 1765 migrate_ensure_converge(from); 1766 } 1767 } 1768 1769 if (!args->connect_uri) { 1770 connect_uri = migrate_get_socket_address(to, "socket-address"); 1771 } else { 1772 connect_uri = g_strdup(args->connect_uri); 1773 } 1774 1775 if (args->result == MIG_TEST_QMP_ERROR) { 1776 migrate_qmp_fail(from, connect_uri, "{}"); 1777 goto finish; 1778 } 1779 1780 migrate_qmp(from, connect_uri, "{}"); 1781 1782 if (args->result != MIG_TEST_SUCCEED) { 1783 bool allow_active = args->result == MIG_TEST_FAIL; 1784 wait_for_migration_fail(from, allow_active); 1785 1786 if (args->result == MIG_TEST_FAIL_DEST_QUIT_ERR) { 1787 qtest_set_expected_status(to, EXIT_FAILURE); 1788 } 1789 } else { 1790 if (args->live) { 1791 /* 1792 * For initial iteration(s) we must do a full pass, 1793 * but for the final iteration, we need only wait 1794 * for some dirty mem before switching to converge 1795 */ 1796 while (args->iterations > 1) { 1797 wait_for_migration_pass(from); 1798 args->iterations--; 1799 } 1800 migrate_wait_for_dirty_mem(from, to); 1801 1802 migrate_ensure_converge(from); 1803 1804 /* 1805 * We do this first, as it has a timeout to stop us 1806 * hanging forever if migration didn't converge 1807 */ 1808 wait_for_migration_complete(from); 1809 1810 wait_for_stop(from, &src_state); 1811 1812 } else { 1813 wait_for_migration_complete(from); 1814 /* 1815 * Must wait for dst to finish reading all incoming 1816 * data on the socket before issuing 'cont' otherwise 1817 * it'll be ignored 1818 */ 1819 wait_for_migration_complete(to); 1820 1821 qtest_qmp_assert_success(to, "{ 'execute' : 'cont'}"); 1822 } 1823 1824 wait_for_resume(to, &dst_state); 1825 1826 if (args->start.suspend_me) { 1827 /* wakeup succeeds only if guest is suspended */ 1828 qtest_qmp_assert_success(to, "{'execute': 'system_wakeup'}"); 1829 } 1830 1831 wait_for_serial("dest_serial"); 1832 } 1833 1834 finish: 1835 if (args->finish_hook) { 1836 args->finish_hook(from, to, data_hook); 1837 } 1838 1839 test_migrate_end(from, to, args->result == MIG_TEST_SUCCEED); 1840 } 1841 1842 static void test_file_common(MigrateCommon *args, bool stop_src) 1843 { 1844 QTestState *from, *to; 1845 void *data_hook = NULL; 1846 g_autofree char *connect_uri = g_strdup(args->connect_uri); 1847 1848 if (test_migrate_start(&from, &to, args->listen_uri, &args->start)) { 1849 return; 1850 } 1851 1852 /* 1853 * File migration is never live. We can keep the source VM running 1854 * during migration, but the destination will not be running 1855 * concurrently. 1856 */ 1857 g_assert_false(args->live); 1858 1859 if (args->start_hook) { 1860 data_hook = args->start_hook(from, to); 1861 } 1862 1863 migrate_ensure_converge(from); 1864 wait_for_serial("src_serial"); 1865 1866 if (stop_src) { 1867 qtest_qmp_assert_success(from, "{ 'execute' : 'stop'}"); 1868 wait_for_stop(from, &src_state); 1869 } 1870 1871 if (args->result == MIG_TEST_QMP_ERROR) { 1872 migrate_qmp_fail(from, connect_uri, "{}"); 1873 goto finish; 1874 } 1875 1876 migrate_qmp(from, connect_uri, "{}"); 1877 wait_for_migration_complete(from); 1878 1879 /* 1880 * We need to wait for the source to finish before starting the 1881 * destination. 1882 */ 1883 migrate_incoming_qmp(to, connect_uri, "{}"); 1884 wait_for_migration_complete(to); 1885 1886 if (stop_src) { 1887 qtest_qmp_assert_success(to, "{ 'execute' : 'cont'}"); 1888 } 1889 wait_for_resume(to, &dst_state); 1890 1891 wait_for_serial("dest_serial"); 1892 1893 finish: 1894 if (args->finish_hook) { 1895 args->finish_hook(from, to, data_hook); 1896 } 1897 1898 test_migrate_end(from, to, args->result == MIG_TEST_SUCCEED); 1899 } 1900 1901 static void test_precopy_unix_plain(void) 1902 { 1903 g_autofree char *uri = g_strdup_printf("unix:%s/migsocket", tmpfs); 1904 MigrateCommon args = { 1905 .listen_uri = uri, 1906 .connect_uri = uri, 1907 /* 1908 * The simplest use case of precopy, covering smoke tests of 1909 * get-dirty-log dirty tracking. 1910 */ 1911 .live = true, 1912 }; 1913 1914 test_precopy_common(&args); 1915 } 1916 1917 static void test_precopy_unix_suspend_live(void) 1918 { 1919 g_autofree char *uri = g_strdup_printf("unix:%s/migsocket", tmpfs); 1920 MigrateCommon args = { 1921 .listen_uri = uri, 1922 .connect_uri = uri, 1923 /* 1924 * despite being live, the test is fast because the src 1925 * suspends immediately. 1926 */ 1927 .live = true, 1928 .start.suspend_me = true, 1929 }; 1930 1931 test_precopy_common(&args); 1932 } 1933 1934 static void test_precopy_unix_suspend_notlive(void) 1935 { 1936 g_autofree char *uri = g_strdup_printf("unix:%s/migsocket", tmpfs); 1937 MigrateCommon args = { 1938 .listen_uri = uri, 1939 .connect_uri = uri, 1940 .start.suspend_me = true, 1941 }; 1942 1943 test_precopy_common(&args); 1944 } 1945 1946 static void test_precopy_unix_dirty_ring(void) 1947 { 1948 g_autofree char *uri = g_strdup_printf("unix:%s/migsocket", tmpfs); 1949 MigrateCommon args = { 1950 .start = { 1951 .use_dirty_ring = true, 1952 }, 1953 .listen_uri = uri, 1954 .connect_uri = uri, 1955 /* 1956 * Besides the precopy/unix basic test, cover dirty ring interface 1957 * rather than get-dirty-log. 1958 */ 1959 .live = true, 1960 }; 1961 1962 test_precopy_common(&args); 1963 } 1964 1965 #ifdef CONFIG_GNUTLS 1966 static void test_precopy_unix_tls_psk(void) 1967 { 1968 g_autofree char *uri = g_strdup_printf("unix:%s/migsocket", tmpfs); 1969 MigrateCommon args = { 1970 .connect_uri = uri, 1971 .listen_uri = uri, 1972 .start_hook = test_migrate_tls_psk_start_match, 1973 .finish_hook = test_migrate_tls_psk_finish, 1974 }; 1975 1976 test_precopy_common(&args); 1977 } 1978 1979 #ifdef CONFIG_TASN1 1980 static void test_precopy_unix_tls_x509_default_host(void) 1981 { 1982 g_autofree char *uri = g_strdup_printf("unix:%s/migsocket", tmpfs); 1983 MigrateCommon args = { 1984 .start = { 1985 .hide_stderr = true, 1986 }, 1987 .connect_uri = uri, 1988 .listen_uri = uri, 1989 .start_hook = test_migrate_tls_x509_start_default_host, 1990 .finish_hook = test_migrate_tls_x509_finish, 1991 .result = MIG_TEST_FAIL_DEST_QUIT_ERR, 1992 }; 1993 1994 test_precopy_common(&args); 1995 } 1996 1997 static void test_precopy_unix_tls_x509_override_host(void) 1998 { 1999 g_autofree char *uri = g_strdup_printf("unix:%s/migsocket", tmpfs); 2000 MigrateCommon args = { 2001 .connect_uri = uri, 2002 .listen_uri = uri, 2003 .start_hook = test_migrate_tls_x509_start_override_host, 2004 .finish_hook = test_migrate_tls_x509_finish, 2005 }; 2006 2007 test_precopy_common(&args); 2008 } 2009 #endif /* CONFIG_TASN1 */ 2010 #endif /* CONFIG_GNUTLS */ 2011 2012 #if 0 2013 /* Currently upset on aarch64 TCG */ 2014 static void test_ignore_shared(void) 2015 { 2016 g_autofree char *uri = g_strdup_printf("unix:%s/migsocket", tmpfs); 2017 QTestState *from, *to; 2018 2019 if (test_migrate_start(&from, &to, uri, false, true, NULL, NULL)) { 2020 return; 2021 } 2022 2023 migrate_ensure_non_converge(from); 2024 migrate_prepare_for_dirty_mem(from); 2025 2026 migrate_set_capability(from, "x-ignore-shared", true); 2027 migrate_set_capability(to, "x-ignore-shared", true); 2028 2029 /* Wait for the first serial output from the source */ 2030 wait_for_serial("src_serial"); 2031 2032 migrate_qmp(from, uri, "{}"); 2033 2034 migrate_wait_for_dirty_mem(from, to); 2035 2036 wait_for_stop(from, &src_state); 2037 2038 qtest_qmp_eventwait(to, "RESUME"); 2039 2040 wait_for_serial("dest_serial"); 2041 wait_for_migration_complete(from); 2042 2043 /* Check whether shared RAM has been really skipped */ 2044 g_assert_cmpint(read_ram_property_int(from, "transferred"), <, 1024 * 1024); 2045 2046 test_migrate_end(from, to, true); 2047 } 2048 #endif 2049 2050 static void * 2051 test_migrate_xbzrle_start(QTestState *from, 2052 QTestState *to) 2053 { 2054 migrate_set_parameter_int(from, "xbzrle-cache-size", 33554432); 2055 2056 migrate_set_capability(from, "xbzrle", true); 2057 migrate_set_capability(to, "xbzrle", true); 2058 2059 return NULL; 2060 } 2061 2062 static void test_precopy_unix_xbzrle(void) 2063 { 2064 g_autofree char *uri = g_strdup_printf("unix:%s/migsocket", tmpfs); 2065 MigrateCommon args = { 2066 .connect_uri = uri, 2067 .listen_uri = uri, 2068 .start_hook = test_migrate_xbzrle_start, 2069 .iterations = 2, 2070 /* 2071 * XBZRLE needs pages to be modified when doing the 2nd+ round 2072 * iteration to have real data pushed to the stream. 2073 */ 2074 .live = true, 2075 }; 2076 2077 test_precopy_common(&args); 2078 } 2079 2080 static void test_precopy_unix_compress(void) 2081 { 2082 g_autofree char *uri = g_strdup_printf("unix:%s/migsocket", tmpfs); 2083 MigrateCommon args = { 2084 .connect_uri = uri, 2085 .listen_uri = uri, 2086 .start_hook = test_migrate_compress_start, 2087 /* 2088 * Test that no invalid thread state is left over from 2089 * the previous iteration. 2090 */ 2091 .iterations = 2, 2092 /* 2093 * We make sure the compressor can always work well even if guest 2094 * memory is changing. See commit 34ab9e9743 where we used to fix 2095 * a bug when only trigger-able with guest memory changing. 2096 */ 2097 .live = true, 2098 }; 2099 2100 test_precopy_common(&args); 2101 } 2102 2103 static void test_precopy_unix_compress_nowait(void) 2104 { 2105 g_autofree char *uri = g_strdup_printf("unix:%s/migsocket", tmpfs); 2106 MigrateCommon args = { 2107 .connect_uri = uri, 2108 .listen_uri = uri, 2109 .start_hook = test_migrate_compress_nowait_start, 2110 /* 2111 * Test that no invalid thread state is left over from 2112 * the previous iteration. 2113 */ 2114 .iterations = 2, 2115 /* Same reason for the wait version of precopy compress test */ 2116 .live = true, 2117 }; 2118 2119 test_precopy_common(&args); 2120 } 2121 2122 static void test_precopy_file(void) 2123 { 2124 g_autofree char *uri = g_strdup_printf("file:%s/%s", tmpfs, 2125 FILE_TEST_FILENAME); 2126 MigrateCommon args = { 2127 .connect_uri = uri, 2128 .listen_uri = "defer", 2129 }; 2130 2131 test_file_common(&args, true); 2132 } 2133 2134 static void file_offset_finish_hook(QTestState *from, QTestState *to, 2135 void *opaque) 2136 { 2137 #if defined(__linux__) 2138 g_autofree char *path = g_strdup_printf("%s/%s", tmpfs, FILE_TEST_FILENAME); 2139 size_t size = FILE_TEST_OFFSET + sizeof(QEMU_VM_FILE_MAGIC); 2140 uintptr_t *addr, *p; 2141 int fd; 2142 2143 fd = open(path, O_RDONLY); 2144 g_assert(fd != -1); 2145 addr = mmap(NULL, size, PROT_READ, MAP_SHARED, fd, 0); 2146 g_assert(addr != MAP_FAILED); 2147 2148 /* 2149 * Ensure the skipped offset contains zeros and the migration 2150 * stream starts at the right place. 2151 */ 2152 p = addr; 2153 while (p < addr + FILE_TEST_OFFSET / sizeof(uintptr_t)) { 2154 g_assert(*p == 0); 2155 p++; 2156 } 2157 g_assert_cmpint(cpu_to_be64(*p) >> 32, ==, QEMU_VM_FILE_MAGIC); 2158 2159 munmap(addr, size); 2160 close(fd); 2161 #endif 2162 } 2163 2164 static void test_precopy_file_offset(void) 2165 { 2166 g_autofree char *uri = g_strdup_printf("file:%s/%s,offset=%d", tmpfs, 2167 FILE_TEST_FILENAME, 2168 FILE_TEST_OFFSET); 2169 MigrateCommon args = { 2170 .connect_uri = uri, 2171 .listen_uri = "defer", 2172 .finish_hook = file_offset_finish_hook, 2173 }; 2174 2175 test_file_common(&args, false); 2176 } 2177 2178 static void test_precopy_file_offset_bad(void) 2179 { 2180 /* using a value not supported by qemu_strtosz() */ 2181 g_autofree char *uri = g_strdup_printf("file:%s/%s,offset=0x20M", 2182 tmpfs, FILE_TEST_FILENAME); 2183 MigrateCommon args = { 2184 .connect_uri = uri, 2185 .listen_uri = "defer", 2186 .result = MIG_TEST_QMP_ERROR, 2187 }; 2188 2189 test_file_common(&args, false); 2190 } 2191 2192 static void *test_mode_reboot_start(QTestState *from, QTestState *to) 2193 { 2194 migrate_set_parameter_str(from, "mode", "cpr-reboot"); 2195 migrate_set_parameter_str(to, "mode", "cpr-reboot"); 2196 2197 migrate_set_capability(from, "x-ignore-shared", true); 2198 migrate_set_capability(to, "x-ignore-shared", true); 2199 2200 return NULL; 2201 } 2202 2203 static void *migrate_mapped_ram_start(QTestState *from, QTestState *to) 2204 { 2205 migrate_set_capability(from, "mapped-ram", true); 2206 migrate_set_capability(to, "mapped-ram", true); 2207 2208 return NULL; 2209 } 2210 2211 static void test_mode_reboot(void) 2212 { 2213 g_autofree char *uri = g_strdup_printf("file:%s/%s", tmpfs, 2214 FILE_TEST_FILENAME); 2215 MigrateCommon args = { 2216 .start.use_shmem = true, 2217 .connect_uri = uri, 2218 .listen_uri = "defer", 2219 .start_hook = test_mode_reboot_start 2220 }; 2221 2222 test_file_common(&args, true); 2223 } 2224 2225 static void test_precopy_file_mapped_ram_live(void) 2226 { 2227 g_autofree char *uri = g_strdup_printf("file:%s/%s", tmpfs, 2228 FILE_TEST_FILENAME); 2229 MigrateCommon args = { 2230 .connect_uri = uri, 2231 .listen_uri = "defer", 2232 .start_hook = migrate_mapped_ram_start, 2233 }; 2234 2235 test_file_common(&args, false); 2236 } 2237 2238 static void test_precopy_file_mapped_ram(void) 2239 { 2240 g_autofree char *uri = g_strdup_printf("file:%s/%s", tmpfs, 2241 FILE_TEST_FILENAME); 2242 MigrateCommon args = { 2243 .connect_uri = uri, 2244 .listen_uri = "defer", 2245 .start_hook = migrate_mapped_ram_start, 2246 }; 2247 2248 test_file_common(&args, true); 2249 } 2250 2251 static void *migrate_multifd_mapped_ram_start(QTestState *from, QTestState *to) 2252 { 2253 migrate_mapped_ram_start(from, to); 2254 2255 migrate_set_parameter_int(from, "multifd-channels", 4); 2256 migrate_set_parameter_int(to, "multifd-channels", 4); 2257 2258 migrate_set_capability(from, "multifd", true); 2259 migrate_set_capability(to, "multifd", true); 2260 2261 return NULL; 2262 } 2263 2264 static void test_multifd_file_mapped_ram_live(void) 2265 { 2266 g_autofree char *uri = g_strdup_printf("file:%s/%s", tmpfs, 2267 FILE_TEST_FILENAME); 2268 MigrateCommon args = { 2269 .connect_uri = uri, 2270 .listen_uri = "defer", 2271 .start_hook = migrate_multifd_mapped_ram_start, 2272 }; 2273 2274 test_file_common(&args, false); 2275 } 2276 2277 static void test_multifd_file_mapped_ram(void) 2278 { 2279 g_autofree char *uri = g_strdup_printf("file:%s/%s", tmpfs, 2280 FILE_TEST_FILENAME); 2281 MigrateCommon args = { 2282 .connect_uri = uri, 2283 .listen_uri = "defer", 2284 .start_hook = migrate_multifd_mapped_ram_start, 2285 }; 2286 2287 test_file_common(&args, true); 2288 } 2289 2290 2291 static void test_precopy_tcp_plain(void) 2292 { 2293 MigrateCommon args = { 2294 .listen_uri = "tcp:127.0.0.1:0", 2295 }; 2296 2297 test_precopy_common(&args); 2298 } 2299 2300 static void *test_migrate_switchover_ack_start(QTestState *from, QTestState *to) 2301 { 2302 2303 migrate_set_capability(from, "return-path", true); 2304 migrate_set_capability(to, "return-path", true); 2305 2306 migrate_set_capability(from, "switchover-ack", true); 2307 migrate_set_capability(to, "switchover-ack", true); 2308 2309 return NULL; 2310 } 2311 2312 static void test_precopy_tcp_switchover_ack(void) 2313 { 2314 MigrateCommon args = { 2315 .listen_uri = "tcp:127.0.0.1:0", 2316 .start_hook = test_migrate_switchover_ack_start, 2317 /* 2318 * Source VM must be running in order to consider the switchover ACK 2319 * when deciding to do switchover or not. 2320 */ 2321 .live = true, 2322 }; 2323 2324 test_precopy_common(&args); 2325 } 2326 2327 #ifdef CONFIG_GNUTLS 2328 static void test_precopy_tcp_tls_psk_match(void) 2329 { 2330 MigrateCommon args = { 2331 .listen_uri = "tcp:127.0.0.1:0", 2332 .start_hook = test_migrate_tls_psk_start_match, 2333 .finish_hook = test_migrate_tls_psk_finish, 2334 }; 2335 2336 test_precopy_common(&args); 2337 } 2338 2339 static void test_precopy_tcp_tls_psk_mismatch(void) 2340 { 2341 MigrateCommon args = { 2342 .start = { 2343 .hide_stderr = true, 2344 }, 2345 .listen_uri = "tcp:127.0.0.1:0", 2346 .start_hook = test_migrate_tls_psk_start_mismatch, 2347 .finish_hook = test_migrate_tls_psk_finish, 2348 .result = MIG_TEST_FAIL, 2349 }; 2350 2351 test_precopy_common(&args); 2352 } 2353 2354 #ifdef CONFIG_TASN1 2355 static void test_precopy_tcp_tls_x509_default_host(void) 2356 { 2357 MigrateCommon args = { 2358 .listen_uri = "tcp:127.0.0.1:0", 2359 .start_hook = test_migrate_tls_x509_start_default_host, 2360 .finish_hook = test_migrate_tls_x509_finish, 2361 }; 2362 2363 test_precopy_common(&args); 2364 } 2365 2366 static void test_precopy_tcp_tls_x509_override_host(void) 2367 { 2368 MigrateCommon args = { 2369 .listen_uri = "tcp:127.0.0.1:0", 2370 .start_hook = test_migrate_tls_x509_start_override_host, 2371 .finish_hook = test_migrate_tls_x509_finish, 2372 }; 2373 2374 test_precopy_common(&args); 2375 } 2376 2377 static void test_precopy_tcp_tls_x509_mismatch_host(void) 2378 { 2379 MigrateCommon args = { 2380 .start = { 2381 .hide_stderr = true, 2382 }, 2383 .listen_uri = "tcp:127.0.0.1:0", 2384 .start_hook = test_migrate_tls_x509_start_mismatch_host, 2385 .finish_hook = test_migrate_tls_x509_finish, 2386 .result = MIG_TEST_FAIL_DEST_QUIT_ERR, 2387 }; 2388 2389 test_precopy_common(&args); 2390 } 2391 2392 static void test_precopy_tcp_tls_x509_friendly_client(void) 2393 { 2394 MigrateCommon args = { 2395 .listen_uri = "tcp:127.0.0.1:0", 2396 .start_hook = test_migrate_tls_x509_start_friendly_client, 2397 .finish_hook = test_migrate_tls_x509_finish, 2398 }; 2399 2400 test_precopy_common(&args); 2401 } 2402 2403 static void test_precopy_tcp_tls_x509_hostile_client(void) 2404 { 2405 MigrateCommon args = { 2406 .start = { 2407 .hide_stderr = true, 2408 }, 2409 .listen_uri = "tcp:127.0.0.1:0", 2410 .start_hook = test_migrate_tls_x509_start_hostile_client, 2411 .finish_hook = test_migrate_tls_x509_finish, 2412 .result = MIG_TEST_FAIL, 2413 }; 2414 2415 test_precopy_common(&args); 2416 } 2417 2418 static void test_precopy_tcp_tls_x509_allow_anon_client(void) 2419 { 2420 MigrateCommon args = { 2421 .listen_uri = "tcp:127.0.0.1:0", 2422 .start_hook = test_migrate_tls_x509_start_allow_anon_client, 2423 .finish_hook = test_migrate_tls_x509_finish, 2424 }; 2425 2426 test_precopy_common(&args); 2427 } 2428 2429 static void test_precopy_tcp_tls_x509_reject_anon_client(void) 2430 { 2431 MigrateCommon args = { 2432 .start = { 2433 .hide_stderr = true, 2434 }, 2435 .listen_uri = "tcp:127.0.0.1:0", 2436 .start_hook = test_migrate_tls_x509_start_reject_anon_client, 2437 .finish_hook = test_migrate_tls_x509_finish, 2438 .result = MIG_TEST_FAIL, 2439 }; 2440 2441 test_precopy_common(&args); 2442 } 2443 #endif /* CONFIG_TASN1 */ 2444 #endif /* CONFIG_GNUTLS */ 2445 2446 #ifndef _WIN32 2447 static void *test_migrate_fd_start_hook(QTestState *from, 2448 QTestState *to) 2449 { 2450 int ret; 2451 int pair[2]; 2452 2453 /* Create two connected sockets for migration */ 2454 ret = qemu_socketpair(PF_LOCAL, SOCK_STREAM, 0, pair); 2455 g_assert_cmpint(ret, ==, 0); 2456 2457 /* Send the 1st socket to the target */ 2458 qtest_qmp_fds_assert_success(to, &pair[0], 1, 2459 "{ 'execute': 'getfd'," 2460 " 'arguments': { 'fdname': 'fd-mig' }}"); 2461 close(pair[0]); 2462 2463 /* Start incoming migration from the 1st socket */ 2464 migrate_incoming_qmp(to, "fd:fd-mig", "{}"); 2465 2466 /* Send the 2nd socket to the target */ 2467 qtest_qmp_fds_assert_success(from, &pair[1], 1, 2468 "{ 'execute': 'getfd'," 2469 " 'arguments': { 'fdname': 'fd-mig' }}"); 2470 close(pair[1]); 2471 2472 return NULL; 2473 } 2474 2475 static void test_migrate_fd_finish_hook(QTestState *from, 2476 QTestState *to, 2477 void *opaque) 2478 { 2479 QDict *rsp; 2480 const char *error_desc; 2481 2482 /* Test closing fds */ 2483 /* We assume, that QEMU removes named fd from its list, 2484 * so this should fail */ 2485 rsp = qtest_qmp(from, "{ 'execute': 'closefd'," 2486 " 'arguments': { 'fdname': 'fd-mig' }}"); 2487 g_assert_true(qdict_haskey(rsp, "error")); 2488 error_desc = qdict_get_str(qdict_get_qdict(rsp, "error"), "desc"); 2489 g_assert_cmpstr(error_desc, ==, "File descriptor named 'fd-mig' not found"); 2490 qobject_unref(rsp); 2491 2492 rsp = qtest_qmp(to, "{ 'execute': 'closefd'," 2493 " 'arguments': { 'fdname': 'fd-mig' }}"); 2494 g_assert_true(qdict_haskey(rsp, "error")); 2495 error_desc = qdict_get_str(qdict_get_qdict(rsp, "error"), "desc"); 2496 g_assert_cmpstr(error_desc, ==, "File descriptor named 'fd-mig' not found"); 2497 qobject_unref(rsp); 2498 } 2499 2500 static void test_migrate_precopy_fd_socket(void) 2501 { 2502 MigrateCommon args = { 2503 .listen_uri = "defer", 2504 .connect_uri = "fd:fd-mig", 2505 .start_hook = test_migrate_fd_start_hook, 2506 .finish_hook = test_migrate_fd_finish_hook 2507 }; 2508 test_precopy_common(&args); 2509 } 2510 2511 static void *migrate_precopy_fd_file_start(QTestState *from, QTestState *to) 2512 { 2513 g_autofree char *file = g_strdup_printf("%s/%s", tmpfs, FILE_TEST_FILENAME); 2514 int src_flags = O_CREAT | O_RDWR; 2515 int dst_flags = O_CREAT | O_RDWR; 2516 int fds[2]; 2517 2518 fds[0] = open(file, src_flags, 0660); 2519 assert(fds[0] != -1); 2520 2521 fds[1] = open(file, dst_flags, 0660); 2522 assert(fds[1] != -1); 2523 2524 2525 qtest_qmp_fds_assert_success(to, &fds[0], 1, 2526 "{ 'execute': 'getfd'," 2527 " 'arguments': { 'fdname': 'fd-mig' }}"); 2528 2529 qtest_qmp_fds_assert_success(from, &fds[1], 1, 2530 "{ 'execute': 'getfd'," 2531 " 'arguments': { 'fdname': 'fd-mig' }}"); 2532 2533 close(fds[0]); 2534 close(fds[1]); 2535 2536 return NULL; 2537 } 2538 2539 static void *migrate_fd_file_mapped_ram_start(QTestState *from, QTestState *to) 2540 { 2541 migrate_mapped_ram_start(from, to); 2542 2543 return migrate_precopy_fd_file_start(from, to); 2544 } 2545 2546 static void test_migrate_precopy_fd_file(void) 2547 { 2548 MigrateCommon args = { 2549 .listen_uri = "defer", 2550 .connect_uri = "fd:fd-mig", 2551 .start_hook = migrate_precopy_fd_file_start, 2552 .finish_hook = test_migrate_fd_finish_hook 2553 }; 2554 test_file_common(&args, true); 2555 } 2556 2557 static void test_migrate_precopy_fd_file_mapped_ram(void) 2558 { 2559 MigrateCommon args = { 2560 .listen_uri = "defer", 2561 .connect_uri = "fd:fd-mig", 2562 .start_hook = migrate_fd_file_mapped_ram_start, 2563 .finish_hook = test_migrate_fd_finish_hook 2564 }; 2565 test_file_common(&args, true); 2566 } 2567 2568 static void *migrate_multifd_fd_mapped_ram_start(QTestState *from, 2569 QTestState *to) 2570 { 2571 migrate_multifd_mapped_ram_start(from, to); 2572 return migrate_precopy_fd_file_start(from, to); 2573 } 2574 2575 static void test_multifd_fd_mapped_ram(void) 2576 { 2577 MigrateCommon args = { 2578 .connect_uri = "fd:fd-mig", 2579 .listen_uri = "defer", 2580 .start_hook = migrate_multifd_fd_mapped_ram_start, 2581 .finish_hook = test_migrate_fd_finish_hook 2582 }; 2583 2584 test_file_common(&args, true); 2585 } 2586 #endif /* _WIN32 */ 2587 2588 static void do_test_validate_uuid(MigrateStart *args, bool should_fail) 2589 { 2590 g_autofree char *uri = g_strdup_printf("unix:%s/migsocket", tmpfs); 2591 QTestState *from, *to; 2592 2593 if (test_migrate_start(&from, &to, uri, args)) { 2594 return; 2595 } 2596 2597 /* 2598 * UUID validation is at the begin of migration. So, the main process of 2599 * migration is not interesting for us here. Thus, set huge downtime for 2600 * very fast migration. 2601 */ 2602 migrate_set_parameter_int(from, "downtime-limit", 1000000); 2603 migrate_set_capability(from, "validate-uuid", true); 2604 2605 /* Wait for the first serial output from the source */ 2606 wait_for_serial("src_serial"); 2607 2608 migrate_qmp(from, uri, "{}"); 2609 2610 if (should_fail) { 2611 qtest_set_expected_status(to, EXIT_FAILURE); 2612 wait_for_migration_fail(from, true); 2613 } else { 2614 wait_for_migration_complete(from); 2615 } 2616 2617 test_migrate_end(from, to, false); 2618 } 2619 2620 static void test_validate_uuid(void) 2621 { 2622 MigrateStart args = { 2623 .opts_source = "-uuid 11111111-1111-1111-1111-111111111111", 2624 .opts_target = "-uuid 11111111-1111-1111-1111-111111111111", 2625 }; 2626 2627 do_test_validate_uuid(&args, false); 2628 } 2629 2630 static void test_validate_uuid_error(void) 2631 { 2632 MigrateStart args = { 2633 .opts_source = "-uuid 11111111-1111-1111-1111-111111111111", 2634 .opts_target = "-uuid 22222222-2222-2222-2222-222222222222", 2635 .hide_stderr = true, 2636 }; 2637 2638 do_test_validate_uuid(&args, true); 2639 } 2640 2641 static void test_validate_uuid_src_not_set(void) 2642 { 2643 MigrateStart args = { 2644 .opts_target = "-uuid 22222222-2222-2222-2222-222222222222", 2645 .hide_stderr = true, 2646 }; 2647 2648 do_test_validate_uuid(&args, false); 2649 } 2650 2651 static void test_validate_uuid_dst_not_set(void) 2652 { 2653 MigrateStart args = { 2654 .opts_source = "-uuid 11111111-1111-1111-1111-111111111111", 2655 .hide_stderr = true, 2656 }; 2657 2658 do_test_validate_uuid(&args, false); 2659 } 2660 2661 /* 2662 * The way auto_converge works, we need to do too many passes to 2663 * run this test. Auto_converge logic is only run once every 2664 * three iterations, so: 2665 * 2666 * - 3 iterations without auto_converge enabled 2667 * - 3 iterations with pct = 5 2668 * - 3 iterations with pct = 30 2669 * - 3 iterations with pct = 55 2670 * - 3 iterations with pct = 80 2671 * - 3 iterations with pct = 95 (max(95, 80 + 25)) 2672 * 2673 * To make things even worse, we need to run the initial stage at 2674 * 3MB/s so we enter autoconverge even when host is (over)loaded. 2675 */ 2676 static void test_migrate_auto_converge(void) 2677 { 2678 g_autofree char *uri = g_strdup_printf("unix:%s/migsocket", tmpfs); 2679 MigrateStart args = {}; 2680 QTestState *from, *to; 2681 int64_t percentage; 2682 2683 /* 2684 * We want the test to be stable and as fast as possible. 2685 * E.g., with 1Gb/s bandwidth migration may pass without throttling, 2686 * so we need to decrease a bandwidth. 2687 */ 2688 const int64_t init_pct = 5, inc_pct = 25, max_pct = 95; 2689 2690 if (test_migrate_start(&from, &to, uri, &args)) { 2691 return; 2692 } 2693 2694 migrate_set_capability(from, "auto-converge", true); 2695 migrate_set_parameter_int(from, "cpu-throttle-initial", init_pct); 2696 migrate_set_parameter_int(from, "cpu-throttle-increment", inc_pct); 2697 migrate_set_parameter_int(from, "max-cpu-throttle", max_pct); 2698 2699 /* 2700 * Set the initial parameters so that the migration could not converge 2701 * without throttling. 2702 */ 2703 migrate_ensure_non_converge(from); 2704 2705 /* To check remaining size after precopy */ 2706 migrate_set_capability(from, "pause-before-switchover", true); 2707 2708 /* Wait for the first serial output from the source */ 2709 wait_for_serial("src_serial"); 2710 2711 migrate_qmp(from, uri, "{}"); 2712 2713 /* Wait for throttling begins */ 2714 percentage = 0; 2715 do { 2716 percentage = read_migrate_property_int(from, "cpu-throttle-percentage"); 2717 if (percentage != 0) { 2718 break; 2719 } 2720 usleep(20); 2721 g_assert_false(src_state.stop_seen); 2722 } while (true); 2723 /* The first percentage of throttling should be at least init_pct */ 2724 g_assert_cmpint(percentage, >=, init_pct); 2725 /* Now, when we tested that throttling works, let it converge */ 2726 migrate_ensure_converge(from); 2727 2728 /* 2729 * Wait for pre-switchover status to check last throttle percentage 2730 * and remaining. These values will be zeroed later 2731 */ 2732 wait_for_migration_status(from, "pre-switchover", NULL); 2733 2734 /* The final percentage of throttling shouldn't be greater than max_pct */ 2735 percentage = read_migrate_property_int(from, "cpu-throttle-percentage"); 2736 g_assert_cmpint(percentage, <=, max_pct); 2737 migrate_continue(from, "pre-switchover"); 2738 2739 qtest_qmp_eventwait(to, "RESUME"); 2740 2741 wait_for_serial("dest_serial"); 2742 wait_for_migration_complete(from); 2743 2744 test_migrate_end(from, to, true); 2745 } 2746 2747 static void * 2748 test_migrate_precopy_tcp_multifd_start_common(QTestState *from, 2749 QTestState *to, 2750 const char *method) 2751 { 2752 migrate_set_parameter_int(from, "multifd-channels", 16); 2753 migrate_set_parameter_int(to, "multifd-channels", 16); 2754 2755 migrate_set_parameter_str(from, "multifd-compression", method); 2756 migrate_set_parameter_str(to, "multifd-compression", method); 2757 2758 migrate_set_capability(from, "multifd", true); 2759 migrate_set_capability(to, "multifd", true); 2760 2761 /* Start incoming migration from the 1st socket */ 2762 migrate_incoming_qmp(to, "tcp:127.0.0.1:0", "{}"); 2763 2764 return NULL; 2765 } 2766 2767 static void * 2768 test_migrate_precopy_tcp_multifd_start(QTestState *from, 2769 QTestState *to) 2770 { 2771 return test_migrate_precopy_tcp_multifd_start_common(from, to, "none"); 2772 } 2773 2774 static void * 2775 test_migrate_precopy_tcp_multifd_start_zero_page_legacy(QTestState *from, 2776 QTestState *to) 2777 { 2778 test_migrate_precopy_tcp_multifd_start_common(from, to, "none"); 2779 migrate_set_parameter_str(from, "zero-page-detection", "legacy"); 2780 return NULL; 2781 } 2782 2783 static void * 2784 test_migration_precopy_tcp_multifd_start_no_zero_page(QTestState *from, 2785 QTestState *to) 2786 { 2787 test_migrate_precopy_tcp_multifd_start_common(from, to, "none"); 2788 migrate_set_parameter_str(from, "zero-page-detection", "none"); 2789 return NULL; 2790 } 2791 2792 static void * 2793 test_migrate_precopy_tcp_multifd_zlib_start(QTestState *from, 2794 QTestState *to) 2795 { 2796 /* 2797 * Overloading this test to also check that set_parameter does not error. 2798 * This is also done in the tests for the other compression methods. 2799 */ 2800 migrate_set_parameter_int(from, "multifd-zlib-level", 2); 2801 migrate_set_parameter_int(to, "multifd-zlib-level", 2); 2802 2803 return test_migrate_precopy_tcp_multifd_start_common(from, to, "zlib"); 2804 } 2805 2806 #ifdef CONFIG_ZSTD 2807 static void * 2808 test_migrate_precopy_tcp_multifd_zstd_start(QTestState *from, 2809 QTestState *to) 2810 { 2811 migrate_set_parameter_int(from, "multifd-zstd-level", 2); 2812 migrate_set_parameter_int(to, "multifd-zstd-level", 2); 2813 2814 return test_migrate_precopy_tcp_multifd_start_common(from, to, "zstd"); 2815 } 2816 #endif /* CONFIG_ZSTD */ 2817 2818 static void test_multifd_tcp_none(void) 2819 { 2820 MigrateCommon args = { 2821 .listen_uri = "defer", 2822 .start_hook = test_migrate_precopy_tcp_multifd_start, 2823 /* 2824 * Multifd is more complicated than most of the features, it 2825 * directly takes guest page buffers when sending, make sure 2826 * everything will work alright even if guest page is changing. 2827 */ 2828 .live = true, 2829 }; 2830 test_precopy_common(&args); 2831 } 2832 2833 static void test_multifd_tcp_zero_page_legacy(void) 2834 { 2835 MigrateCommon args = { 2836 .listen_uri = "defer", 2837 .start_hook = test_migrate_precopy_tcp_multifd_start_zero_page_legacy, 2838 /* 2839 * Multifd is more complicated than most of the features, it 2840 * directly takes guest page buffers when sending, make sure 2841 * everything will work alright even if guest page is changing. 2842 */ 2843 .live = true, 2844 }; 2845 test_precopy_common(&args); 2846 } 2847 2848 static void test_multifd_tcp_no_zero_page(void) 2849 { 2850 MigrateCommon args = { 2851 .listen_uri = "defer", 2852 .start_hook = test_migration_precopy_tcp_multifd_start_no_zero_page, 2853 /* 2854 * Multifd is more complicated than most of the features, it 2855 * directly takes guest page buffers when sending, make sure 2856 * everything will work alright even if guest page is changing. 2857 */ 2858 .live = true, 2859 }; 2860 test_precopy_common(&args); 2861 } 2862 2863 static void test_multifd_tcp_zlib(void) 2864 { 2865 MigrateCommon args = { 2866 .listen_uri = "defer", 2867 .start_hook = test_migrate_precopy_tcp_multifd_zlib_start, 2868 }; 2869 test_precopy_common(&args); 2870 } 2871 2872 #ifdef CONFIG_ZSTD 2873 static void test_multifd_tcp_zstd(void) 2874 { 2875 MigrateCommon args = { 2876 .listen_uri = "defer", 2877 .start_hook = test_migrate_precopy_tcp_multifd_zstd_start, 2878 }; 2879 test_precopy_common(&args); 2880 } 2881 #endif 2882 2883 #ifdef CONFIG_GNUTLS 2884 static void * 2885 test_migrate_multifd_tcp_tls_psk_start_match(QTestState *from, 2886 QTestState *to) 2887 { 2888 test_migrate_precopy_tcp_multifd_start_common(from, to, "none"); 2889 return test_migrate_tls_psk_start_match(from, to); 2890 } 2891 2892 static void * 2893 test_migrate_multifd_tcp_tls_psk_start_mismatch(QTestState *from, 2894 QTestState *to) 2895 { 2896 test_migrate_precopy_tcp_multifd_start_common(from, to, "none"); 2897 return test_migrate_tls_psk_start_mismatch(from, to); 2898 } 2899 2900 #ifdef CONFIG_TASN1 2901 static void * 2902 test_migrate_multifd_tls_x509_start_default_host(QTestState *from, 2903 QTestState *to) 2904 { 2905 test_migrate_precopy_tcp_multifd_start_common(from, to, "none"); 2906 return test_migrate_tls_x509_start_default_host(from, to); 2907 } 2908 2909 static void * 2910 test_migrate_multifd_tls_x509_start_override_host(QTestState *from, 2911 QTestState *to) 2912 { 2913 test_migrate_precopy_tcp_multifd_start_common(from, to, "none"); 2914 return test_migrate_tls_x509_start_override_host(from, to); 2915 } 2916 2917 static void * 2918 test_migrate_multifd_tls_x509_start_mismatch_host(QTestState *from, 2919 QTestState *to) 2920 { 2921 test_migrate_precopy_tcp_multifd_start_common(from, to, "none"); 2922 return test_migrate_tls_x509_start_mismatch_host(from, to); 2923 } 2924 2925 static void * 2926 test_migrate_multifd_tls_x509_start_allow_anon_client(QTestState *from, 2927 QTestState *to) 2928 { 2929 test_migrate_precopy_tcp_multifd_start_common(from, to, "none"); 2930 return test_migrate_tls_x509_start_allow_anon_client(from, to); 2931 } 2932 2933 static void * 2934 test_migrate_multifd_tls_x509_start_reject_anon_client(QTestState *from, 2935 QTestState *to) 2936 { 2937 test_migrate_precopy_tcp_multifd_start_common(from, to, "none"); 2938 return test_migrate_tls_x509_start_reject_anon_client(from, to); 2939 } 2940 #endif /* CONFIG_TASN1 */ 2941 2942 static void test_multifd_tcp_tls_psk_match(void) 2943 { 2944 MigrateCommon args = { 2945 .listen_uri = "defer", 2946 .start_hook = test_migrate_multifd_tcp_tls_psk_start_match, 2947 .finish_hook = test_migrate_tls_psk_finish, 2948 }; 2949 test_precopy_common(&args); 2950 } 2951 2952 static void test_multifd_tcp_tls_psk_mismatch(void) 2953 { 2954 MigrateCommon args = { 2955 .start = { 2956 .hide_stderr = true, 2957 }, 2958 .listen_uri = "defer", 2959 .start_hook = test_migrate_multifd_tcp_tls_psk_start_mismatch, 2960 .finish_hook = test_migrate_tls_psk_finish, 2961 .result = MIG_TEST_FAIL, 2962 }; 2963 test_precopy_common(&args); 2964 } 2965 2966 #ifdef CONFIG_TASN1 2967 static void test_multifd_tcp_tls_x509_default_host(void) 2968 { 2969 MigrateCommon args = { 2970 .listen_uri = "defer", 2971 .start_hook = test_migrate_multifd_tls_x509_start_default_host, 2972 .finish_hook = test_migrate_tls_x509_finish, 2973 }; 2974 test_precopy_common(&args); 2975 } 2976 2977 static void test_multifd_tcp_tls_x509_override_host(void) 2978 { 2979 MigrateCommon args = { 2980 .listen_uri = "defer", 2981 .start_hook = test_migrate_multifd_tls_x509_start_override_host, 2982 .finish_hook = test_migrate_tls_x509_finish, 2983 }; 2984 test_precopy_common(&args); 2985 } 2986 2987 static void test_multifd_tcp_tls_x509_mismatch_host(void) 2988 { 2989 /* 2990 * This has different behaviour to the non-multifd case. 2991 * 2992 * In non-multifd case when client aborts due to mismatched 2993 * cert host, the server has already started trying to load 2994 * migration state, and so it exits with I/O failure. 2995 * 2996 * In multifd case when client aborts due to mismatched 2997 * cert host, the server is still waiting for the other 2998 * multifd connections to arrive so hasn't started trying 2999 * to load migration state, and thus just aborts the migration 3000 * without exiting. 3001 */ 3002 MigrateCommon args = { 3003 .start = { 3004 .hide_stderr = true, 3005 }, 3006 .listen_uri = "defer", 3007 .start_hook = test_migrate_multifd_tls_x509_start_mismatch_host, 3008 .finish_hook = test_migrate_tls_x509_finish, 3009 .result = MIG_TEST_FAIL, 3010 }; 3011 test_precopy_common(&args); 3012 } 3013 3014 static void test_multifd_tcp_tls_x509_allow_anon_client(void) 3015 { 3016 MigrateCommon args = { 3017 .listen_uri = "defer", 3018 .start_hook = test_migrate_multifd_tls_x509_start_allow_anon_client, 3019 .finish_hook = test_migrate_tls_x509_finish, 3020 }; 3021 test_precopy_common(&args); 3022 } 3023 3024 static void test_multifd_tcp_tls_x509_reject_anon_client(void) 3025 { 3026 MigrateCommon args = { 3027 .start = { 3028 .hide_stderr = true, 3029 }, 3030 .listen_uri = "defer", 3031 .start_hook = test_migrate_multifd_tls_x509_start_reject_anon_client, 3032 .finish_hook = test_migrate_tls_x509_finish, 3033 .result = MIG_TEST_FAIL, 3034 }; 3035 test_precopy_common(&args); 3036 } 3037 #endif /* CONFIG_TASN1 */ 3038 #endif /* CONFIG_GNUTLS */ 3039 3040 /* 3041 * This test does: 3042 * source target 3043 * migrate_incoming 3044 * migrate 3045 * migrate_cancel 3046 * launch another target 3047 * migrate 3048 * 3049 * And see that it works 3050 */ 3051 static void test_multifd_tcp_cancel(void) 3052 { 3053 MigrateStart args = { 3054 .hide_stderr = true, 3055 }; 3056 QTestState *from, *to, *to2; 3057 g_autofree char *uri = NULL; 3058 3059 if (test_migrate_start(&from, &to, "defer", &args)) { 3060 return; 3061 } 3062 3063 migrate_ensure_non_converge(from); 3064 migrate_prepare_for_dirty_mem(from); 3065 3066 migrate_set_parameter_int(from, "multifd-channels", 16); 3067 migrate_set_parameter_int(to, "multifd-channels", 16); 3068 3069 migrate_set_capability(from, "multifd", true); 3070 migrate_set_capability(to, "multifd", true); 3071 3072 /* Start incoming migration from the 1st socket */ 3073 migrate_incoming_qmp(to, "tcp:127.0.0.1:0", "{}"); 3074 3075 /* Wait for the first serial output from the source */ 3076 wait_for_serial("src_serial"); 3077 3078 uri = migrate_get_socket_address(to, "socket-address"); 3079 3080 migrate_qmp(from, uri, "{}"); 3081 3082 migrate_wait_for_dirty_mem(from, to); 3083 3084 migrate_cancel(from); 3085 3086 /* Make sure QEMU process "to" exited */ 3087 qtest_set_expected_status(to, EXIT_FAILURE); 3088 qtest_wait_qemu(to); 3089 3090 args = (MigrateStart){ 3091 .only_target = true, 3092 }; 3093 3094 if (test_migrate_start(&from, &to2, "defer", &args)) { 3095 return; 3096 } 3097 3098 migrate_set_parameter_int(to2, "multifd-channels", 16); 3099 3100 migrate_set_capability(to2, "multifd", true); 3101 3102 /* Start incoming migration from the 1st socket */ 3103 migrate_incoming_qmp(to2, "tcp:127.0.0.1:0", "{}"); 3104 3105 g_free(uri); 3106 uri = migrate_get_socket_address(to2, "socket-address"); 3107 3108 wait_for_migration_status(from, "cancelled", NULL); 3109 3110 migrate_ensure_non_converge(from); 3111 3112 migrate_qmp(from, uri, "{}"); 3113 3114 migrate_wait_for_dirty_mem(from, to2); 3115 3116 migrate_ensure_converge(from); 3117 3118 wait_for_stop(from, &src_state); 3119 qtest_qmp_eventwait(to2, "RESUME"); 3120 3121 wait_for_serial("dest_serial"); 3122 wait_for_migration_complete(from); 3123 test_migrate_end(from, to2, true); 3124 } 3125 3126 static void calc_dirty_rate(QTestState *who, uint64_t calc_time) 3127 { 3128 qtest_qmp_assert_success(who, 3129 "{ 'execute': 'calc-dirty-rate'," 3130 "'arguments': { " 3131 "'calc-time': %" PRIu64 "," 3132 "'mode': 'dirty-ring' }}", 3133 calc_time); 3134 } 3135 3136 static QDict *query_dirty_rate(QTestState *who) 3137 { 3138 return qtest_qmp_assert_success_ref(who, 3139 "{ 'execute': 'query-dirty-rate' }"); 3140 } 3141 3142 static void dirtylimit_set_all(QTestState *who, uint64_t dirtyrate) 3143 { 3144 qtest_qmp_assert_success(who, 3145 "{ 'execute': 'set-vcpu-dirty-limit'," 3146 "'arguments': { " 3147 "'dirty-rate': %" PRIu64 " } }", 3148 dirtyrate); 3149 } 3150 3151 static void cancel_vcpu_dirty_limit(QTestState *who) 3152 { 3153 qtest_qmp_assert_success(who, 3154 "{ 'execute': 'cancel-vcpu-dirty-limit' }"); 3155 } 3156 3157 static QDict *query_vcpu_dirty_limit(QTestState *who) 3158 { 3159 QDict *rsp; 3160 3161 rsp = qtest_qmp(who, "{ 'execute': 'query-vcpu-dirty-limit' }"); 3162 g_assert(!qdict_haskey(rsp, "error")); 3163 g_assert(qdict_haskey(rsp, "return")); 3164 3165 return rsp; 3166 } 3167 3168 static bool calc_dirtyrate_ready(QTestState *who) 3169 { 3170 QDict *rsp_return; 3171 gchar *status; 3172 3173 rsp_return = query_dirty_rate(who); 3174 g_assert(rsp_return); 3175 3176 status = g_strdup(qdict_get_str(rsp_return, "status")); 3177 g_assert(status); 3178 3179 return g_strcmp0(status, "measuring"); 3180 } 3181 3182 static void wait_for_calc_dirtyrate_complete(QTestState *who, 3183 int64_t time_s) 3184 { 3185 int max_try_count = 10000; 3186 usleep(time_s * 1000000); 3187 3188 while (!calc_dirtyrate_ready(who) && max_try_count--) { 3189 usleep(1000); 3190 } 3191 3192 /* 3193 * Set the timeout with 10 s(max_try_count * 1000us), 3194 * if dirtyrate measurement not complete, fail test. 3195 */ 3196 g_assert_cmpint(max_try_count, !=, 0); 3197 } 3198 3199 static int64_t get_dirty_rate(QTestState *who) 3200 { 3201 QDict *rsp_return; 3202 gchar *status; 3203 QList *rates; 3204 const QListEntry *entry; 3205 QDict *rate; 3206 int64_t dirtyrate; 3207 3208 rsp_return = query_dirty_rate(who); 3209 g_assert(rsp_return); 3210 3211 status = g_strdup(qdict_get_str(rsp_return, "status")); 3212 g_assert(status); 3213 g_assert_cmpstr(status, ==, "measured"); 3214 3215 rates = qdict_get_qlist(rsp_return, "vcpu-dirty-rate"); 3216 g_assert(rates && !qlist_empty(rates)); 3217 3218 entry = qlist_first(rates); 3219 g_assert(entry); 3220 3221 rate = qobject_to(QDict, qlist_entry_obj(entry)); 3222 g_assert(rate); 3223 3224 dirtyrate = qdict_get_try_int(rate, "dirty-rate", -1); 3225 3226 qobject_unref(rsp_return); 3227 return dirtyrate; 3228 } 3229 3230 static int64_t get_limit_rate(QTestState *who) 3231 { 3232 QDict *rsp_return; 3233 QList *rates; 3234 const QListEntry *entry; 3235 QDict *rate; 3236 int64_t dirtyrate; 3237 3238 rsp_return = query_vcpu_dirty_limit(who); 3239 g_assert(rsp_return); 3240 3241 rates = qdict_get_qlist(rsp_return, "return"); 3242 g_assert(rates && !qlist_empty(rates)); 3243 3244 entry = qlist_first(rates); 3245 g_assert(entry); 3246 3247 rate = qobject_to(QDict, qlist_entry_obj(entry)); 3248 g_assert(rate); 3249 3250 dirtyrate = qdict_get_try_int(rate, "limit-rate", -1); 3251 3252 qobject_unref(rsp_return); 3253 return dirtyrate; 3254 } 3255 3256 static QTestState *dirtylimit_start_vm(void) 3257 { 3258 QTestState *vm = NULL; 3259 g_autofree gchar *cmd = NULL; 3260 3261 bootfile_create(tmpfs, false); 3262 cmd = g_strdup_printf("-accel kvm,dirty-ring-size=4096 " 3263 "-name dirtylimit-test,debug-threads=on " 3264 "-m 150M -smp 1 " 3265 "-serial file:%s/vm_serial " 3266 "-drive file=%s,format=raw ", 3267 tmpfs, bootpath); 3268 3269 vm = qtest_init(cmd); 3270 return vm; 3271 } 3272 3273 static void dirtylimit_stop_vm(QTestState *vm) 3274 { 3275 qtest_quit(vm); 3276 cleanup("vm_serial"); 3277 } 3278 3279 static void test_vcpu_dirty_limit(void) 3280 { 3281 QTestState *vm; 3282 int64_t origin_rate; 3283 int64_t quota_rate; 3284 int64_t rate ; 3285 int max_try_count = 20; 3286 int hit = 0; 3287 3288 /* Start vm for vcpu dirtylimit test */ 3289 vm = dirtylimit_start_vm(); 3290 3291 /* Wait for the first serial output from the vm*/ 3292 wait_for_serial("vm_serial"); 3293 3294 /* Do dirtyrate measurement with calc time equals 1s */ 3295 calc_dirty_rate(vm, 1); 3296 3297 /* Sleep calc time and wait for calc dirtyrate complete */ 3298 wait_for_calc_dirtyrate_complete(vm, 1); 3299 3300 /* Query original dirty page rate */ 3301 origin_rate = get_dirty_rate(vm); 3302 3303 /* VM booted from bootsect should dirty memory steadily */ 3304 assert(origin_rate != 0); 3305 3306 /* Setup quota dirty page rate at half of origin */ 3307 quota_rate = origin_rate / 2; 3308 3309 /* Set dirtylimit */ 3310 dirtylimit_set_all(vm, quota_rate); 3311 3312 /* 3313 * Check if set-vcpu-dirty-limit and query-vcpu-dirty-limit 3314 * works literally 3315 */ 3316 g_assert_cmpint(quota_rate, ==, get_limit_rate(vm)); 3317 3318 /* Sleep a bit to check if it take effect */ 3319 usleep(2000000); 3320 3321 /* 3322 * Check if dirtylimit take effect realistically, set the 3323 * timeout with 20 s(max_try_count * 1s), if dirtylimit 3324 * doesn't take effect, fail test. 3325 */ 3326 while (--max_try_count) { 3327 calc_dirty_rate(vm, 1); 3328 wait_for_calc_dirtyrate_complete(vm, 1); 3329 rate = get_dirty_rate(vm); 3330 3331 /* 3332 * Assume hitting if current rate is less 3333 * than quota rate (within accepting error) 3334 */ 3335 if (rate < (quota_rate + DIRTYLIMIT_TOLERANCE_RANGE)) { 3336 hit = 1; 3337 break; 3338 } 3339 } 3340 3341 g_assert_cmpint(hit, ==, 1); 3342 3343 hit = 0; 3344 max_try_count = 20; 3345 3346 /* Check if dirtylimit cancellation take effect */ 3347 cancel_vcpu_dirty_limit(vm); 3348 while (--max_try_count) { 3349 calc_dirty_rate(vm, 1); 3350 wait_for_calc_dirtyrate_complete(vm, 1); 3351 rate = get_dirty_rate(vm); 3352 3353 /* 3354 * Assume dirtylimit be canceled if current rate is 3355 * greater than quota rate (within accepting error) 3356 */ 3357 if (rate > (quota_rate + DIRTYLIMIT_TOLERANCE_RANGE)) { 3358 hit = 1; 3359 break; 3360 } 3361 } 3362 3363 g_assert_cmpint(hit, ==, 1); 3364 dirtylimit_stop_vm(vm); 3365 } 3366 3367 static void migrate_dirty_limit_wait_showup(QTestState *from, 3368 const int64_t period, 3369 const int64_t value) 3370 { 3371 /* Enable dirty limit capability */ 3372 migrate_set_capability(from, "dirty-limit", true); 3373 3374 /* Set dirty limit parameters */ 3375 migrate_set_parameter_int(from, "x-vcpu-dirty-limit-period", period); 3376 migrate_set_parameter_int(from, "vcpu-dirty-limit", value); 3377 3378 /* Make sure migrate can't converge */ 3379 migrate_ensure_non_converge(from); 3380 3381 /* To check limit rate after precopy */ 3382 migrate_set_capability(from, "pause-before-switchover", true); 3383 3384 /* Wait for the serial output from the source */ 3385 wait_for_serial("src_serial"); 3386 } 3387 3388 /* 3389 * This test does: 3390 * source destination 3391 * start vm 3392 * start incoming vm 3393 * migrate 3394 * wait dirty limit to begin 3395 * cancel migrate 3396 * cancellation check 3397 * restart incoming vm 3398 * migrate 3399 * wait dirty limit to begin 3400 * wait pre-switchover event 3401 * convergence condition check 3402 * 3403 * And see if dirty limit migration works correctly. 3404 * This test case involves many passes, so it runs in slow mode only. 3405 */ 3406 static void test_migrate_dirty_limit(void) 3407 { 3408 g_autofree char *uri = g_strdup_printf("unix:%s/migsocket", tmpfs); 3409 QTestState *from, *to; 3410 int64_t remaining; 3411 uint64_t throttle_us_per_full; 3412 /* 3413 * We want the test to be stable and as fast as possible. 3414 * E.g., with 1Gb/s bandwidth migration may pass without dirty limit, 3415 * so we need to decrease a bandwidth. 3416 */ 3417 const int64_t dirtylimit_period = 1000, dirtylimit_value = 50; 3418 const int64_t max_bandwidth = 400000000; /* ~400Mb/s */ 3419 const int64_t downtime_limit = 250; /* 250ms */ 3420 /* 3421 * We migrate through unix-socket (> 500Mb/s). 3422 * Thus, expected migration speed ~= bandwidth limit (< 500Mb/s). 3423 * So, we can predict expected_threshold 3424 */ 3425 const int64_t expected_threshold = max_bandwidth * downtime_limit / 1000; 3426 int max_try_count = 10; 3427 MigrateCommon args = { 3428 .start = { 3429 .hide_stderr = true, 3430 .use_dirty_ring = true, 3431 }, 3432 .listen_uri = uri, 3433 .connect_uri = uri, 3434 }; 3435 3436 /* Start src, dst vm */ 3437 if (test_migrate_start(&from, &to, args.listen_uri, &args.start)) { 3438 return; 3439 } 3440 3441 /* Prepare for dirty limit migration and wait src vm show up */ 3442 migrate_dirty_limit_wait_showup(from, dirtylimit_period, dirtylimit_value); 3443 3444 /* Start migrate */ 3445 migrate_qmp(from, uri, "{}"); 3446 3447 /* Wait for dirty limit throttle begin */ 3448 throttle_us_per_full = 0; 3449 while (throttle_us_per_full == 0) { 3450 throttle_us_per_full = 3451 read_migrate_property_int(from, "dirty-limit-throttle-time-per-round"); 3452 usleep(100); 3453 g_assert_false(src_state.stop_seen); 3454 } 3455 3456 /* Now cancel migrate and wait for dirty limit throttle switch off */ 3457 migrate_cancel(from); 3458 wait_for_migration_status(from, "cancelled", NULL); 3459 3460 /* Check if dirty limit throttle switched off, set timeout 1ms */ 3461 do { 3462 throttle_us_per_full = 3463 read_migrate_property_int(from, "dirty-limit-throttle-time-per-round"); 3464 usleep(100); 3465 g_assert_false(src_state.stop_seen); 3466 } while (throttle_us_per_full != 0 && --max_try_count); 3467 3468 /* Assert dirty limit is not in service */ 3469 g_assert_cmpint(throttle_us_per_full, ==, 0); 3470 3471 args = (MigrateCommon) { 3472 .start = { 3473 .only_target = true, 3474 .use_dirty_ring = true, 3475 }, 3476 .listen_uri = uri, 3477 .connect_uri = uri, 3478 }; 3479 3480 /* Restart dst vm, src vm already show up so we needn't wait anymore */ 3481 if (test_migrate_start(&from, &to, args.listen_uri, &args.start)) { 3482 return; 3483 } 3484 3485 /* Start migrate */ 3486 migrate_qmp(from, uri, "{}"); 3487 3488 /* Wait for dirty limit throttle begin */ 3489 throttle_us_per_full = 0; 3490 while (throttle_us_per_full == 0) { 3491 throttle_us_per_full = 3492 read_migrate_property_int(from, "dirty-limit-throttle-time-per-round"); 3493 usleep(100); 3494 g_assert_false(src_state.stop_seen); 3495 } 3496 3497 /* 3498 * The dirty limit rate should equals the return value of 3499 * query-vcpu-dirty-limit if dirty limit cap set 3500 */ 3501 g_assert_cmpint(dirtylimit_value, ==, get_limit_rate(from)); 3502 3503 /* Now, we have tested if dirty limit works, let it converge */ 3504 migrate_set_parameter_int(from, "downtime-limit", downtime_limit); 3505 migrate_set_parameter_int(from, "max-bandwidth", max_bandwidth); 3506 3507 /* 3508 * Wait for pre-switchover status to check if migration 3509 * satisfy the convergence condition 3510 */ 3511 wait_for_migration_status(from, "pre-switchover", NULL); 3512 3513 remaining = read_ram_property_int(from, "remaining"); 3514 g_assert_cmpint(remaining, <, 3515 (expected_threshold + expected_threshold / 100)); 3516 3517 migrate_continue(from, "pre-switchover"); 3518 3519 qtest_qmp_eventwait(to, "RESUME"); 3520 3521 wait_for_serial("dest_serial"); 3522 wait_for_migration_complete(from); 3523 3524 test_migrate_end(from, to, true); 3525 } 3526 3527 static bool kvm_dirty_ring_supported(void) 3528 { 3529 #if defined(__linux__) && defined(HOST_X86_64) 3530 int ret, kvm_fd = open("/dev/kvm", O_RDONLY); 3531 3532 if (kvm_fd < 0) { 3533 return false; 3534 } 3535 3536 ret = ioctl(kvm_fd, KVM_CHECK_EXTENSION, KVM_CAP_DIRTY_LOG_RING); 3537 close(kvm_fd); 3538 3539 /* We test with 4096 slots */ 3540 if (ret < 4096) { 3541 return false; 3542 } 3543 3544 return true; 3545 #else 3546 return false; 3547 #endif 3548 } 3549 3550 int main(int argc, char **argv) 3551 { 3552 bool has_kvm, has_tcg; 3553 bool has_uffd, is_x86; 3554 const char *arch; 3555 g_autoptr(GError) err = NULL; 3556 const char *qemu_src = getenv(QEMU_ENV_SRC); 3557 const char *qemu_dst = getenv(QEMU_ENV_DST); 3558 int ret; 3559 3560 g_test_init(&argc, &argv, NULL); 3561 3562 /* 3563 * The default QTEST_QEMU_BINARY must always be provided because 3564 * that is what helpers use to query the accel type and 3565 * architecture. 3566 */ 3567 if (qemu_src && qemu_dst) { 3568 g_test_message("Only one of %s, %s is allowed", 3569 QEMU_ENV_SRC, QEMU_ENV_DST); 3570 exit(1); 3571 } 3572 3573 has_kvm = qtest_has_accel("kvm"); 3574 has_tcg = qtest_has_accel("tcg"); 3575 3576 if (!has_tcg && !has_kvm) { 3577 g_test_skip("No KVM or TCG accelerator available"); 3578 return 0; 3579 } 3580 3581 has_uffd = ufd_version_check(); 3582 arch = qtest_get_arch(); 3583 is_x86 = !strcmp(arch, "i386") || !strcmp(arch, "x86_64"); 3584 3585 /* 3586 * On ppc64, the test only works with kvm-hv, but not with kvm-pr and TCG 3587 * is touchy due to race conditions on dirty bits (especially on PPC for 3588 * some reason) 3589 */ 3590 if (g_str_equal(arch, "ppc64") && 3591 (!has_kvm || access("/sys/module/kvm_hv", F_OK))) { 3592 g_test_message("Skipping test: kvm_hv not available"); 3593 return g_test_run(); 3594 } 3595 3596 /* 3597 * Similar to ppc64, s390x seems to be touchy with TCG, so disable it 3598 * there until the problems are resolved 3599 */ 3600 if (g_str_equal(arch, "s390x") && !has_kvm) { 3601 g_test_message("Skipping test: s390x host with KVM is required"); 3602 return g_test_run(); 3603 } 3604 3605 tmpfs = g_dir_make_tmp("migration-test-XXXXXX", &err); 3606 if (!tmpfs) { 3607 g_test_message("Can't create temporary directory in %s: %s", 3608 g_get_tmp_dir(), err->message); 3609 } 3610 g_assert(tmpfs); 3611 3612 module_call_init(MODULE_INIT_QOM); 3613 3614 if (is_x86) { 3615 migration_test_add("/migration/precopy/unix/suspend/live", 3616 test_precopy_unix_suspend_live); 3617 migration_test_add("/migration/precopy/unix/suspend/notlive", 3618 test_precopy_unix_suspend_notlive); 3619 } 3620 3621 if (has_uffd) { 3622 migration_test_add("/migration/postcopy/plain", test_postcopy); 3623 migration_test_add("/migration/postcopy/recovery/plain", 3624 test_postcopy_recovery); 3625 migration_test_add("/migration/postcopy/preempt/plain", 3626 test_postcopy_preempt); 3627 migration_test_add("/migration/postcopy/preempt/recovery/plain", 3628 test_postcopy_preempt_recovery); 3629 if (getenv("QEMU_TEST_FLAKY_TESTS")) { 3630 migration_test_add("/migration/postcopy/compress/plain", 3631 test_postcopy_compress); 3632 migration_test_add("/migration/postcopy/recovery/compress/plain", 3633 test_postcopy_recovery_compress); 3634 } 3635 #ifndef _WIN32 3636 migration_test_add("/migration/postcopy/recovery/double-failures", 3637 test_postcopy_recovery_double_fail); 3638 #endif /* _WIN32 */ 3639 if (is_x86) { 3640 migration_test_add("/migration/postcopy/suspend", 3641 test_postcopy_suspend); 3642 } 3643 } 3644 3645 migration_test_add("/migration/bad_dest", test_baddest); 3646 #ifndef _WIN32 3647 if (!g_str_equal(arch, "s390x")) { 3648 migration_test_add("/migration/analyze-script", test_analyze_script); 3649 } 3650 #endif 3651 migration_test_add("/migration/precopy/unix/plain", 3652 test_precopy_unix_plain); 3653 migration_test_add("/migration/precopy/unix/xbzrle", 3654 test_precopy_unix_xbzrle); 3655 /* 3656 * Compression fails from time to time. 3657 * Put test here but don't enable it until everything is fixed. 3658 */ 3659 if (getenv("QEMU_TEST_FLAKY_TESTS")) { 3660 migration_test_add("/migration/precopy/unix/compress/wait", 3661 test_precopy_unix_compress); 3662 migration_test_add("/migration/precopy/unix/compress/nowait", 3663 test_precopy_unix_compress_nowait); 3664 } 3665 3666 migration_test_add("/migration/precopy/file", 3667 test_precopy_file); 3668 migration_test_add("/migration/precopy/file/offset", 3669 test_precopy_file_offset); 3670 migration_test_add("/migration/precopy/file/offset/bad", 3671 test_precopy_file_offset_bad); 3672 3673 /* 3674 * Our CI system has problems with shared memory. 3675 * Don't run this test until we find a workaround. 3676 */ 3677 if (getenv("QEMU_TEST_FLAKY_TESTS")) { 3678 migration_test_add("/migration/mode/reboot", test_mode_reboot); 3679 } 3680 3681 migration_test_add("/migration/precopy/file/mapped-ram", 3682 test_precopy_file_mapped_ram); 3683 migration_test_add("/migration/precopy/file/mapped-ram/live", 3684 test_precopy_file_mapped_ram_live); 3685 3686 migration_test_add("/migration/multifd/file/mapped-ram", 3687 test_multifd_file_mapped_ram); 3688 migration_test_add("/migration/multifd/file/mapped-ram/live", 3689 test_multifd_file_mapped_ram_live); 3690 #ifndef _WIN32 3691 migration_test_add("/migration/multifd/fd/mapped-ram", 3692 test_multifd_fd_mapped_ram); 3693 #endif 3694 3695 #ifdef CONFIG_GNUTLS 3696 migration_test_add("/migration/precopy/unix/tls/psk", 3697 test_precopy_unix_tls_psk); 3698 3699 if (has_uffd) { 3700 /* 3701 * NOTE: psk test is enough for postcopy, as other types of TLS 3702 * channels are tested under precopy. Here what we want to test is the 3703 * general postcopy path that has TLS channel enabled. 3704 */ 3705 migration_test_add("/migration/postcopy/tls/psk", 3706 test_postcopy_tls_psk); 3707 migration_test_add("/migration/postcopy/recovery/tls/psk", 3708 test_postcopy_recovery_tls_psk); 3709 migration_test_add("/migration/postcopy/preempt/tls/psk", 3710 test_postcopy_preempt_tls_psk); 3711 migration_test_add("/migration/postcopy/preempt/recovery/tls/psk", 3712 test_postcopy_preempt_all); 3713 } 3714 #ifdef CONFIG_TASN1 3715 migration_test_add("/migration/precopy/unix/tls/x509/default-host", 3716 test_precopy_unix_tls_x509_default_host); 3717 migration_test_add("/migration/precopy/unix/tls/x509/override-host", 3718 test_precopy_unix_tls_x509_override_host); 3719 #endif /* CONFIG_TASN1 */ 3720 #endif /* CONFIG_GNUTLS */ 3721 3722 migration_test_add("/migration/precopy/tcp/plain", test_precopy_tcp_plain); 3723 3724 migration_test_add("/migration/precopy/tcp/plain/switchover-ack", 3725 test_precopy_tcp_switchover_ack); 3726 3727 #ifdef CONFIG_GNUTLS 3728 migration_test_add("/migration/precopy/tcp/tls/psk/match", 3729 test_precopy_tcp_tls_psk_match); 3730 migration_test_add("/migration/precopy/tcp/tls/psk/mismatch", 3731 test_precopy_tcp_tls_psk_mismatch); 3732 #ifdef CONFIG_TASN1 3733 migration_test_add("/migration/precopy/tcp/tls/x509/default-host", 3734 test_precopy_tcp_tls_x509_default_host); 3735 migration_test_add("/migration/precopy/tcp/tls/x509/override-host", 3736 test_precopy_tcp_tls_x509_override_host); 3737 migration_test_add("/migration/precopy/tcp/tls/x509/mismatch-host", 3738 test_precopy_tcp_tls_x509_mismatch_host); 3739 migration_test_add("/migration/precopy/tcp/tls/x509/friendly-client", 3740 test_precopy_tcp_tls_x509_friendly_client); 3741 migration_test_add("/migration/precopy/tcp/tls/x509/hostile-client", 3742 test_precopy_tcp_tls_x509_hostile_client); 3743 migration_test_add("/migration/precopy/tcp/tls/x509/allow-anon-client", 3744 test_precopy_tcp_tls_x509_allow_anon_client); 3745 migration_test_add("/migration/precopy/tcp/tls/x509/reject-anon-client", 3746 test_precopy_tcp_tls_x509_reject_anon_client); 3747 #endif /* CONFIG_TASN1 */ 3748 #endif /* CONFIG_GNUTLS */ 3749 3750 /* migration_test_add("/migration/ignore_shared", test_ignore_shared); */ 3751 #ifndef _WIN32 3752 migration_test_add("/migration/precopy/fd/tcp", 3753 test_migrate_precopy_fd_socket); 3754 migration_test_add("/migration/precopy/fd/file", 3755 test_migrate_precopy_fd_file); 3756 migration_test_add("/migration/precopy/fd/file/mapped-ram", 3757 test_migrate_precopy_fd_file_mapped_ram); 3758 #endif 3759 migration_test_add("/migration/validate_uuid", test_validate_uuid); 3760 migration_test_add("/migration/validate_uuid_error", 3761 test_validate_uuid_error); 3762 migration_test_add("/migration/validate_uuid_src_not_set", 3763 test_validate_uuid_src_not_set); 3764 migration_test_add("/migration/validate_uuid_dst_not_set", 3765 test_validate_uuid_dst_not_set); 3766 /* 3767 * See explanation why this test is slow on function definition 3768 */ 3769 if (g_test_slow()) { 3770 migration_test_add("/migration/auto_converge", 3771 test_migrate_auto_converge); 3772 if (g_str_equal(arch, "x86_64") && 3773 has_kvm && kvm_dirty_ring_supported()) { 3774 migration_test_add("/migration/dirty_limit", 3775 test_migrate_dirty_limit); 3776 } 3777 } 3778 migration_test_add("/migration/multifd/tcp/plain/none", 3779 test_multifd_tcp_none); 3780 migration_test_add("/migration/multifd/tcp/plain/zero-page/legacy", 3781 test_multifd_tcp_zero_page_legacy); 3782 migration_test_add("/migration/multifd/tcp/plain/zero-page/none", 3783 test_multifd_tcp_no_zero_page); 3784 migration_test_add("/migration/multifd/tcp/plain/cancel", 3785 test_multifd_tcp_cancel); 3786 migration_test_add("/migration/multifd/tcp/plain/zlib", 3787 test_multifd_tcp_zlib); 3788 #ifdef CONFIG_ZSTD 3789 migration_test_add("/migration/multifd/tcp/plain/zstd", 3790 test_multifd_tcp_zstd); 3791 #endif 3792 #ifdef CONFIG_GNUTLS 3793 migration_test_add("/migration/multifd/tcp/tls/psk/match", 3794 test_multifd_tcp_tls_psk_match); 3795 migration_test_add("/migration/multifd/tcp/tls/psk/mismatch", 3796 test_multifd_tcp_tls_psk_mismatch); 3797 #ifdef CONFIG_TASN1 3798 migration_test_add("/migration/multifd/tcp/tls/x509/default-host", 3799 test_multifd_tcp_tls_x509_default_host); 3800 migration_test_add("/migration/multifd/tcp/tls/x509/override-host", 3801 test_multifd_tcp_tls_x509_override_host); 3802 migration_test_add("/migration/multifd/tcp/tls/x509/mismatch-host", 3803 test_multifd_tcp_tls_x509_mismatch_host); 3804 migration_test_add("/migration/multifd/tcp/tls/x509/allow-anon-client", 3805 test_multifd_tcp_tls_x509_allow_anon_client); 3806 migration_test_add("/migration/multifd/tcp/tls/x509/reject-anon-client", 3807 test_multifd_tcp_tls_x509_reject_anon_client); 3808 #endif /* CONFIG_TASN1 */ 3809 #endif /* CONFIG_GNUTLS */ 3810 3811 if (g_str_equal(arch, "x86_64") && has_kvm && kvm_dirty_ring_supported()) { 3812 migration_test_add("/migration/dirty_ring", 3813 test_precopy_unix_dirty_ring); 3814 migration_test_add("/migration/vcpu_dirty_limit", 3815 test_vcpu_dirty_limit); 3816 } 3817 3818 ret = g_test_run(); 3819 3820 g_assert_cmpint(ret, ==, 0); 3821 3822 bootfile_delete(); 3823 ret = rmdir(tmpfs); 3824 if (ret != 0) { 3825 g_test_message("unable to rmdir: path (%s): %s", 3826 tmpfs, strerror(errno)); 3827 } 3828 g_free(tmpfs); 3829 3830 return ret; 3831 } 3832