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 bool got_src_stop; 47 static bool got_dst_resume; 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 #if defined(__linux__) 70 #include <sys/syscall.h> 71 #include <sys/vfs.h> 72 #endif 73 74 #if defined(__linux__) && defined(__NR_userfaultfd) && defined(CONFIG_EVENTFD) 75 #include <sys/eventfd.h> 76 #include <sys/ioctl.h> 77 #include "qemu/userfaultfd.h" 78 79 static bool ufd_version_check(void) 80 { 81 struct uffdio_api api_struct; 82 uint64_t ioctl_mask; 83 84 int ufd = uffd_open(O_CLOEXEC); 85 86 if (ufd == -1) { 87 g_test_message("Skipping test: userfaultfd not available"); 88 return false; 89 } 90 91 api_struct.api = UFFD_API; 92 api_struct.features = 0; 93 if (ioctl(ufd, UFFDIO_API, &api_struct)) { 94 g_test_message("Skipping test: UFFDIO_API failed"); 95 return false; 96 } 97 uffd_feature_thread_id = api_struct.features & UFFD_FEATURE_THREAD_ID; 98 99 ioctl_mask = (__u64)1 << _UFFDIO_REGISTER | 100 (__u64)1 << _UFFDIO_UNREGISTER; 101 if ((api_struct.ioctls & ioctl_mask) != ioctl_mask) { 102 g_test_message("Skipping test: Missing userfault feature"); 103 return false; 104 } 105 106 return true; 107 } 108 109 #else 110 static bool ufd_version_check(void) 111 { 112 g_test_message("Skipping test: Userfault not available (builtdtime)"); 113 return false; 114 } 115 116 #endif 117 118 static char *tmpfs; 119 120 /* The boot file modifies memory area in [start_address, end_address) 121 * repeatedly. It outputs a 'B' at a fixed rate while it's still running. 122 */ 123 #include "tests/migration/i386/a-b-bootblock.h" 124 #include "tests/migration/aarch64/a-b-kernel.h" 125 #include "tests/migration/s390x/a-b-bios.h" 126 127 static void init_bootfile(const char *bootpath, void *content, size_t len) 128 { 129 FILE *bootfile = fopen(bootpath, "wb"); 130 131 g_assert_cmpint(fwrite(content, len, 1, bootfile), ==, 1); 132 fclose(bootfile); 133 } 134 135 /* 136 * Wait for some output in the serial output file, 137 * we get an 'A' followed by an endless string of 'B's 138 * but on the destination we won't have the A. 139 */ 140 static void wait_for_serial(const char *side) 141 { 142 g_autofree char *serialpath = g_strdup_printf("%s/%s", tmpfs, side); 143 FILE *serialfile = fopen(serialpath, "r"); 144 const char *arch = qtest_get_arch(); 145 int started = (strcmp(side, "src_serial") == 0 && 146 strcmp(arch, "ppc64") == 0) ? 0 : 1; 147 148 do { 149 int readvalue = fgetc(serialfile); 150 151 if (!started) { 152 /* SLOF prints its banner before starting test, 153 * to ignore it, mark the start of the test with '_', 154 * ignore all characters until this marker 155 */ 156 switch (readvalue) { 157 case '_': 158 started = 1; 159 break; 160 case EOF: 161 fseek(serialfile, 0, SEEK_SET); 162 usleep(1000); 163 break; 164 } 165 continue; 166 } 167 switch (readvalue) { 168 case 'A': 169 /* Fine */ 170 break; 171 172 case 'B': 173 /* It's alive! */ 174 fclose(serialfile); 175 return; 176 177 case EOF: 178 started = (strcmp(side, "src_serial") == 0 && 179 strcmp(arch, "ppc64") == 0) ? 0 : 1; 180 fseek(serialfile, 0, SEEK_SET); 181 usleep(1000); 182 break; 183 184 default: 185 fprintf(stderr, "Unexpected %d on %s serial\n", readvalue, side); 186 g_assert_not_reached(); 187 } 188 } while (true); 189 } 190 191 /* 192 * It's tricky to use qemu's migration event capability with qtest, 193 * events suddenly appearing confuse the qmp()/hmp() responses. 194 */ 195 196 static int64_t read_ram_property_int(QTestState *who, const char *property) 197 { 198 QDict *rsp_return, *rsp_ram; 199 int64_t result; 200 201 rsp_return = migrate_query_not_failed(who); 202 if (!qdict_haskey(rsp_return, "ram")) { 203 /* Still in setup */ 204 result = 0; 205 } else { 206 rsp_ram = qdict_get_qdict(rsp_return, "ram"); 207 result = qdict_get_try_int(rsp_ram, property, 0); 208 } 209 qobject_unref(rsp_return); 210 return result; 211 } 212 213 static int64_t read_migrate_property_int(QTestState *who, const char *property) 214 { 215 QDict *rsp_return; 216 int64_t result; 217 218 rsp_return = migrate_query_not_failed(who); 219 result = qdict_get_try_int(rsp_return, property, 0); 220 qobject_unref(rsp_return); 221 return result; 222 } 223 224 static uint64_t get_migration_pass(QTestState *who) 225 { 226 return read_ram_property_int(who, "dirty-sync-count"); 227 } 228 229 static void read_blocktime(QTestState *who) 230 { 231 QDict *rsp_return; 232 233 rsp_return = migrate_query_not_failed(who); 234 g_assert(qdict_haskey(rsp_return, "postcopy-blocktime")); 235 qobject_unref(rsp_return); 236 } 237 238 static void wait_for_migration_pass(QTestState *who) 239 { 240 uint64_t initial_pass = get_migration_pass(who); 241 uint64_t pass; 242 243 /* Wait for the 1st sync */ 244 while (!got_src_stop && !initial_pass) { 245 usleep(1000); 246 initial_pass = get_migration_pass(who); 247 } 248 249 do { 250 usleep(1000); 251 pass = get_migration_pass(who); 252 } while (pass == initial_pass && !got_src_stop); 253 } 254 255 static void check_guests_ram(QTestState *who) 256 { 257 /* Our ASM test will have been incrementing one byte from each page from 258 * start_address to < end_address in order. This gives us a constraint 259 * that any page's byte should be equal or less than the previous pages 260 * byte (mod 256); and they should all be equal except for one transition 261 * at the point where we meet the incrementer. (We're running this with 262 * the guest stopped). 263 */ 264 unsigned address; 265 uint8_t first_byte; 266 uint8_t last_byte; 267 bool hit_edge = false; 268 int bad = 0; 269 270 qtest_memread(who, start_address, &first_byte, 1); 271 last_byte = first_byte; 272 273 for (address = start_address + TEST_MEM_PAGE_SIZE; address < end_address; 274 address += TEST_MEM_PAGE_SIZE) 275 { 276 uint8_t b; 277 qtest_memread(who, address, &b, 1); 278 if (b != last_byte) { 279 if (((b + 1) % 256) == last_byte && !hit_edge) { 280 /* This is OK, the guest stopped at the point of 281 * incrementing the previous page but didn't get 282 * to us yet. 283 */ 284 hit_edge = true; 285 last_byte = b; 286 } else { 287 bad++; 288 if (bad <= 10) { 289 fprintf(stderr, "Memory content inconsistency at %x" 290 " first_byte = %x last_byte = %x current = %x" 291 " hit_edge = %x\n", 292 address, first_byte, last_byte, b, hit_edge); 293 } 294 } 295 } 296 } 297 if (bad >= 10) { 298 fprintf(stderr, "and in another %d pages", bad - 10); 299 } 300 g_assert(bad == 0); 301 } 302 303 static void cleanup(const char *filename) 304 { 305 g_autofree char *path = g_strdup_printf("%s/%s", tmpfs, filename); 306 307 unlink(path); 308 } 309 310 static char *SocketAddress_to_str(SocketAddress *addr) 311 { 312 switch (addr->type) { 313 case SOCKET_ADDRESS_TYPE_INET: 314 return g_strdup_printf("tcp:%s:%s", 315 addr->u.inet.host, 316 addr->u.inet.port); 317 case SOCKET_ADDRESS_TYPE_UNIX: 318 return g_strdup_printf("unix:%s", 319 addr->u.q_unix.path); 320 case SOCKET_ADDRESS_TYPE_FD: 321 return g_strdup_printf("fd:%s", addr->u.fd.str); 322 case SOCKET_ADDRESS_TYPE_VSOCK: 323 return g_strdup_printf("tcp:%s:%s", 324 addr->u.vsock.cid, 325 addr->u.vsock.port); 326 default: 327 return g_strdup("unknown address type"); 328 } 329 } 330 331 static char *migrate_get_socket_address(QTestState *who, const char *parameter) 332 { 333 QDict *rsp; 334 char *result; 335 SocketAddressList *addrs; 336 Visitor *iv = NULL; 337 QObject *object; 338 339 rsp = migrate_query(who); 340 object = qdict_get(rsp, parameter); 341 342 iv = qobject_input_visitor_new(object); 343 visit_type_SocketAddressList(iv, NULL, &addrs, &error_abort); 344 visit_free(iv); 345 346 /* we are only using a single address */ 347 result = SocketAddress_to_str(addrs->value); 348 349 qapi_free_SocketAddressList(addrs); 350 qobject_unref(rsp); 351 return result; 352 } 353 354 static long long migrate_get_parameter_int(QTestState *who, 355 const char *parameter) 356 { 357 QDict *rsp; 358 long long result; 359 360 rsp = qtest_qmp_assert_success_ref( 361 who, "{ 'execute': 'query-migrate-parameters' }"); 362 result = qdict_get_int(rsp, parameter); 363 qobject_unref(rsp); 364 return result; 365 } 366 367 static void migrate_check_parameter_int(QTestState *who, const char *parameter, 368 long long value) 369 { 370 long long result; 371 372 result = migrate_get_parameter_int(who, parameter); 373 g_assert_cmpint(result, ==, value); 374 } 375 376 static void migrate_set_parameter_int(QTestState *who, const char *parameter, 377 long long value) 378 { 379 qtest_qmp_assert_success(who, 380 "{ 'execute': 'migrate-set-parameters'," 381 "'arguments': { %s: %lld } }", 382 parameter, value); 383 migrate_check_parameter_int(who, parameter, value); 384 } 385 386 static char *migrate_get_parameter_str(QTestState *who, 387 const char *parameter) 388 { 389 QDict *rsp; 390 char *result; 391 392 rsp = qtest_qmp_assert_success_ref( 393 who, "{ 'execute': 'query-migrate-parameters' }"); 394 result = g_strdup(qdict_get_str(rsp, parameter)); 395 qobject_unref(rsp); 396 return result; 397 } 398 399 static void migrate_check_parameter_str(QTestState *who, const char *parameter, 400 const char *value) 401 { 402 g_autofree char *result = migrate_get_parameter_str(who, parameter); 403 g_assert_cmpstr(result, ==, value); 404 } 405 406 static void migrate_set_parameter_str(QTestState *who, const char *parameter, 407 const char *value) 408 { 409 qtest_qmp_assert_success(who, 410 "{ 'execute': 'migrate-set-parameters'," 411 "'arguments': { %s: %s } }", 412 parameter, value); 413 migrate_check_parameter_str(who, parameter, value); 414 } 415 416 static long long migrate_get_parameter_bool(QTestState *who, 417 const char *parameter) 418 { 419 QDict *rsp; 420 int result; 421 422 rsp = qtest_qmp_assert_success_ref( 423 who, "{ 'execute': 'query-migrate-parameters' }"); 424 result = qdict_get_bool(rsp, parameter); 425 qobject_unref(rsp); 426 return !!result; 427 } 428 429 static void migrate_check_parameter_bool(QTestState *who, const char *parameter, 430 int value) 431 { 432 int result; 433 434 result = migrate_get_parameter_bool(who, parameter); 435 g_assert_cmpint(result, ==, value); 436 } 437 438 static void migrate_set_parameter_bool(QTestState *who, const char *parameter, 439 int value) 440 { 441 qtest_qmp_assert_success(who, 442 "{ 'execute': 'migrate-set-parameters'," 443 "'arguments': { %s: %i } }", 444 parameter, value); 445 migrate_check_parameter_bool(who, parameter, value); 446 } 447 448 static void migrate_ensure_non_converge(QTestState *who) 449 { 450 /* Can't converge with 1ms downtime + 3 mbs bandwidth limit */ 451 migrate_set_parameter_int(who, "max-bandwidth", 3 * 1000 * 1000); 452 migrate_set_parameter_int(who, "downtime-limit", 1); 453 } 454 455 static void migrate_ensure_converge(QTestState *who) 456 { 457 /* Should converge with 30s downtime + 1 gbs bandwidth limit */ 458 migrate_set_parameter_int(who, "max-bandwidth", 1 * 1000 * 1000 * 1000); 459 migrate_set_parameter_int(who, "downtime-limit", 30 * 1000); 460 } 461 462 /* 463 * Our goal is to ensure that we run a single full migration 464 * iteration, and also dirty memory, ensuring that at least 465 * one further iteration is required. 466 * 467 * We can't directly synchronize with the start of a migration 468 * so we have to apply some tricks monitoring memory that is 469 * transferred. 470 * 471 * Initially we set the migration bandwidth to an insanely 472 * low value, with tiny max downtime too. This basically 473 * guarantees migration will never complete. 474 * 475 * This will result in a test that is unacceptably slow though, 476 * so we can't let the entire migration pass run at this speed. 477 * Our intent is to let it run just long enough that we can 478 * prove data prior to the marker has been transferred *AND* 479 * also prove this transferred data is dirty again. 480 * 481 * Before migration starts, we write a 64-bit magic marker 482 * into a fixed location in the src VM RAM. 483 * 484 * Then watch dst memory until the marker appears. This is 485 * proof that start_address -> MAGIC_OFFSET_BASE has been 486 * transferred. 487 * 488 * Finally we go back to the source and read a byte just 489 * before the marker untill we see it flip in value. This 490 * is proof that start_address -> MAGIC_OFFSET_BASE 491 * is now dirty again. 492 * 493 * IOW, we're guaranteed at least a 2nd migration pass 494 * at this point. 495 * 496 * We can now let migration run at full speed to finish 497 * the test 498 */ 499 static void migrate_prepare_for_dirty_mem(QTestState *from) 500 { 501 /* 502 * The guest workflow iterates from start_address to 503 * end_address, writing 1 byte every TEST_MEM_PAGE_SIZE 504 * bytes. 505 * 506 * IOW, if we write to mem at a point which is NOT 507 * a multiple of TEST_MEM_PAGE_SIZE, our write won't 508 * conflict with the migration workflow. 509 * 510 * We put in a marker here, that we'll use to determine 511 * when the data has been transferred to the dst. 512 */ 513 qtest_writeq(from, start_address + MAGIC_OFFSET, MAGIC_MARKER); 514 } 515 516 static void migrate_wait_for_dirty_mem(QTestState *from, 517 QTestState *to) 518 { 519 uint64_t watch_address = start_address + MAGIC_OFFSET_BASE; 520 uint64_t marker_address = start_address + MAGIC_OFFSET; 521 uint8_t watch_byte; 522 523 /* 524 * Wait for the MAGIC_MARKER to get transferred, as an 525 * indicator that a migration pass has made some known 526 * amount of progress. 527 */ 528 do { 529 usleep(1000 * 10); 530 } while (qtest_readq(to, marker_address) != MAGIC_MARKER); 531 532 /* 533 * Now ensure that already transferred bytes are 534 * dirty again from the guest workload. Note the 535 * guest byte value will wrap around and by chance 536 * match the original watch_byte. This is harmless 537 * as we'll eventually see a different value if we 538 * keep watching 539 */ 540 watch_byte = qtest_readb(from, watch_address); 541 do { 542 usleep(1000 * 10); 543 } while (qtest_readb(from, watch_address) == watch_byte); 544 } 545 546 547 static void migrate_pause(QTestState *who) 548 { 549 qtest_qmp_assert_success(who, "{ 'execute': 'migrate-pause' }"); 550 } 551 552 static void migrate_continue(QTestState *who, const char *state) 553 { 554 qtest_qmp_assert_success(who, 555 "{ 'execute': 'migrate-continue'," 556 " 'arguments': { 'state': %s } }", 557 state); 558 } 559 560 static void migrate_recover(QTestState *who, const char *uri) 561 { 562 qtest_qmp_assert_success(who, 563 "{ 'execute': 'migrate-recover', " 564 " 'id': 'recover-cmd', " 565 " 'arguments': { 'uri': %s } }", 566 uri); 567 } 568 569 static void migrate_cancel(QTestState *who) 570 { 571 qtest_qmp_assert_success(who, "{ 'execute': 'migrate_cancel' }"); 572 } 573 574 static void migrate_set_capability(QTestState *who, const char *capability, 575 bool value) 576 { 577 qtest_qmp_assert_success(who, 578 "{ 'execute': 'migrate-set-capabilities'," 579 "'arguments': { " 580 "'capabilities': [ { " 581 "'capability': %s, 'state': %i } ] } }", 582 capability, value); 583 } 584 585 static void migrate_postcopy_start(QTestState *from, QTestState *to) 586 { 587 qtest_qmp_assert_success(from, "{ 'execute': 'migrate-start-postcopy' }"); 588 589 if (!got_src_stop) { 590 qtest_qmp_eventwait(from, "STOP"); 591 } 592 593 qtest_qmp_eventwait(to, "RESUME"); 594 } 595 596 typedef struct { 597 /* 598 * QTEST_LOG=1 may override this. When QTEST_LOG=1, we always dump errors 599 * unconditionally, because it means the user would like to be verbose. 600 */ 601 bool hide_stderr; 602 bool use_shmem; 603 /* only launch the target process */ 604 bool only_target; 605 /* Use dirty ring if true; dirty logging otherwise */ 606 bool use_dirty_ring; 607 const char *opts_source; 608 const char *opts_target; 609 } MigrateStart; 610 611 /* 612 * A hook that runs after the src and dst QEMUs have been 613 * created, but before the migration is started. This can 614 * be used to set migration parameters and capabilities. 615 * 616 * Returns: NULL, or a pointer to opaque state to be 617 * later passed to the TestMigrateFinishHook 618 */ 619 typedef void * (*TestMigrateStartHook)(QTestState *from, 620 QTestState *to); 621 622 /* 623 * A hook that runs after the migration has finished, 624 * regardless of whether it succeeded or failed, but 625 * before QEMU has terminated (unless it self-terminated 626 * due to migration error) 627 * 628 * @opaque is a pointer to state previously returned 629 * by the TestMigrateStartHook if any, or NULL. 630 */ 631 typedef void (*TestMigrateFinishHook)(QTestState *from, 632 QTestState *to, 633 void *opaque); 634 635 typedef struct { 636 /* Optional: fine tune start parameters */ 637 MigrateStart start; 638 639 /* Required: the URI for the dst QEMU to listen on */ 640 const char *listen_uri; 641 642 /* 643 * Optional: the URI for the src QEMU to connect to 644 * If NULL, then it will query the dst QEMU for its actual 645 * listening address and use that as the connect address. 646 * This allows for dynamically picking a free TCP port. 647 */ 648 const char *connect_uri; 649 650 /* Optional: callback to run at start to set migration parameters */ 651 TestMigrateStartHook start_hook; 652 /* Optional: callback to run at finish to cleanup */ 653 TestMigrateFinishHook finish_hook; 654 655 /* 656 * Optional: normally we expect the migration process to complete. 657 * 658 * There can be a variety of reasons and stages in which failure 659 * can happen during tests. 660 * 661 * If a failure is expected to happen at time of establishing 662 * the connection, then MIG_TEST_FAIL will indicate that the dst 663 * QEMU is expected to stay running and accept future migration 664 * connections. 665 * 666 * If a failure is expected to happen while processing the 667 * migration stream, then MIG_TEST_FAIL_DEST_QUIT_ERR will indicate 668 * that the dst QEMU is expected to quit with non-zero exit status 669 */ 670 enum { 671 /* This test should succeed, the default */ 672 MIG_TEST_SUCCEED = 0, 673 /* This test should fail, dest qemu should keep alive */ 674 MIG_TEST_FAIL, 675 /* This test should fail, dest qemu should fail with abnormal status */ 676 MIG_TEST_FAIL_DEST_QUIT_ERR, 677 } result; 678 679 /* 680 * Optional: set number of migration passes to wait for, if live==true. 681 * If zero, then merely wait for a few MB of dirty data 682 */ 683 unsigned int iterations; 684 685 /* 686 * Optional: whether the guest CPUs should be running during a precopy 687 * migration test. We used to always run with live but it took much 688 * longer so we reduced live tests to only the ones that have solid 689 * reason to be tested live-only. For each of the new test cases for 690 * precopy please provide justifications to use live explicitly (please 691 * refer to existing ones with live=true), or use live=off by default. 692 */ 693 bool live; 694 695 /* Postcopy specific fields */ 696 void *postcopy_data; 697 bool postcopy_preempt; 698 } MigrateCommon; 699 700 static int test_migrate_start(QTestState **from, QTestState **to, 701 const char *uri, MigrateStart *args) 702 { 703 g_autofree gchar *arch_source = NULL; 704 g_autofree gchar *arch_target = NULL; 705 g_autofree gchar *cmd_source = NULL; 706 g_autofree gchar *cmd_target = NULL; 707 const gchar *ignore_stderr; 708 g_autofree char *bootpath = NULL; 709 g_autofree char *shmem_opts = NULL; 710 g_autofree char *shmem_path = NULL; 711 const char *arch = qtest_get_arch(); 712 const char *machine_opts = NULL; 713 const char *memory_size; 714 715 if (args->use_shmem) { 716 if (!g_file_test("/dev/shm", G_FILE_TEST_IS_DIR)) { 717 g_test_skip("/dev/shm is not supported"); 718 return -1; 719 } 720 } 721 722 got_src_stop = false; 723 got_dst_resume = false; 724 bootpath = g_strdup_printf("%s/bootsect", tmpfs); 725 if (strcmp(arch, "i386") == 0 || strcmp(arch, "x86_64") == 0) { 726 /* the assembled x86 boot sector should be exactly one sector large */ 727 assert(sizeof(x86_bootsect) == 512); 728 init_bootfile(bootpath, x86_bootsect, sizeof(x86_bootsect)); 729 memory_size = "150M"; 730 arch_source = g_strdup_printf("-drive file=%s,format=raw", bootpath); 731 arch_target = g_strdup(arch_source); 732 start_address = X86_TEST_MEM_START; 733 end_address = X86_TEST_MEM_END; 734 } else if (g_str_equal(arch, "s390x")) { 735 init_bootfile(bootpath, s390x_elf, sizeof(s390x_elf)); 736 memory_size = "128M"; 737 arch_source = g_strdup_printf("-bios %s", bootpath); 738 arch_target = g_strdup(arch_source); 739 start_address = S390_TEST_MEM_START; 740 end_address = S390_TEST_MEM_END; 741 } else if (strcmp(arch, "ppc64") == 0) { 742 machine_opts = "vsmt=8"; 743 memory_size = "256M"; 744 start_address = PPC_TEST_MEM_START; 745 end_address = PPC_TEST_MEM_END; 746 arch_source = g_strdup_printf("-nodefaults " 747 "-prom-env 'use-nvramrc?=true' -prom-env " 748 "'nvramrc=hex .\" _\" begin %x %x " 749 "do i c@ 1 + i c! 1000 +loop .\" B\" 0 " 750 "until'", end_address, start_address); 751 arch_target = g_strdup(""); 752 } else if (strcmp(arch, "aarch64") == 0) { 753 init_bootfile(bootpath, aarch64_kernel, sizeof(aarch64_kernel)); 754 machine_opts = "virt,gic-version=max"; 755 memory_size = "150M"; 756 arch_source = g_strdup_printf("-cpu max " 757 "-kernel %s", 758 bootpath); 759 arch_target = g_strdup(arch_source); 760 start_address = ARM_TEST_MEM_START; 761 end_address = ARM_TEST_MEM_END; 762 763 g_assert(sizeof(aarch64_kernel) <= ARM_TEST_MAX_KERNEL_SIZE); 764 } else { 765 g_assert_not_reached(); 766 } 767 768 if (!getenv("QTEST_LOG") && args->hide_stderr) { 769 #ifndef _WIN32 770 ignore_stderr = "2>/dev/null"; 771 #else 772 /* 773 * On Windows the QEMU executable is created via CreateProcess() and 774 * IO redirection does not work, so don't bother adding IO redirection 775 * to the command line. 776 */ 777 ignore_stderr = ""; 778 #endif 779 } else { 780 ignore_stderr = ""; 781 } 782 783 if (args->use_shmem) { 784 shmem_path = g_strdup_printf("/dev/shm/qemu-%d", getpid()); 785 shmem_opts = g_strdup_printf( 786 "-object memory-backend-file,id=mem0,size=%s" 787 ",mem-path=%s,share=on -numa node,memdev=mem0", 788 memory_size, shmem_path); 789 } else { 790 shmem_path = NULL; 791 shmem_opts = g_strdup(""); 792 } 793 794 cmd_source = g_strdup_printf("-accel kvm%s -accel tcg%s%s " 795 "-name source,debug-threads=on " 796 "-m %s " 797 "-serial file:%s/src_serial " 798 "%s %s %s %s", 799 args->use_dirty_ring ? 800 ",dirty-ring-size=4096" : "", 801 machine_opts ? " -machine " : "", 802 machine_opts ? machine_opts : "", 803 memory_size, tmpfs, 804 arch_source, shmem_opts, 805 args->opts_source ? args->opts_source : "", 806 ignore_stderr); 807 if (!args->only_target) { 808 *from = qtest_init(cmd_source); 809 qtest_qmp_set_event_callback(*from, 810 migrate_watch_for_stop, 811 &got_src_stop); 812 } 813 814 cmd_target = g_strdup_printf("-accel kvm%s -accel tcg%s%s " 815 "-name target,debug-threads=on " 816 "-m %s " 817 "-serial file:%s/dest_serial " 818 "-incoming %s " 819 "%s %s %s %s", 820 args->use_dirty_ring ? 821 ",dirty-ring-size=4096" : "", 822 machine_opts ? " -machine " : "", 823 machine_opts ? machine_opts : "", 824 memory_size, tmpfs, uri, 825 arch_target, shmem_opts, 826 args->opts_target ? args->opts_target : "", 827 ignore_stderr); 828 *to = qtest_init(cmd_target); 829 qtest_qmp_set_event_callback(*to, 830 migrate_watch_for_resume, 831 &got_dst_resume); 832 833 /* 834 * Remove shmem file immediately to avoid memory leak in test failed case. 835 * It's valid becase QEMU has already opened this file 836 */ 837 if (args->use_shmem) { 838 unlink(shmem_path); 839 } 840 841 return 0; 842 } 843 844 static void test_migrate_end(QTestState *from, QTestState *to, bool test_dest) 845 { 846 unsigned char dest_byte_a, dest_byte_b, dest_byte_c, dest_byte_d; 847 848 qtest_quit(from); 849 850 if (test_dest) { 851 qtest_memread(to, start_address, &dest_byte_a, 1); 852 853 /* Destination still running, wait for a byte to change */ 854 do { 855 qtest_memread(to, start_address, &dest_byte_b, 1); 856 usleep(1000 * 10); 857 } while (dest_byte_a == dest_byte_b); 858 859 qtest_qmp_assert_success(to, "{ 'execute' : 'stop'}"); 860 861 /* With it stopped, check nothing changes */ 862 qtest_memread(to, start_address, &dest_byte_c, 1); 863 usleep(1000 * 200); 864 qtest_memread(to, start_address, &dest_byte_d, 1); 865 g_assert_cmpint(dest_byte_c, ==, dest_byte_d); 866 867 check_guests_ram(to); 868 } 869 870 qtest_quit(to); 871 872 cleanup("bootsect"); 873 cleanup("migsocket"); 874 cleanup("src_serial"); 875 cleanup("dest_serial"); 876 } 877 878 #ifdef CONFIG_GNUTLS 879 struct TestMigrateTLSPSKData { 880 char *workdir; 881 char *workdiralt; 882 char *pskfile; 883 char *pskfilealt; 884 }; 885 886 static void * 887 test_migrate_tls_psk_start_common(QTestState *from, 888 QTestState *to, 889 bool mismatch) 890 { 891 struct TestMigrateTLSPSKData *data = 892 g_new0(struct TestMigrateTLSPSKData, 1); 893 894 data->workdir = g_strdup_printf("%s/tlscredspsk0", tmpfs); 895 data->pskfile = g_strdup_printf("%s/%s", data->workdir, 896 QCRYPTO_TLS_CREDS_PSKFILE); 897 g_mkdir_with_parents(data->workdir, 0700); 898 test_tls_psk_init(data->pskfile); 899 900 if (mismatch) { 901 data->workdiralt = g_strdup_printf("%s/tlscredspskalt0", tmpfs); 902 data->pskfilealt = g_strdup_printf("%s/%s", data->workdiralt, 903 QCRYPTO_TLS_CREDS_PSKFILE); 904 g_mkdir_with_parents(data->workdiralt, 0700); 905 test_tls_psk_init_alt(data->pskfilealt); 906 } 907 908 qtest_qmp_assert_success(from, 909 "{ 'execute': 'object-add'," 910 " 'arguments': { 'qom-type': 'tls-creds-psk'," 911 " 'id': 'tlscredspsk0'," 912 " 'endpoint': 'client'," 913 " 'dir': %s," 914 " 'username': 'qemu'} }", 915 data->workdir); 916 917 qtest_qmp_assert_success(to, 918 "{ 'execute': 'object-add'," 919 " 'arguments': { 'qom-type': 'tls-creds-psk'," 920 " 'id': 'tlscredspsk0'," 921 " 'endpoint': 'server'," 922 " 'dir': %s } }", 923 mismatch ? data->workdiralt : data->workdir); 924 925 migrate_set_parameter_str(from, "tls-creds", "tlscredspsk0"); 926 migrate_set_parameter_str(to, "tls-creds", "tlscredspsk0"); 927 928 return data; 929 } 930 931 static void * 932 test_migrate_tls_psk_start_match(QTestState *from, 933 QTestState *to) 934 { 935 return test_migrate_tls_psk_start_common(from, to, false); 936 } 937 938 static void * 939 test_migrate_tls_psk_start_mismatch(QTestState *from, 940 QTestState *to) 941 { 942 return test_migrate_tls_psk_start_common(from, to, true); 943 } 944 945 static void 946 test_migrate_tls_psk_finish(QTestState *from, 947 QTestState *to, 948 void *opaque) 949 { 950 struct TestMigrateTLSPSKData *data = opaque; 951 952 test_tls_psk_cleanup(data->pskfile); 953 if (data->pskfilealt) { 954 test_tls_psk_cleanup(data->pskfilealt); 955 } 956 rmdir(data->workdir); 957 if (data->workdiralt) { 958 rmdir(data->workdiralt); 959 } 960 961 g_free(data->workdiralt); 962 g_free(data->pskfilealt); 963 g_free(data->workdir); 964 g_free(data->pskfile); 965 g_free(data); 966 } 967 968 #ifdef CONFIG_TASN1 969 typedef struct { 970 char *workdir; 971 char *keyfile; 972 char *cacert; 973 char *servercert; 974 char *serverkey; 975 char *clientcert; 976 char *clientkey; 977 } TestMigrateTLSX509Data; 978 979 typedef struct { 980 bool verifyclient; 981 bool clientcert; 982 bool hostileclient; 983 bool authzclient; 984 const char *certhostname; 985 const char *certipaddr; 986 } TestMigrateTLSX509; 987 988 static void * 989 test_migrate_tls_x509_start_common(QTestState *from, 990 QTestState *to, 991 TestMigrateTLSX509 *args) 992 { 993 TestMigrateTLSX509Data *data = g_new0(TestMigrateTLSX509Data, 1); 994 995 data->workdir = g_strdup_printf("%s/tlscredsx5090", tmpfs); 996 data->keyfile = g_strdup_printf("%s/key.pem", data->workdir); 997 998 data->cacert = g_strdup_printf("%s/ca-cert.pem", data->workdir); 999 data->serverkey = g_strdup_printf("%s/server-key.pem", data->workdir); 1000 data->servercert = g_strdup_printf("%s/server-cert.pem", data->workdir); 1001 if (args->clientcert) { 1002 data->clientkey = g_strdup_printf("%s/client-key.pem", data->workdir); 1003 data->clientcert = g_strdup_printf("%s/client-cert.pem", data->workdir); 1004 } 1005 1006 g_mkdir_with_parents(data->workdir, 0700); 1007 1008 test_tls_init(data->keyfile); 1009 #ifndef _WIN32 1010 g_assert(link(data->keyfile, data->serverkey) == 0); 1011 #else 1012 g_assert(CreateHardLink(data->serverkey, data->keyfile, NULL) != 0); 1013 #endif 1014 if (args->clientcert) { 1015 #ifndef _WIN32 1016 g_assert(link(data->keyfile, data->clientkey) == 0); 1017 #else 1018 g_assert(CreateHardLink(data->clientkey, data->keyfile, NULL) != 0); 1019 #endif 1020 } 1021 1022 TLS_ROOT_REQ_SIMPLE(cacertreq, data->cacert); 1023 if (args->clientcert) { 1024 TLS_CERT_REQ_SIMPLE_CLIENT(servercertreq, cacertreq, 1025 args->hostileclient ? 1026 QCRYPTO_TLS_TEST_CLIENT_HOSTILE_NAME : 1027 QCRYPTO_TLS_TEST_CLIENT_NAME, 1028 data->clientcert); 1029 } 1030 1031 TLS_CERT_REQ_SIMPLE_SERVER(clientcertreq, cacertreq, 1032 data->servercert, 1033 args->certhostname, 1034 args->certipaddr); 1035 1036 qtest_qmp_assert_success(from, 1037 "{ 'execute': 'object-add'," 1038 " 'arguments': { 'qom-type': 'tls-creds-x509'," 1039 " 'id': 'tlscredsx509client0'," 1040 " 'endpoint': 'client'," 1041 " 'dir': %s," 1042 " 'sanity-check': true," 1043 " 'verify-peer': true} }", 1044 data->workdir); 1045 migrate_set_parameter_str(from, "tls-creds", "tlscredsx509client0"); 1046 if (args->certhostname) { 1047 migrate_set_parameter_str(from, "tls-hostname", args->certhostname); 1048 } 1049 1050 qtest_qmp_assert_success(to, 1051 "{ 'execute': 'object-add'," 1052 " 'arguments': { 'qom-type': 'tls-creds-x509'," 1053 " 'id': 'tlscredsx509server0'," 1054 " 'endpoint': 'server'," 1055 " 'dir': %s," 1056 " 'sanity-check': true," 1057 " 'verify-peer': %i} }", 1058 data->workdir, args->verifyclient); 1059 migrate_set_parameter_str(to, "tls-creds", "tlscredsx509server0"); 1060 1061 if (args->authzclient) { 1062 qtest_qmp_assert_success(to, 1063 "{ 'execute': 'object-add'," 1064 " 'arguments': { 'qom-type': 'authz-simple'," 1065 " 'id': 'tlsauthz0'," 1066 " 'identity': %s} }", 1067 "CN=" QCRYPTO_TLS_TEST_CLIENT_NAME); 1068 migrate_set_parameter_str(to, "tls-authz", "tlsauthz0"); 1069 } 1070 1071 return data; 1072 } 1073 1074 /* 1075 * The normal case: match server's cert hostname against 1076 * whatever host we were telling QEMU to connect to (if any) 1077 */ 1078 static void * 1079 test_migrate_tls_x509_start_default_host(QTestState *from, 1080 QTestState *to) 1081 { 1082 TestMigrateTLSX509 args = { 1083 .verifyclient = true, 1084 .clientcert = true, 1085 .certipaddr = "127.0.0.1" 1086 }; 1087 return test_migrate_tls_x509_start_common(from, to, &args); 1088 } 1089 1090 /* 1091 * The unusual case: the server's cert is different from 1092 * the address we're telling QEMU to connect to (if any), 1093 * so we must give QEMU an explicit hostname to validate 1094 */ 1095 static void * 1096 test_migrate_tls_x509_start_override_host(QTestState *from, 1097 QTestState *to) 1098 { 1099 TestMigrateTLSX509 args = { 1100 .verifyclient = true, 1101 .clientcert = true, 1102 .certhostname = "qemu.org", 1103 }; 1104 return test_migrate_tls_x509_start_common(from, to, &args); 1105 } 1106 1107 /* 1108 * The unusual case: the server's cert is different from 1109 * the address we're telling QEMU to connect to, and so we 1110 * expect the client to reject the server 1111 */ 1112 static void * 1113 test_migrate_tls_x509_start_mismatch_host(QTestState *from, 1114 QTestState *to) 1115 { 1116 TestMigrateTLSX509 args = { 1117 .verifyclient = true, 1118 .clientcert = true, 1119 .certipaddr = "10.0.0.1", 1120 }; 1121 return test_migrate_tls_x509_start_common(from, to, &args); 1122 } 1123 1124 static void * 1125 test_migrate_tls_x509_start_friendly_client(QTestState *from, 1126 QTestState *to) 1127 { 1128 TestMigrateTLSX509 args = { 1129 .verifyclient = true, 1130 .clientcert = true, 1131 .authzclient = true, 1132 .certipaddr = "127.0.0.1", 1133 }; 1134 return test_migrate_tls_x509_start_common(from, to, &args); 1135 } 1136 1137 static void * 1138 test_migrate_tls_x509_start_hostile_client(QTestState *from, 1139 QTestState *to) 1140 { 1141 TestMigrateTLSX509 args = { 1142 .verifyclient = true, 1143 .clientcert = true, 1144 .hostileclient = true, 1145 .authzclient = true, 1146 .certipaddr = "127.0.0.1", 1147 }; 1148 return test_migrate_tls_x509_start_common(from, to, &args); 1149 } 1150 1151 /* 1152 * The case with no client certificate presented, 1153 * and no server verification 1154 */ 1155 static void * 1156 test_migrate_tls_x509_start_allow_anon_client(QTestState *from, 1157 QTestState *to) 1158 { 1159 TestMigrateTLSX509 args = { 1160 .certipaddr = "127.0.0.1", 1161 }; 1162 return test_migrate_tls_x509_start_common(from, to, &args); 1163 } 1164 1165 /* 1166 * The case with no client certificate presented, 1167 * and server verification rejecting 1168 */ 1169 static void * 1170 test_migrate_tls_x509_start_reject_anon_client(QTestState *from, 1171 QTestState *to) 1172 { 1173 TestMigrateTLSX509 args = { 1174 .verifyclient = true, 1175 .certipaddr = "127.0.0.1", 1176 }; 1177 return test_migrate_tls_x509_start_common(from, to, &args); 1178 } 1179 1180 static void 1181 test_migrate_tls_x509_finish(QTestState *from, 1182 QTestState *to, 1183 void *opaque) 1184 { 1185 TestMigrateTLSX509Data *data = opaque; 1186 1187 test_tls_cleanup(data->keyfile); 1188 g_free(data->keyfile); 1189 1190 unlink(data->cacert); 1191 g_free(data->cacert); 1192 unlink(data->servercert); 1193 g_free(data->servercert); 1194 unlink(data->serverkey); 1195 g_free(data->serverkey); 1196 1197 if (data->clientcert) { 1198 unlink(data->clientcert); 1199 g_free(data->clientcert); 1200 } 1201 if (data->clientkey) { 1202 unlink(data->clientkey); 1203 g_free(data->clientkey); 1204 } 1205 1206 rmdir(data->workdir); 1207 g_free(data->workdir); 1208 1209 g_free(data); 1210 } 1211 #endif /* CONFIG_TASN1 */ 1212 #endif /* CONFIG_GNUTLS */ 1213 1214 static void * 1215 test_migrate_compress_start(QTestState *from, 1216 QTestState *to) 1217 { 1218 migrate_set_parameter_int(from, "compress-level", 1); 1219 migrate_set_parameter_int(from, "compress-threads", 4); 1220 migrate_set_parameter_bool(from, "compress-wait-thread", true); 1221 migrate_set_parameter_int(to, "decompress-threads", 4); 1222 1223 migrate_set_capability(from, "compress", true); 1224 migrate_set_capability(to, "compress", true); 1225 1226 return NULL; 1227 } 1228 1229 static void * 1230 test_migrate_compress_nowait_start(QTestState *from, 1231 QTestState *to) 1232 { 1233 migrate_set_parameter_int(from, "compress-level", 9); 1234 migrate_set_parameter_int(from, "compress-threads", 1); 1235 migrate_set_parameter_bool(from, "compress-wait-thread", false); 1236 migrate_set_parameter_int(to, "decompress-threads", 1); 1237 1238 migrate_set_capability(from, "compress", true); 1239 migrate_set_capability(to, "compress", true); 1240 1241 return NULL; 1242 } 1243 1244 static int migrate_postcopy_prepare(QTestState **from_ptr, 1245 QTestState **to_ptr, 1246 MigrateCommon *args) 1247 { 1248 g_autofree char *uri = g_strdup_printf("unix:%s/migsocket", tmpfs); 1249 QTestState *from, *to; 1250 1251 if (test_migrate_start(&from, &to, uri, &args->start)) { 1252 return -1; 1253 } 1254 1255 if (args->start_hook) { 1256 args->postcopy_data = args->start_hook(from, to); 1257 } 1258 1259 migrate_set_capability(from, "postcopy-ram", true); 1260 migrate_set_capability(to, "postcopy-ram", true); 1261 migrate_set_capability(to, "postcopy-blocktime", true); 1262 1263 if (args->postcopy_preempt) { 1264 migrate_set_capability(from, "postcopy-preempt", true); 1265 migrate_set_capability(to, "postcopy-preempt", true); 1266 } 1267 1268 migrate_ensure_non_converge(from); 1269 1270 migrate_prepare_for_dirty_mem(from); 1271 1272 /* Wait for the first serial output from the source */ 1273 wait_for_serial("src_serial"); 1274 1275 migrate_qmp(from, uri, "{}"); 1276 1277 migrate_wait_for_dirty_mem(from, to); 1278 1279 *from_ptr = from; 1280 *to_ptr = to; 1281 1282 return 0; 1283 } 1284 1285 static void migrate_postcopy_complete(QTestState *from, QTestState *to, 1286 MigrateCommon *args) 1287 { 1288 wait_for_migration_complete(from); 1289 1290 /* Make sure we get at least one "B" on destination */ 1291 wait_for_serial("dest_serial"); 1292 1293 if (uffd_feature_thread_id) { 1294 read_blocktime(to); 1295 } 1296 1297 if (args->finish_hook) { 1298 args->finish_hook(from, to, args->postcopy_data); 1299 args->postcopy_data = NULL; 1300 } 1301 1302 test_migrate_end(from, to, true); 1303 } 1304 1305 static void test_postcopy_common(MigrateCommon *args) 1306 { 1307 QTestState *from, *to; 1308 1309 if (migrate_postcopy_prepare(&from, &to, args)) { 1310 return; 1311 } 1312 migrate_postcopy_start(from, to); 1313 migrate_postcopy_complete(from, to, args); 1314 } 1315 1316 static void test_postcopy(void) 1317 { 1318 MigrateCommon args = { }; 1319 1320 test_postcopy_common(&args); 1321 } 1322 1323 static void test_postcopy_compress(void) 1324 { 1325 MigrateCommon args = { 1326 .start_hook = test_migrate_compress_start 1327 }; 1328 1329 test_postcopy_common(&args); 1330 } 1331 1332 static void test_postcopy_preempt(void) 1333 { 1334 MigrateCommon args = { 1335 .postcopy_preempt = true, 1336 }; 1337 1338 test_postcopy_common(&args); 1339 } 1340 1341 #ifdef CONFIG_GNUTLS 1342 static void test_postcopy_tls_psk(void) 1343 { 1344 MigrateCommon args = { 1345 .start_hook = test_migrate_tls_psk_start_match, 1346 .finish_hook = test_migrate_tls_psk_finish, 1347 }; 1348 1349 test_postcopy_common(&args); 1350 } 1351 1352 static void test_postcopy_preempt_tls_psk(void) 1353 { 1354 MigrateCommon args = { 1355 .postcopy_preempt = true, 1356 .start_hook = test_migrate_tls_psk_start_match, 1357 .finish_hook = test_migrate_tls_psk_finish, 1358 }; 1359 1360 test_postcopy_common(&args); 1361 } 1362 #endif 1363 1364 static void test_postcopy_recovery_common(MigrateCommon *args) 1365 { 1366 QTestState *from, *to; 1367 g_autofree char *uri = NULL; 1368 1369 /* Always hide errors for postcopy recover tests since they're expected */ 1370 args->start.hide_stderr = true; 1371 1372 if (migrate_postcopy_prepare(&from, &to, args)) { 1373 return; 1374 } 1375 1376 /* Turn postcopy speed down, 4K/s is slow enough on any machines */ 1377 migrate_set_parameter_int(from, "max-postcopy-bandwidth", 4096); 1378 1379 /* Now we start the postcopy */ 1380 migrate_postcopy_start(from, to); 1381 1382 /* 1383 * Wait until postcopy is really started; we can only run the 1384 * migrate-pause command during a postcopy 1385 */ 1386 wait_for_migration_status(from, "postcopy-active", NULL); 1387 1388 /* 1389 * Manually stop the postcopy migration. This emulates a network 1390 * failure with the migration socket 1391 */ 1392 migrate_pause(from); 1393 1394 /* 1395 * Wait for destination side to reach postcopy-paused state. The 1396 * migrate-recover command can only succeed if destination machine 1397 * is in the paused state 1398 */ 1399 wait_for_migration_status(to, "postcopy-paused", 1400 (const char * []) { "failed", "active", 1401 "completed", NULL }); 1402 1403 /* 1404 * Create a new socket to emulate a new channel that is different 1405 * from the broken migration channel; tell the destination to 1406 * listen to the new port 1407 */ 1408 uri = g_strdup_printf("unix:%s/migsocket-recover", tmpfs); 1409 migrate_recover(to, uri); 1410 1411 /* 1412 * Try to rebuild the migration channel using the resume flag and 1413 * the newly created channel 1414 */ 1415 wait_for_migration_status(from, "postcopy-paused", 1416 (const char * []) { "failed", "active", 1417 "completed", NULL }); 1418 migrate_qmp(from, uri, "{'resume': true}"); 1419 1420 /* Restore the postcopy bandwidth to unlimited */ 1421 migrate_set_parameter_int(from, "max-postcopy-bandwidth", 0); 1422 1423 migrate_postcopy_complete(from, to, args); 1424 } 1425 1426 static void test_postcopy_recovery(void) 1427 { 1428 MigrateCommon args = { }; 1429 1430 test_postcopy_recovery_common(&args); 1431 } 1432 1433 static void test_postcopy_recovery_compress(void) 1434 { 1435 MigrateCommon args = { 1436 .start_hook = test_migrate_compress_start 1437 }; 1438 1439 test_postcopy_recovery_common(&args); 1440 } 1441 1442 #ifdef CONFIG_GNUTLS 1443 static void test_postcopy_recovery_tls_psk(void) 1444 { 1445 MigrateCommon args = { 1446 .start_hook = test_migrate_tls_psk_start_match, 1447 .finish_hook = test_migrate_tls_psk_finish, 1448 }; 1449 1450 test_postcopy_recovery_common(&args); 1451 } 1452 #endif 1453 1454 static void test_postcopy_preempt_recovery(void) 1455 { 1456 MigrateCommon args = { 1457 .postcopy_preempt = true, 1458 }; 1459 1460 test_postcopy_recovery_common(&args); 1461 } 1462 1463 #ifdef CONFIG_GNUTLS 1464 /* This contains preempt+recovery+tls test altogether */ 1465 static void test_postcopy_preempt_all(void) 1466 { 1467 MigrateCommon args = { 1468 .postcopy_preempt = true, 1469 .start_hook = test_migrate_tls_psk_start_match, 1470 .finish_hook = test_migrate_tls_psk_finish, 1471 }; 1472 1473 test_postcopy_recovery_common(&args); 1474 } 1475 1476 #endif 1477 1478 static void test_baddest(void) 1479 { 1480 MigrateStart args = { 1481 .hide_stderr = true 1482 }; 1483 QTestState *from, *to; 1484 1485 if (test_migrate_start(&from, &to, "tcp:127.0.0.1:0", &args)) { 1486 return; 1487 } 1488 migrate_qmp(from, "tcp:127.0.0.1:0", "{}"); 1489 wait_for_migration_fail(from, false); 1490 test_migrate_end(from, to, false); 1491 } 1492 1493 static void test_precopy_common(MigrateCommon *args) 1494 { 1495 QTestState *from, *to; 1496 void *data_hook = NULL; 1497 1498 if (test_migrate_start(&from, &to, args->listen_uri, &args->start)) { 1499 return; 1500 } 1501 1502 if (args->start_hook) { 1503 data_hook = args->start_hook(from, to); 1504 } 1505 1506 /* Wait for the first serial output from the source */ 1507 if (args->result == MIG_TEST_SUCCEED) { 1508 wait_for_serial("src_serial"); 1509 } 1510 1511 if (args->live) { 1512 migrate_ensure_non_converge(from); 1513 migrate_prepare_for_dirty_mem(from); 1514 } else { 1515 /* 1516 * Testing non-live migration, we allow it to run at 1517 * full speed to ensure short test case duration. 1518 * For tests expected to fail, we don't need to 1519 * change anything. 1520 */ 1521 if (args->result == MIG_TEST_SUCCEED) { 1522 qtest_qmp_assert_success(from, "{ 'execute' : 'stop'}"); 1523 if (!got_src_stop) { 1524 qtest_qmp_eventwait(from, "STOP"); 1525 } 1526 migrate_ensure_converge(from); 1527 } 1528 } 1529 1530 if (!args->connect_uri) { 1531 g_autofree char *local_connect_uri = 1532 migrate_get_socket_address(to, "socket-address"); 1533 migrate_qmp(from, local_connect_uri, "{}"); 1534 } else { 1535 migrate_qmp(from, args->connect_uri, "{}"); 1536 } 1537 1538 1539 if (args->result != MIG_TEST_SUCCEED) { 1540 bool allow_active = args->result == MIG_TEST_FAIL; 1541 wait_for_migration_fail(from, allow_active); 1542 1543 if (args->result == MIG_TEST_FAIL_DEST_QUIT_ERR) { 1544 qtest_set_expected_status(to, EXIT_FAILURE); 1545 } 1546 } else { 1547 if (args->live) { 1548 /* 1549 * For initial iteration(s) we must do a full pass, 1550 * but for the final iteration, we need only wait 1551 * for some dirty mem before switching to converge 1552 */ 1553 while (args->iterations > 1) { 1554 wait_for_migration_pass(from); 1555 args->iterations--; 1556 } 1557 migrate_wait_for_dirty_mem(from, to); 1558 1559 migrate_ensure_converge(from); 1560 1561 /* 1562 * We do this first, as it has a timeout to stop us 1563 * hanging forever if migration didn't converge 1564 */ 1565 wait_for_migration_complete(from); 1566 1567 if (!got_src_stop) { 1568 qtest_qmp_eventwait(from, "STOP"); 1569 } 1570 } else { 1571 wait_for_migration_complete(from); 1572 /* 1573 * Must wait for dst to finish reading all incoming 1574 * data on the socket before issuing 'cont' otherwise 1575 * it'll be ignored 1576 */ 1577 wait_for_migration_complete(to); 1578 1579 qtest_qmp_assert_success(to, "{ 'execute' : 'cont'}"); 1580 } 1581 1582 if (!got_dst_resume) { 1583 qtest_qmp_eventwait(to, "RESUME"); 1584 } 1585 1586 wait_for_serial("dest_serial"); 1587 } 1588 1589 if (args->finish_hook) { 1590 args->finish_hook(from, to, data_hook); 1591 } 1592 1593 test_migrate_end(from, to, args->result == MIG_TEST_SUCCEED); 1594 } 1595 1596 static void test_precopy_unix_plain(void) 1597 { 1598 g_autofree char *uri = g_strdup_printf("unix:%s/migsocket", tmpfs); 1599 MigrateCommon args = { 1600 .listen_uri = uri, 1601 .connect_uri = uri, 1602 /* 1603 * The simplest use case of precopy, covering smoke tests of 1604 * get-dirty-log dirty tracking. 1605 */ 1606 .live = true, 1607 }; 1608 1609 test_precopy_common(&args); 1610 } 1611 1612 1613 static void test_precopy_unix_dirty_ring(void) 1614 { 1615 g_autofree char *uri = g_strdup_printf("unix:%s/migsocket", tmpfs); 1616 MigrateCommon args = { 1617 .start = { 1618 .use_dirty_ring = true, 1619 }, 1620 .listen_uri = uri, 1621 .connect_uri = uri, 1622 /* 1623 * Besides the precopy/unix basic test, cover dirty ring interface 1624 * rather than get-dirty-log. 1625 */ 1626 .live = true, 1627 }; 1628 1629 test_precopy_common(&args); 1630 } 1631 1632 #ifdef CONFIG_GNUTLS 1633 static void test_precopy_unix_tls_psk(void) 1634 { 1635 g_autofree char *uri = g_strdup_printf("unix:%s/migsocket", tmpfs); 1636 MigrateCommon args = { 1637 .connect_uri = uri, 1638 .listen_uri = uri, 1639 .start_hook = test_migrate_tls_psk_start_match, 1640 .finish_hook = test_migrate_tls_psk_finish, 1641 }; 1642 1643 test_precopy_common(&args); 1644 } 1645 1646 #ifdef CONFIG_TASN1 1647 static void test_precopy_unix_tls_x509_default_host(void) 1648 { 1649 g_autofree char *uri = g_strdup_printf("unix:%s/migsocket", tmpfs); 1650 MigrateCommon args = { 1651 .start = { 1652 .hide_stderr = true, 1653 }, 1654 .connect_uri = uri, 1655 .listen_uri = uri, 1656 .start_hook = test_migrate_tls_x509_start_default_host, 1657 .finish_hook = test_migrate_tls_x509_finish, 1658 .result = MIG_TEST_FAIL_DEST_QUIT_ERR, 1659 }; 1660 1661 test_precopy_common(&args); 1662 } 1663 1664 static void test_precopy_unix_tls_x509_override_host(void) 1665 { 1666 g_autofree char *uri = g_strdup_printf("unix:%s/migsocket", tmpfs); 1667 MigrateCommon args = { 1668 .connect_uri = uri, 1669 .listen_uri = uri, 1670 .start_hook = test_migrate_tls_x509_start_override_host, 1671 .finish_hook = test_migrate_tls_x509_finish, 1672 }; 1673 1674 test_precopy_common(&args); 1675 } 1676 #endif /* CONFIG_TASN1 */ 1677 #endif /* CONFIG_GNUTLS */ 1678 1679 #if 0 1680 /* Currently upset on aarch64 TCG */ 1681 static void test_ignore_shared(void) 1682 { 1683 g_autofree char *uri = g_strdup_printf("unix:%s/migsocket", tmpfs); 1684 QTestState *from, *to; 1685 1686 if (test_migrate_start(&from, &to, uri, false, true, NULL, NULL)) { 1687 return; 1688 } 1689 1690 migrate_ensure_non_converge(from); 1691 migrate_prepare_for_dirty_mem(from); 1692 1693 migrate_set_capability(from, "x-ignore-shared", true); 1694 migrate_set_capability(to, "x-ignore-shared", true); 1695 1696 /* Wait for the first serial output from the source */ 1697 wait_for_serial("src_serial"); 1698 1699 migrate_qmp(from, uri, "{}"); 1700 1701 migrate_wait_for_dirty_mem(from, to); 1702 1703 if (!got_src_stop) { 1704 qtest_qmp_eventwait(from, "STOP"); 1705 } 1706 1707 qtest_qmp_eventwait(to, "RESUME"); 1708 1709 wait_for_serial("dest_serial"); 1710 wait_for_migration_complete(from); 1711 1712 /* Check whether shared RAM has been really skipped */ 1713 g_assert_cmpint(read_ram_property_int(from, "transferred"), <, 1024 * 1024); 1714 1715 test_migrate_end(from, to, true); 1716 } 1717 #endif 1718 1719 static void * 1720 test_migrate_xbzrle_start(QTestState *from, 1721 QTestState *to) 1722 { 1723 migrate_set_parameter_int(from, "xbzrle-cache-size", 33554432); 1724 1725 migrate_set_capability(from, "xbzrle", true); 1726 migrate_set_capability(to, "xbzrle", true); 1727 1728 return NULL; 1729 } 1730 1731 static void test_precopy_unix_xbzrle(void) 1732 { 1733 g_autofree char *uri = g_strdup_printf("unix:%s/migsocket", tmpfs); 1734 MigrateCommon args = { 1735 .connect_uri = uri, 1736 .listen_uri = uri, 1737 .start_hook = test_migrate_xbzrle_start, 1738 .iterations = 2, 1739 /* 1740 * XBZRLE needs pages to be modified when doing the 2nd+ round 1741 * iteration to have real data pushed to the stream. 1742 */ 1743 .live = true, 1744 }; 1745 1746 test_precopy_common(&args); 1747 } 1748 1749 static void test_precopy_unix_compress(void) 1750 { 1751 g_autofree char *uri = g_strdup_printf("unix:%s/migsocket", tmpfs); 1752 MigrateCommon args = { 1753 .connect_uri = uri, 1754 .listen_uri = uri, 1755 .start_hook = test_migrate_compress_start, 1756 /* 1757 * Test that no invalid thread state is left over from 1758 * the previous iteration. 1759 */ 1760 .iterations = 2, 1761 /* 1762 * We make sure the compressor can always work well even if guest 1763 * memory is changing. See commit 34ab9e9743 where we used to fix 1764 * a bug when only trigger-able with guest memory changing. 1765 */ 1766 .live = true, 1767 }; 1768 1769 test_precopy_common(&args); 1770 } 1771 1772 static void test_precopy_unix_compress_nowait(void) 1773 { 1774 g_autofree char *uri = g_strdup_printf("unix:%s/migsocket", tmpfs); 1775 MigrateCommon args = { 1776 .connect_uri = uri, 1777 .listen_uri = uri, 1778 .start_hook = test_migrate_compress_nowait_start, 1779 /* 1780 * Test that no invalid thread state is left over from 1781 * the previous iteration. 1782 */ 1783 .iterations = 2, 1784 /* Same reason for the wait version of precopy compress test */ 1785 .live = true, 1786 }; 1787 1788 test_precopy_common(&args); 1789 } 1790 1791 static void test_precopy_tcp_plain(void) 1792 { 1793 MigrateCommon args = { 1794 .listen_uri = "tcp:127.0.0.1:0", 1795 }; 1796 1797 test_precopy_common(&args); 1798 } 1799 1800 static void *test_migrate_switchover_ack_start(QTestState *from, QTestState *to) 1801 { 1802 1803 migrate_set_capability(from, "return-path", true); 1804 migrate_set_capability(to, "return-path", true); 1805 1806 migrate_set_capability(from, "switchover-ack", true); 1807 migrate_set_capability(to, "switchover-ack", true); 1808 1809 return NULL; 1810 } 1811 1812 static void test_precopy_tcp_switchover_ack(void) 1813 { 1814 MigrateCommon args = { 1815 .listen_uri = "tcp:127.0.0.1:0", 1816 .start_hook = test_migrate_switchover_ack_start, 1817 /* 1818 * Source VM must be running in order to consider the switchover ACK 1819 * when deciding to do switchover or not. 1820 */ 1821 .live = true, 1822 }; 1823 1824 test_precopy_common(&args); 1825 } 1826 1827 #ifdef CONFIG_GNUTLS 1828 static void test_precopy_tcp_tls_psk_match(void) 1829 { 1830 MigrateCommon args = { 1831 .listen_uri = "tcp:127.0.0.1:0", 1832 .start_hook = test_migrate_tls_psk_start_match, 1833 .finish_hook = test_migrate_tls_psk_finish, 1834 }; 1835 1836 test_precopy_common(&args); 1837 } 1838 1839 static void test_precopy_tcp_tls_psk_mismatch(void) 1840 { 1841 MigrateCommon args = { 1842 .start = { 1843 .hide_stderr = true, 1844 }, 1845 .listen_uri = "tcp:127.0.0.1:0", 1846 .start_hook = test_migrate_tls_psk_start_mismatch, 1847 .finish_hook = test_migrate_tls_psk_finish, 1848 .result = MIG_TEST_FAIL, 1849 }; 1850 1851 test_precopy_common(&args); 1852 } 1853 1854 #ifdef CONFIG_TASN1 1855 static void test_precopy_tcp_tls_x509_default_host(void) 1856 { 1857 MigrateCommon args = { 1858 .listen_uri = "tcp:127.0.0.1:0", 1859 .start_hook = test_migrate_tls_x509_start_default_host, 1860 .finish_hook = test_migrate_tls_x509_finish, 1861 }; 1862 1863 test_precopy_common(&args); 1864 } 1865 1866 static void test_precopy_tcp_tls_x509_override_host(void) 1867 { 1868 MigrateCommon args = { 1869 .listen_uri = "tcp:127.0.0.1:0", 1870 .start_hook = test_migrate_tls_x509_start_override_host, 1871 .finish_hook = test_migrate_tls_x509_finish, 1872 }; 1873 1874 test_precopy_common(&args); 1875 } 1876 1877 static void test_precopy_tcp_tls_x509_mismatch_host(void) 1878 { 1879 MigrateCommon args = { 1880 .start = { 1881 .hide_stderr = true, 1882 }, 1883 .listen_uri = "tcp:127.0.0.1:0", 1884 .start_hook = test_migrate_tls_x509_start_mismatch_host, 1885 .finish_hook = test_migrate_tls_x509_finish, 1886 .result = MIG_TEST_FAIL_DEST_QUIT_ERR, 1887 }; 1888 1889 test_precopy_common(&args); 1890 } 1891 1892 static void test_precopy_tcp_tls_x509_friendly_client(void) 1893 { 1894 MigrateCommon args = { 1895 .listen_uri = "tcp:127.0.0.1:0", 1896 .start_hook = test_migrate_tls_x509_start_friendly_client, 1897 .finish_hook = test_migrate_tls_x509_finish, 1898 }; 1899 1900 test_precopy_common(&args); 1901 } 1902 1903 static void test_precopy_tcp_tls_x509_hostile_client(void) 1904 { 1905 MigrateCommon args = { 1906 .start = { 1907 .hide_stderr = true, 1908 }, 1909 .listen_uri = "tcp:127.0.0.1:0", 1910 .start_hook = test_migrate_tls_x509_start_hostile_client, 1911 .finish_hook = test_migrate_tls_x509_finish, 1912 .result = MIG_TEST_FAIL, 1913 }; 1914 1915 test_precopy_common(&args); 1916 } 1917 1918 static void test_precopy_tcp_tls_x509_allow_anon_client(void) 1919 { 1920 MigrateCommon args = { 1921 .listen_uri = "tcp:127.0.0.1:0", 1922 .start_hook = test_migrate_tls_x509_start_allow_anon_client, 1923 .finish_hook = test_migrate_tls_x509_finish, 1924 }; 1925 1926 test_precopy_common(&args); 1927 } 1928 1929 static void test_precopy_tcp_tls_x509_reject_anon_client(void) 1930 { 1931 MigrateCommon args = { 1932 .start = { 1933 .hide_stderr = true, 1934 }, 1935 .listen_uri = "tcp:127.0.0.1:0", 1936 .start_hook = test_migrate_tls_x509_start_reject_anon_client, 1937 .finish_hook = test_migrate_tls_x509_finish, 1938 .result = MIG_TEST_FAIL, 1939 }; 1940 1941 test_precopy_common(&args); 1942 } 1943 #endif /* CONFIG_TASN1 */ 1944 #endif /* CONFIG_GNUTLS */ 1945 1946 #ifndef _WIN32 1947 static void *test_migrate_fd_start_hook(QTestState *from, 1948 QTestState *to) 1949 { 1950 int ret; 1951 int pair[2]; 1952 1953 /* Create two connected sockets for migration */ 1954 ret = qemu_socketpair(PF_LOCAL, SOCK_STREAM, 0, pair); 1955 g_assert_cmpint(ret, ==, 0); 1956 1957 /* Send the 1st socket to the target */ 1958 qtest_qmp_fds_assert_success(to, &pair[0], 1, 1959 "{ 'execute': 'getfd'," 1960 " 'arguments': { 'fdname': 'fd-mig' }}"); 1961 close(pair[0]); 1962 1963 /* Start incoming migration from the 1st socket */ 1964 qtest_qmp_assert_success(to, "{ 'execute': 'migrate-incoming'," 1965 " 'arguments': { 'uri': 'fd:fd-mig' }}"); 1966 1967 /* Send the 2nd socket to the target */ 1968 qtest_qmp_fds_assert_success(from, &pair[1], 1, 1969 "{ 'execute': 'getfd'," 1970 " 'arguments': { 'fdname': 'fd-mig' }}"); 1971 close(pair[1]); 1972 1973 return NULL; 1974 } 1975 1976 static void test_migrate_fd_finish_hook(QTestState *from, 1977 QTestState *to, 1978 void *opaque) 1979 { 1980 QDict *rsp; 1981 const char *error_desc; 1982 1983 /* Test closing fds */ 1984 /* We assume, that QEMU removes named fd from its list, 1985 * so this should fail */ 1986 rsp = qtest_qmp(from, "{ 'execute': 'closefd'," 1987 " 'arguments': { 'fdname': 'fd-mig' }}"); 1988 g_assert_true(qdict_haskey(rsp, "error")); 1989 error_desc = qdict_get_str(qdict_get_qdict(rsp, "error"), "desc"); 1990 g_assert_cmpstr(error_desc, ==, "File descriptor named 'fd-mig' not found"); 1991 qobject_unref(rsp); 1992 1993 rsp = qtest_qmp(to, "{ 'execute': 'closefd'," 1994 " 'arguments': { 'fdname': 'fd-mig' }}"); 1995 g_assert_true(qdict_haskey(rsp, "error")); 1996 error_desc = qdict_get_str(qdict_get_qdict(rsp, "error"), "desc"); 1997 g_assert_cmpstr(error_desc, ==, "File descriptor named 'fd-mig' not found"); 1998 qobject_unref(rsp); 1999 } 2000 2001 static void test_migrate_fd_proto(void) 2002 { 2003 MigrateCommon args = { 2004 .listen_uri = "defer", 2005 .connect_uri = "fd:fd-mig", 2006 .start_hook = test_migrate_fd_start_hook, 2007 .finish_hook = test_migrate_fd_finish_hook 2008 }; 2009 test_precopy_common(&args); 2010 } 2011 #endif /* _WIN32 */ 2012 2013 static void do_test_validate_uuid(MigrateStart *args, bool should_fail) 2014 { 2015 g_autofree char *uri = g_strdup_printf("unix:%s/migsocket", tmpfs); 2016 QTestState *from, *to; 2017 2018 if (test_migrate_start(&from, &to, uri, args)) { 2019 return; 2020 } 2021 2022 /* 2023 * UUID validation is at the begin of migration. So, the main process of 2024 * migration is not interesting for us here. Thus, set huge downtime for 2025 * very fast migration. 2026 */ 2027 migrate_set_parameter_int(from, "downtime-limit", 1000000); 2028 migrate_set_capability(from, "validate-uuid", true); 2029 2030 /* Wait for the first serial output from the source */ 2031 wait_for_serial("src_serial"); 2032 2033 migrate_qmp(from, uri, "{}"); 2034 2035 if (should_fail) { 2036 qtest_set_expected_status(to, EXIT_FAILURE); 2037 wait_for_migration_fail(from, true); 2038 } else { 2039 wait_for_migration_complete(from); 2040 } 2041 2042 test_migrate_end(from, to, false); 2043 } 2044 2045 static void test_validate_uuid(void) 2046 { 2047 MigrateStart args = { 2048 .opts_source = "-uuid 11111111-1111-1111-1111-111111111111", 2049 .opts_target = "-uuid 11111111-1111-1111-1111-111111111111", 2050 }; 2051 2052 do_test_validate_uuid(&args, false); 2053 } 2054 2055 static void test_validate_uuid_error(void) 2056 { 2057 MigrateStart args = { 2058 .opts_source = "-uuid 11111111-1111-1111-1111-111111111111", 2059 .opts_target = "-uuid 22222222-2222-2222-2222-222222222222", 2060 .hide_stderr = true, 2061 }; 2062 2063 do_test_validate_uuid(&args, true); 2064 } 2065 2066 static void test_validate_uuid_src_not_set(void) 2067 { 2068 MigrateStart args = { 2069 .opts_target = "-uuid 22222222-2222-2222-2222-222222222222", 2070 .hide_stderr = true, 2071 }; 2072 2073 do_test_validate_uuid(&args, false); 2074 } 2075 2076 static void test_validate_uuid_dst_not_set(void) 2077 { 2078 MigrateStart args = { 2079 .opts_source = "-uuid 11111111-1111-1111-1111-111111111111", 2080 .hide_stderr = true, 2081 }; 2082 2083 do_test_validate_uuid(&args, false); 2084 } 2085 2086 /* 2087 * The way auto_converge works, we need to do too many passes to 2088 * run this test. Auto_converge logic is only run once every 2089 * three iterations, so: 2090 * 2091 * - 3 iterations without auto_converge enabled 2092 * - 3 iterations with pct = 5 2093 * - 3 iterations with pct = 30 2094 * - 3 iterations with pct = 55 2095 * - 3 iterations with pct = 80 2096 * - 3 iterations with pct = 95 (max(95, 80 + 25)) 2097 * 2098 * To make things even worse, we need to run the initial stage at 2099 * 3MB/s so we enter autoconverge even when host is (over)loaded. 2100 */ 2101 static void test_migrate_auto_converge(void) 2102 { 2103 g_autofree char *uri = g_strdup_printf("unix:%s/migsocket", tmpfs); 2104 MigrateStart args = {}; 2105 QTestState *from, *to; 2106 int64_t percentage; 2107 2108 /* 2109 * We want the test to be stable and as fast as possible. 2110 * E.g., with 1Gb/s bandwith migration may pass without throttling, 2111 * so we need to decrease a bandwidth. 2112 */ 2113 const int64_t init_pct = 5, inc_pct = 25, max_pct = 95; 2114 2115 if (test_migrate_start(&from, &to, uri, &args)) { 2116 return; 2117 } 2118 2119 migrate_set_capability(from, "auto-converge", true); 2120 migrate_set_parameter_int(from, "cpu-throttle-initial", init_pct); 2121 migrate_set_parameter_int(from, "cpu-throttle-increment", inc_pct); 2122 migrate_set_parameter_int(from, "max-cpu-throttle", max_pct); 2123 2124 /* 2125 * Set the initial parameters so that the migration could not converge 2126 * without throttling. 2127 */ 2128 migrate_ensure_non_converge(from); 2129 2130 /* To check remaining size after precopy */ 2131 migrate_set_capability(from, "pause-before-switchover", true); 2132 2133 /* Wait for the first serial output from the source */ 2134 wait_for_serial("src_serial"); 2135 2136 migrate_qmp(from, uri, "{}"); 2137 2138 /* Wait for throttling begins */ 2139 percentage = 0; 2140 do { 2141 percentage = read_migrate_property_int(from, "cpu-throttle-percentage"); 2142 if (percentage != 0) { 2143 break; 2144 } 2145 usleep(20); 2146 g_assert_false(got_src_stop); 2147 } while (true); 2148 /* The first percentage of throttling should be at least init_pct */ 2149 g_assert_cmpint(percentage, >=, init_pct); 2150 /* Now, when we tested that throttling works, let it converge */ 2151 migrate_ensure_converge(from); 2152 2153 /* 2154 * Wait for pre-switchover status to check last throttle percentage 2155 * and remaining. These values will be zeroed later 2156 */ 2157 wait_for_migration_status(from, "pre-switchover", NULL); 2158 2159 /* The final percentage of throttling shouldn't be greater than max_pct */ 2160 percentage = read_migrate_property_int(from, "cpu-throttle-percentage"); 2161 g_assert_cmpint(percentage, <=, max_pct); 2162 migrate_continue(from, "pre-switchover"); 2163 2164 qtest_qmp_eventwait(to, "RESUME"); 2165 2166 wait_for_serial("dest_serial"); 2167 wait_for_migration_complete(from); 2168 2169 test_migrate_end(from, to, true); 2170 } 2171 2172 static void * 2173 test_migrate_precopy_tcp_multifd_start_common(QTestState *from, 2174 QTestState *to, 2175 const char *method) 2176 { 2177 migrate_set_parameter_int(from, "multifd-channels", 16); 2178 migrate_set_parameter_int(to, "multifd-channels", 16); 2179 2180 migrate_set_parameter_str(from, "multifd-compression", method); 2181 migrate_set_parameter_str(to, "multifd-compression", method); 2182 2183 migrate_set_capability(from, "multifd", true); 2184 migrate_set_capability(to, "multifd", true); 2185 2186 /* Start incoming migration from the 1st socket */ 2187 qtest_qmp_assert_success(to, "{ 'execute': 'migrate-incoming'," 2188 " 'arguments': { 'uri': 'tcp:127.0.0.1:0' }}"); 2189 2190 return NULL; 2191 } 2192 2193 static void * 2194 test_migrate_precopy_tcp_multifd_start(QTestState *from, 2195 QTestState *to) 2196 { 2197 return test_migrate_precopy_tcp_multifd_start_common(from, to, "none"); 2198 } 2199 2200 static void * 2201 test_migrate_precopy_tcp_multifd_zlib_start(QTestState *from, 2202 QTestState *to) 2203 { 2204 return test_migrate_precopy_tcp_multifd_start_common(from, to, "zlib"); 2205 } 2206 2207 #ifdef CONFIG_ZSTD 2208 static void * 2209 test_migrate_precopy_tcp_multifd_zstd_start(QTestState *from, 2210 QTestState *to) 2211 { 2212 return test_migrate_precopy_tcp_multifd_start_common(from, to, "zstd"); 2213 } 2214 #endif /* CONFIG_ZSTD */ 2215 2216 static void test_multifd_tcp_none(void) 2217 { 2218 MigrateCommon args = { 2219 .listen_uri = "defer", 2220 .start_hook = test_migrate_precopy_tcp_multifd_start, 2221 /* 2222 * Multifd is more complicated than most of the features, it 2223 * directly takes guest page buffers when sending, make sure 2224 * everything will work alright even if guest page is changing. 2225 */ 2226 .live = true, 2227 }; 2228 test_precopy_common(&args); 2229 } 2230 2231 static void test_multifd_tcp_zlib(void) 2232 { 2233 MigrateCommon args = { 2234 .listen_uri = "defer", 2235 .start_hook = test_migrate_precopy_tcp_multifd_zlib_start, 2236 }; 2237 test_precopy_common(&args); 2238 } 2239 2240 #ifdef CONFIG_ZSTD 2241 static void test_multifd_tcp_zstd(void) 2242 { 2243 MigrateCommon args = { 2244 .listen_uri = "defer", 2245 .start_hook = test_migrate_precopy_tcp_multifd_zstd_start, 2246 }; 2247 test_precopy_common(&args); 2248 } 2249 #endif 2250 2251 #ifdef CONFIG_GNUTLS 2252 static void * 2253 test_migrate_multifd_tcp_tls_psk_start_match(QTestState *from, 2254 QTestState *to) 2255 { 2256 test_migrate_precopy_tcp_multifd_start_common(from, to, "none"); 2257 return test_migrate_tls_psk_start_match(from, to); 2258 } 2259 2260 static void * 2261 test_migrate_multifd_tcp_tls_psk_start_mismatch(QTestState *from, 2262 QTestState *to) 2263 { 2264 test_migrate_precopy_tcp_multifd_start_common(from, to, "none"); 2265 return test_migrate_tls_psk_start_mismatch(from, to); 2266 } 2267 2268 #ifdef CONFIG_TASN1 2269 static void * 2270 test_migrate_multifd_tls_x509_start_default_host(QTestState *from, 2271 QTestState *to) 2272 { 2273 test_migrate_precopy_tcp_multifd_start_common(from, to, "none"); 2274 return test_migrate_tls_x509_start_default_host(from, to); 2275 } 2276 2277 static void * 2278 test_migrate_multifd_tls_x509_start_override_host(QTestState *from, 2279 QTestState *to) 2280 { 2281 test_migrate_precopy_tcp_multifd_start_common(from, to, "none"); 2282 return test_migrate_tls_x509_start_override_host(from, to); 2283 } 2284 2285 static void * 2286 test_migrate_multifd_tls_x509_start_mismatch_host(QTestState *from, 2287 QTestState *to) 2288 { 2289 test_migrate_precopy_tcp_multifd_start_common(from, to, "none"); 2290 return test_migrate_tls_x509_start_mismatch_host(from, to); 2291 } 2292 2293 static void * 2294 test_migrate_multifd_tls_x509_start_allow_anon_client(QTestState *from, 2295 QTestState *to) 2296 { 2297 test_migrate_precopy_tcp_multifd_start_common(from, to, "none"); 2298 return test_migrate_tls_x509_start_allow_anon_client(from, to); 2299 } 2300 2301 static void * 2302 test_migrate_multifd_tls_x509_start_reject_anon_client(QTestState *from, 2303 QTestState *to) 2304 { 2305 test_migrate_precopy_tcp_multifd_start_common(from, to, "none"); 2306 return test_migrate_tls_x509_start_reject_anon_client(from, to); 2307 } 2308 #endif /* CONFIG_TASN1 */ 2309 2310 static void test_multifd_tcp_tls_psk_match(void) 2311 { 2312 MigrateCommon args = { 2313 .listen_uri = "defer", 2314 .start_hook = test_migrate_multifd_tcp_tls_psk_start_match, 2315 .finish_hook = test_migrate_tls_psk_finish, 2316 }; 2317 test_precopy_common(&args); 2318 } 2319 2320 static void test_multifd_tcp_tls_psk_mismatch(void) 2321 { 2322 MigrateCommon args = { 2323 .start = { 2324 .hide_stderr = true, 2325 }, 2326 .listen_uri = "defer", 2327 .start_hook = test_migrate_multifd_tcp_tls_psk_start_mismatch, 2328 .finish_hook = test_migrate_tls_psk_finish, 2329 .result = MIG_TEST_FAIL, 2330 }; 2331 test_precopy_common(&args); 2332 } 2333 2334 #ifdef CONFIG_TASN1 2335 static void test_multifd_tcp_tls_x509_default_host(void) 2336 { 2337 MigrateCommon args = { 2338 .listen_uri = "defer", 2339 .start_hook = test_migrate_multifd_tls_x509_start_default_host, 2340 .finish_hook = test_migrate_tls_x509_finish, 2341 }; 2342 test_precopy_common(&args); 2343 } 2344 2345 static void test_multifd_tcp_tls_x509_override_host(void) 2346 { 2347 MigrateCommon args = { 2348 .listen_uri = "defer", 2349 .start_hook = test_migrate_multifd_tls_x509_start_override_host, 2350 .finish_hook = test_migrate_tls_x509_finish, 2351 }; 2352 test_precopy_common(&args); 2353 } 2354 2355 static void test_multifd_tcp_tls_x509_mismatch_host(void) 2356 { 2357 /* 2358 * This has different behaviour to the non-multifd case. 2359 * 2360 * In non-multifd case when client aborts due to mismatched 2361 * cert host, the server has already started trying to load 2362 * migration state, and so it exits with I/O failure. 2363 * 2364 * In multifd case when client aborts due to mismatched 2365 * cert host, the server is still waiting for the other 2366 * multifd connections to arrive so hasn't started trying 2367 * to load migration state, and thus just aborts the migration 2368 * without exiting. 2369 */ 2370 MigrateCommon args = { 2371 .start = { 2372 .hide_stderr = true, 2373 }, 2374 .listen_uri = "defer", 2375 .start_hook = test_migrate_multifd_tls_x509_start_mismatch_host, 2376 .finish_hook = test_migrate_tls_x509_finish, 2377 .result = MIG_TEST_FAIL, 2378 }; 2379 test_precopy_common(&args); 2380 } 2381 2382 static void test_multifd_tcp_tls_x509_allow_anon_client(void) 2383 { 2384 MigrateCommon args = { 2385 .listen_uri = "defer", 2386 .start_hook = test_migrate_multifd_tls_x509_start_allow_anon_client, 2387 .finish_hook = test_migrate_tls_x509_finish, 2388 }; 2389 test_precopy_common(&args); 2390 } 2391 2392 static void test_multifd_tcp_tls_x509_reject_anon_client(void) 2393 { 2394 MigrateCommon args = { 2395 .start = { 2396 .hide_stderr = true, 2397 }, 2398 .listen_uri = "defer", 2399 .start_hook = test_migrate_multifd_tls_x509_start_reject_anon_client, 2400 .finish_hook = test_migrate_tls_x509_finish, 2401 .result = MIG_TEST_FAIL, 2402 }; 2403 test_precopy_common(&args); 2404 } 2405 #endif /* CONFIG_TASN1 */ 2406 #endif /* CONFIG_GNUTLS */ 2407 2408 /* 2409 * This test does: 2410 * source target 2411 * migrate_incoming 2412 * migrate 2413 * migrate_cancel 2414 * launch another target 2415 * migrate 2416 * 2417 * And see that it works 2418 */ 2419 static void test_multifd_tcp_cancel(void) 2420 { 2421 MigrateStart args = { 2422 .hide_stderr = true, 2423 }; 2424 QTestState *from, *to, *to2; 2425 g_autofree char *uri = NULL; 2426 2427 if (test_migrate_start(&from, &to, "defer", &args)) { 2428 return; 2429 } 2430 2431 migrate_ensure_non_converge(from); 2432 migrate_prepare_for_dirty_mem(from); 2433 2434 migrate_set_parameter_int(from, "multifd-channels", 16); 2435 migrate_set_parameter_int(to, "multifd-channels", 16); 2436 2437 migrate_set_capability(from, "multifd", true); 2438 migrate_set_capability(to, "multifd", true); 2439 2440 /* Start incoming migration from the 1st socket */ 2441 qtest_qmp_assert_success(to, "{ 'execute': 'migrate-incoming'," 2442 " 'arguments': { 'uri': 'tcp:127.0.0.1:0' }}"); 2443 2444 /* Wait for the first serial output from the source */ 2445 wait_for_serial("src_serial"); 2446 2447 uri = migrate_get_socket_address(to, "socket-address"); 2448 2449 migrate_qmp(from, uri, "{}"); 2450 2451 migrate_wait_for_dirty_mem(from, to); 2452 2453 migrate_cancel(from); 2454 2455 /* Make sure QEMU process "to" exited */ 2456 qtest_set_expected_status(to, EXIT_FAILURE); 2457 qtest_wait_qemu(to); 2458 2459 args = (MigrateStart){ 2460 .only_target = true, 2461 }; 2462 2463 if (test_migrate_start(&from, &to2, "defer", &args)) { 2464 return; 2465 } 2466 2467 migrate_set_parameter_int(to2, "multifd-channels", 16); 2468 2469 migrate_set_capability(to2, "multifd", true); 2470 2471 /* Start incoming migration from the 1st socket */ 2472 qtest_qmp_assert_success(to2, "{ 'execute': 'migrate-incoming'," 2473 " 'arguments': { 'uri': 'tcp:127.0.0.1:0' }}"); 2474 2475 g_free(uri); 2476 uri = migrate_get_socket_address(to2, "socket-address"); 2477 2478 wait_for_migration_status(from, "cancelled", NULL); 2479 2480 migrate_ensure_non_converge(from); 2481 2482 migrate_qmp(from, uri, "{}"); 2483 2484 migrate_wait_for_dirty_mem(from, to); 2485 2486 migrate_ensure_converge(from); 2487 2488 if (!got_src_stop) { 2489 qtest_qmp_eventwait(from, "STOP"); 2490 } 2491 qtest_qmp_eventwait(to2, "RESUME"); 2492 2493 wait_for_serial("dest_serial"); 2494 wait_for_migration_complete(from); 2495 test_migrate_end(from, to2, true); 2496 } 2497 2498 static void calc_dirty_rate(QTestState *who, uint64_t calc_time) 2499 { 2500 qtest_qmp_assert_success(who, 2501 "{ 'execute': 'calc-dirty-rate'," 2502 "'arguments': { " 2503 "'calc-time': %" PRIu64 "," 2504 "'mode': 'dirty-ring' }}", 2505 calc_time); 2506 } 2507 2508 static QDict *query_dirty_rate(QTestState *who) 2509 { 2510 return qtest_qmp_assert_success_ref(who, 2511 "{ 'execute': 'query-dirty-rate' }"); 2512 } 2513 2514 static void dirtylimit_set_all(QTestState *who, uint64_t dirtyrate) 2515 { 2516 qtest_qmp_assert_success(who, 2517 "{ 'execute': 'set-vcpu-dirty-limit'," 2518 "'arguments': { " 2519 "'dirty-rate': %" PRIu64 " } }", 2520 dirtyrate); 2521 } 2522 2523 static void cancel_vcpu_dirty_limit(QTestState *who) 2524 { 2525 qtest_qmp_assert_success(who, 2526 "{ 'execute': 'cancel-vcpu-dirty-limit' }"); 2527 } 2528 2529 static QDict *query_vcpu_dirty_limit(QTestState *who) 2530 { 2531 QDict *rsp; 2532 2533 rsp = qtest_qmp(who, "{ 'execute': 'query-vcpu-dirty-limit' }"); 2534 g_assert(!qdict_haskey(rsp, "error")); 2535 g_assert(qdict_haskey(rsp, "return")); 2536 2537 return rsp; 2538 } 2539 2540 static bool calc_dirtyrate_ready(QTestState *who) 2541 { 2542 QDict *rsp_return; 2543 gchar *status; 2544 2545 rsp_return = query_dirty_rate(who); 2546 g_assert(rsp_return); 2547 2548 status = g_strdup(qdict_get_str(rsp_return, "status")); 2549 g_assert(status); 2550 2551 return g_strcmp0(status, "measuring"); 2552 } 2553 2554 static void wait_for_calc_dirtyrate_complete(QTestState *who, 2555 int64_t time_s) 2556 { 2557 int max_try_count = 10000; 2558 usleep(time_s * 1000000); 2559 2560 while (!calc_dirtyrate_ready(who) && max_try_count--) { 2561 usleep(1000); 2562 } 2563 2564 /* 2565 * Set the timeout with 10 s(max_try_count * 1000us), 2566 * if dirtyrate measurement not complete, fail test. 2567 */ 2568 g_assert_cmpint(max_try_count, !=, 0); 2569 } 2570 2571 static int64_t get_dirty_rate(QTestState *who) 2572 { 2573 QDict *rsp_return; 2574 gchar *status; 2575 QList *rates; 2576 const QListEntry *entry; 2577 QDict *rate; 2578 int64_t dirtyrate; 2579 2580 rsp_return = query_dirty_rate(who); 2581 g_assert(rsp_return); 2582 2583 status = g_strdup(qdict_get_str(rsp_return, "status")); 2584 g_assert(status); 2585 g_assert_cmpstr(status, ==, "measured"); 2586 2587 rates = qdict_get_qlist(rsp_return, "vcpu-dirty-rate"); 2588 g_assert(rates && !qlist_empty(rates)); 2589 2590 entry = qlist_first(rates); 2591 g_assert(entry); 2592 2593 rate = qobject_to(QDict, qlist_entry_obj(entry)); 2594 g_assert(rate); 2595 2596 dirtyrate = qdict_get_try_int(rate, "dirty-rate", -1); 2597 2598 qobject_unref(rsp_return); 2599 return dirtyrate; 2600 } 2601 2602 static int64_t get_limit_rate(QTestState *who) 2603 { 2604 QDict *rsp_return; 2605 QList *rates; 2606 const QListEntry *entry; 2607 QDict *rate; 2608 int64_t dirtyrate; 2609 2610 rsp_return = query_vcpu_dirty_limit(who); 2611 g_assert(rsp_return); 2612 2613 rates = qdict_get_qlist(rsp_return, "return"); 2614 g_assert(rates && !qlist_empty(rates)); 2615 2616 entry = qlist_first(rates); 2617 g_assert(entry); 2618 2619 rate = qobject_to(QDict, qlist_entry_obj(entry)); 2620 g_assert(rate); 2621 2622 dirtyrate = qdict_get_try_int(rate, "limit-rate", -1); 2623 2624 qobject_unref(rsp_return); 2625 return dirtyrate; 2626 } 2627 2628 static QTestState *dirtylimit_start_vm(void) 2629 { 2630 QTestState *vm = NULL; 2631 g_autofree gchar *cmd = NULL; 2632 const char *arch = qtest_get_arch(); 2633 g_autofree char *bootpath = NULL; 2634 2635 assert((strcmp(arch, "x86_64") == 0)); 2636 bootpath = g_strdup_printf("%s/bootsect", tmpfs); 2637 assert(sizeof(x86_bootsect) == 512); 2638 init_bootfile(bootpath, x86_bootsect, sizeof(x86_bootsect)); 2639 2640 cmd = g_strdup_printf("-accel kvm,dirty-ring-size=4096 " 2641 "-name dirtylimit-test,debug-threads=on " 2642 "-m 150M -smp 1 " 2643 "-serial file:%s/vm_serial " 2644 "-drive file=%s,format=raw ", 2645 tmpfs, bootpath); 2646 2647 vm = qtest_init(cmd); 2648 return vm; 2649 } 2650 2651 static void dirtylimit_stop_vm(QTestState *vm) 2652 { 2653 qtest_quit(vm); 2654 cleanup("bootsect"); 2655 cleanup("vm_serial"); 2656 } 2657 2658 static void test_vcpu_dirty_limit(void) 2659 { 2660 QTestState *vm; 2661 int64_t origin_rate; 2662 int64_t quota_rate; 2663 int64_t rate ; 2664 int max_try_count = 20; 2665 int hit = 0; 2666 2667 /* Start vm for vcpu dirtylimit test */ 2668 vm = dirtylimit_start_vm(); 2669 2670 /* Wait for the first serial output from the vm*/ 2671 wait_for_serial("vm_serial"); 2672 2673 /* Do dirtyrate measurement with calc time equals 1s */ 2674 calc_dirty_rate(vm, 1); 2675 2676 /* Sleep calc time and wait for calc dirtyrate complete */ 2677 wait_for_calc_dirtyrate_complete(vm, 1); 2678 2679 /* Query original dirty page rate */ 2680 origin_rate = get_dirty_rate(vm); 2681 2682 /* VM booted from bootsect should dirty memory steadily */ 2683 assert(origin_rate != 0); 2684 2685 /* Setup quota dirty page rate at half of origin */ 2686 quota_rate = origin_rate / 2; 2687 2688 /* Set dirtylimit */ 2689 dirtylimit_set_all(vm, quota_rate); 2690 2691 /* 2692 * Check if set-vcpu-dirty-limit and query-vcpu-dirty-limit 2693 * works literally 2694 */ 2695 g_assert_cmpint(quota_rate, ==, get_limit_rate(vm)); 2696 2697 /* Sleep a bit to check if it take effect */ 2698 usleep(2000000); 2699 2700 /* 2701 * Check if dirtylimit take effect realistically, set the 2702 * timeout with 20 s(max_try_count * 1s), if dirtylimit 2703 * doesn't take effect, fail test. 2704 */ 2705 while (--max_try_count) { 2706 calc_dirty_rate(vm, 1); 2707 wait_for_calc_dirtyrate_complete(vm, 1); 2708 rate = get_dirty_rate(vm); 2709 2710 /* 2711 * Assume hitting if current rate is less 2712 * than quota rate (within accepting error) 2713 */ 2714 if (rate < (quota_rate + DIRTYLIMIT_TOLERANCE_RANGE)) { 2715 hit = 1; 2716 break; 2717 } 2718 } 2719 2720 g_assert_cmpint(hit, ==, 1); 2721 2722 hit = 0; 2723 max_try_count = 20; 2724 2725 /* Check if dirtylimit cancellation take effect */ 2726 cancel_vcpu_dirty_limit(vm); 2727 while (--max_try_count) { 2728 calc_dirty_rate(vm, 1); 2729 wait_for_calc_dirtyrate_complete(vm, 1); 2730 rate = get_dirty_rate(vm); 2731 2732 /* 2733 * Assume dirtylimit be canceled if current rate is 2734 * greater than quota rate (within accepting error) 2735 */ 2736 if (rate > (quota_rate + DIRTYLIMIT_TOLERANCE_RANGE)) { 2737 hit = 1; 2738 break; 2739 } 2740 } 2741 2742 g_assert_cmpint(hit, ==, 1); 2743 dirtylimit_stop_vm(vm); 2744 } 2745 2746 static bool kvm_dirty_ring_supported(void) 2747 { 2748 #if defined(__linux__) && defined(HOST_X86_64) 2749 int ret, kvm_fd = open("/dev/kvm", O_RDONLY); 2750 2751 if (kvm_fd < 0) { 2752 return false; 2753 } 2754 2755 ret = ioctl(kvm_fd, KVM_CHECK_EXTENSION, KVM_CAP_DIRTY_LOG_RING); 2756 close(kvm_fd); 2757 2758 /* We test with 4096 slots */ 2759 if (ret < 4096) { 2760 return false; 2761 } 2762 2763 return true; 2764 #else 2765 return false; 2766 #endif 2767 } 2768 2769 int main(int argc, char **argv) 2770 { 2771 bool has_kvm, has_tcg; 2772 bool has_uffd; 2773 const char *arch; 2774 g_autoptr(GError) err = NULL; 2775 int ret; 2776 2777 g_test_init(&argc, &argv, NULL); 2778 2779 has_kvm = qtest_has_accel("kvm"); 2780 has_tcg = qtest_has_accel("tcg"); 2781 2782 if (!has_tcg && !has_kvm) { 2783 g_test_skip("No KVM or TCG accelerator available"); 2784 return 0; 2785 } 2786 2787 has_uffd = ufd_version_check(); 2788 arch = qtest_get_arch(); 2789 2790 /* 2791 * On ppc64, the test only works with kvm-hv, but not with kvm-pr and TCG 2792 * is touchy due to race conditions on dirty bits (especially on PPC for 2793 * some reason) 2794 */ 2795 if (g_str_equal(arch, "ppc64") && 2796 (!has_kvm || access("/sys/module/kvm_hv", F_OK))) { 2797 g_test_message("Skipping test: kvm_hv not available"); 2798 return g_test_run(); 2799 } 2800 2801 /* 2802 * Similar to ppc64, s390x seems to be touchy with TCG, so disable it 2803 * there until the problems are resolved 2804 */ 2805 if (g_str_equal(arch, "s390x") && !has_kvm) { 2806 g_test_message("Skipping test: s390x host with KVM is required"); 2807 return g_test_run(); 2808 } 2809 2810 tmpfs = g_dir_make_tmp("migration-test-XXXXXX", &err); 2811 if (!tmpfs) { 2812 g_test_message("Can't create temporary directory in %s: %s", 2813 g_get_tmp_dir(), err->message); 2814 } 2815 g_assert(tmpfs); 2816 2817 module_call_init(MODULE_INIT_QOM); 2818 2819 if (has_uffd) { 2820 qtest_add_func("/migration/postcopy/plain", test_postcopy); 2821 qtest_add_func("/migration/postcopy/recovery/plain", 2822 test_postcopy_recovery); 2823 qtest_add_func("/migration/postcopy/preempt/plain", test_postcopy_preempt); 2824 qtest_add_func("/migration/postcopy/preempt/recovery/plain", 2825 test_postcopy_preempt_recovery); 2826 if (getenv("QEMU_TEST_FLAKY_TESTS")) { 2827 qtest_add_func("/migration/postcopy/compress/plain", 2828 test_postcopy_compress); 2829 qtest_add_func("/migration/postcopy/recovery/compress/plain", 2830 test_postcopy_recovery_compress); 2831 } 2832 } 2833 2834 qtest_add_func("/migration/bad_dest", test_baddest); 2835 qtest_add_func("/migration/precopy/unix/plain", test_precopy_unix_plain); 2836 qtest_add_func("/migration/precopy/unix/xbzrle", test_precopy_unix_xbzrle); 2837 /* 2838 * Compression fails from time to time. 2839 * Put test here but don't enable it until everything is fixed. 2840 */ 2841 if (getenv("QEMU_TEST_FLAKY_TESTS")) { 2842 qtest_add_func("/migration/precopy/unix/compress/wait", 2843 test_precopy_unix_compress); 2844 qtest_add_func("/migration/precopy/unix/compress/nowait", 2845 test_precopy_unix_compress_nowait); 2846 } 2847 #ifdef CONFIG_GNUTLS 2848 qtest_add_func("/migration/precopy/unix/tls/psk", 2849 test_precopy_unix_tls_psk); 2850 2851 if (has_uffd) { 2852 /* 2853 * NOTE: psk test is enough for postcopy, as other types of TLS 2854 * channels are tested under precopy. Here what we want to test is the 2855 * general postcopy path that has TLS channel enabled. 2856 */ 2857 qtest_add_func("/migration/postcopy/tls/psk", test_postcopy_tls_psk); 2858 qtest_add_func("/migration/postcopy/recovery/tls/psk", 2859 test_postcopy_recovery_tls_psk); 2860 qtest_add_func("/migration/postcopy/preempt/tls/psk", 2861 test_postcopy_preempt_tls_psk); 2862 qtest_add_func("/migration/postcopy/preempt/recovery/tls/psk", 2863 test_postcopy_preempt_all); 2864 } 2865 #ifdef CONFIG_TASN1 2866 qtest_add_func("/migration/precopy/unix/tls/x509/default-host", 2867 test_precopy_unix_tls_x509_default_host); 2868 qtest_add_func("/migration/precopy/unix/tls/x509/override-host", 2869 test_precopy_unix_tls_x509_override_host); 2870 #endif /* CONFIG_TASN1 */ 2871 #endif /* CONFIG_GNUTLS */ 2872 2873 qtest_add_func("/migration/precopy/tcp/plain", test_precopy_tcp_plain); 2874 2875 qtest_add_func("/migration/precopy/tcp/plain/switchover-ack", 2876 test_precopy_tcp_switchover_ack); 2877 2878 #ifdef CONFIG_GNUTLS 2879 qtest_add_func("/migration/precopy/tcp/tls/psk/match", 2880 test_precopy_tcp_tls_psk_match); 2881 qtest_add_func("/migration/precopy/tcp/tls/psk/mismatch", 2882 test_precopy_tcp_tls_psk_mismatch); 2883 #ifdef CONFIG_TASN1 2884 qtest_add_func("/migration/precopy/tcp/tls/x509/default-host", 2885 test_precopy_tcp_tls_x509_default_host); 2886 qtest_add_func("/migration/precopy/tcp/tls/x509/override-host", 2887 test_precopy_tcp_tls_x509_override_host); 2888 qtest_add_func("/migration/precopy/tcp/tls/x509/mismatch-host", 2889 test_precopy_tcp_tls_x509_mismatch_host); 2890 qtest_add_func("/migration/precopy/tcp/tls/x509/friendly-client", 2891 test_precopy_tcp_tls_x509_friendly_client); 2892 qtest_add_func("/migration/precopy/tcp/tls/x509/hostile-client", 2893 test_precopy_tcp_tls_x509_hostile_client); 2894 qtest_add_func("/migration/precopy/tcp/tls/x509/allow-anon-client", 2895 test_precopy_tcp_tls_x509_allow_anon_client); 2896 qtest_add_func("/migration/precopy/tcp/tls/x509/reject-anon-client", 2897 test_precopy_tcp_tls_x509_reject_anon_client); 2898 #endif /* CONFIG_TASN1 */ 2899 #endif /* CONFIG_GNUTLS */ 2900 2901 /* qtest_add_func("/migration/ignore_shared", test_ignore_shared); */ 2902 #ifndef _WIN32 2903 qtest_add_func("/migration/fd_proto", test_migrate_fd_proto); 2904 #endif 2905 qtest_add_func("/migration/validate_uuid", test_validate_uuid); 2906 qtest_add_func("/migration/validate_uuid_error", test_validate_uuid_error); 2907 qtest_add_func("/migration/validate_uuid_src_not_set", 2908 test_validate_uuid_src_not_set); 2909 qtest_add_func("/migration/validate_uuid_dst_not_set", 2910 test_validate_uuid_dst_not_set); 2911 /* 2912 * See explanation why this test is slow on function definition 2913 */ 2914 if (g_test_slow()) { 2915 qtest_add_func("/migration/auto_converge", test_migrate_auto_converge); 2916 } 2917 qtest_add_func("/migration/multifd/tcp/plain/none", 2918 test_multifd_tcp_none); 2919 /* 2920 * This test is flaky and sometimes fails in CI and otherwise: 2921 * don't run unless user opts in via environment variable. 2922 */ 2923 if (getenv("QEMU_TEST_FLAKY_TESTS")) { 2924 qtest_add_func("/migration/multifd/tcp/plain/cancel", 2925 test_multifd_tcp_cancel); 2926 } 2927 qtest_add_func("/migration/multifd/tcp/plain/zlib", 2928 test_multifd_tcp_zlib); 2929 #ifdef CONFIG_ZSTD 2930 qtest_add_func("/migration/multifd/tcp/plain/zstd", 2931 test_multifd_tcp_zstd); 2932 #endif 2933 #ifdef CONFIG_GNUTLS 2934 qtest_add_func("/migration/multifd/tcp/tls/psk/match", 2935 test_multifd_tcp_tls_psk_match); 2936 qtest_add_func("/migration/multifd/tcp/tls/psk/mismatch", 2937 test_multifd_tcp_tls_psk_mismatch); 2938 #ifdef CONFIG_TASN1 2939 qtest_add_func("/migration/multifd/tcp/tls/x509/default-host", 2940 test_multifd_tcp_tls_x509_default_host); 2941 qtest_add_func("/migration/multifd/tcp/tls/x509/override-host", 2942 test_multifd_tcp_tls_x509_override_host); 2943 qtest_add_func("/migration/multifd/tcp/tls/x509/mismatch-host", 2944 test_multifd_tcp_tls_x509_mismatch_host); 2945 qtest_add_func("/migration/multifd/tcp/tls/x509/allow-anon-client", 2946 test_multifd_tcp_tls_x509_allow_anon_client); 2947 qtest_add_func("/migration/multifd/tcp/tls/x509/reject-anon-client", 2948 test_multifd_tcp_tls_x509_reject_anon_client); 2949 #endif /* CONFIG_TASN1 */ 2950 #endif /* CONFIG_GNUTLS */ 2951 2952 if (g_str_equal(arch, "x86_64") && has_kvm && kvm_dirty_ring_supported()) { 2953 qtest_add_func("/migration/dirty_ring", 2954 test_precopy_unix_dirty_ring); 2955 qtest_add_func("/migration/vcpu_dirty_limit", 2956 test_vcpu_dirty_limit); 2957 } 2958 2959 ret = g_test_run(); 2960 2961 g_assert_cmpint(ret, ==, 0); 2962 2963 ret = rmdir(tmpfs); 2964 if (ret != 0) { 2965 g_test_message("unable to rmdir: path (%s): %s", 2966 tmpfs, strerror(errno)); 2967 } 2968 g_free(tmpfs); 2969 2970 return ret; 2971 } 2972