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