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