| /* | |
| * QTest testcases for postcopy migration | |
| * | |
| * Copyright (c) 2016-2018 Red Hat, Inc. and/or its affiliates | |
| * based on the vhost-user-test.c that is: | |
| * Copyright (c) 2014 Virtual Open Systems Sarl. | |
| * | |
| * This work is licensed under the terms of the GNU GPL, version 2 or later. | |
| * See the COPYING file in the top-level directory. | |
| * | |
| */ | |
| #include "qemu/osdep.h" | |
| #include "libqtest.h" | |
| #include "migration/framework.h" | |
| #include "migration/migration-util.h" | |
| #include "qobject/qlist.h" | |
| #include "qemu/module.h" | |
| #include "qemu/option.h" | |
| #include "qemu/range.h" | |
| #include "qemu/sockets.h" | |
| static void test_postcopy(char *name, MigrateCommon *args) | |
| { | |
| test_postcopy_common(args); | |
| } | |
| static void test_postcopy_suspend(char *name, MigrateCommon *args) | |
| { | |
| args->start.suspend_me = true; | |
| test_postcopy_common(args); | |
| } | |
| static void test_postcopy_preempt(char *name, MigrateCommon *args) | |
| { | |
| args->start.caps[MIGRATION_CAPABILITY_POSTCOPY_PREEMPT] = true; | |
| test_postcopy_common(args); | |
| } | |
| static void test_postcopy_recovery(char *name, MigrateCommon *args) | |
| { | |
| test_postcopy_recovery_common(args, POSTCOPY_FAIL_NONE); | |
| } | |
| static void test_postcopy_recovery_fail_handshake(char *name, | |
| MigrateCommon *args) | |
| { | |
| test_postcopy_recovery_common(args, POSTCOPY_FAIL_RECOVERY); | |
| } | |
| static void test_postcopy_recovery_fail_reconnect(char *name, | |
| MigrateCommon *args) | |
| { | |
| test_postcopy_recovery_common(args, POSTCOPY_FAIL_CHANNEL_ESTABLISH); | |
| } | |
| static void test_postcopy_preempt_recovery(char *name, MigrateCommon *args) | |
| { | |
| args->start.caps[MIGRATION_CAPABILITY_POSTCOPY_PREEMPT] = true; | |
| test_postcopy_recovery_common(args, POSTCOPY_FAIL_NONE); | |
| } | |
| static void migration_test_add_postcopy_smoke(MigrationTestEnv *env) | |
| { | |
| if (env->has_uffd) { | |
| migration_test_add("/migration/postcopy/plain", test_postcopy); | |
| migration_test_add("/migration/postcopy/recovery/plain", | |
| test_postcopy_recovery); | |
| migration_test_add("/migration/postcopy/preempt/plain", | |
| test_postcopy_preempt); | |
| } | |
| } | |
| static void test_multifd_postcopy(char *name, MigrateCommon *args) | |
| { | |
| args->start.caps[MIGRATION_CAPABILITY_MULTIFD] = true; | |
| test_postcopy_common(args); | |
| } | |
| static void test_multifd_postcopy_preempt(char *name, MigrateCommon *args) | |
| { | |
| args->start.caps[MIGRATION_CAPABILITY_MULTIFD] = true; | |
| args->start.caps[MIGRATION_CAPABILITY_POSTCOPY_PREEMPT] = true; | |
| test_postcopy_common(args); | |
| } | |
| static void test_multifd_postcopy_preempt_recovery(char *name, | |
| MigrateCommon *args) | |
| { | |
| args->start.caps[MIGRATION_CAPABILITY_MULTIFD] = true; | |
| args->start.caps[MIGRATION_CAPABILITY_POSTCOPY_PREEMPT] = true; | |
| test_postcopy_recovery_common(args, POSTCOPY_FAIL_NONE); | |
| } | |
| void migration_test_add_postcopy(MigrationTestEnv *env) | |
| { | |
| migration_test_add_postcopy_smoke(env); | |
| if (!env->full_set) { | |
| return; | |
| } | |
| if (env->has_uffd) { | |
| migration_test_add("/migration/postcopy/preempt/recovery/plain", | |
| test_postcopy_preempt_recovery); | |
| migration_test_add( | |
| "/migration/postcopy/recovery/double-failures/handshake", | |
| test_postcopy_recovery_fail_handshake); | |
| migration_test_add( | |
| "/migration/postcopy/recovery/double-failures/reconnect", | |
| test_postcopy_recovery_fail_reconnect); | |
| migration_test_add("/migration/multifd+postcopy/plain", | |
| test_multifd_postcopy); | |
| migration_test_add("/migration/multifd+postcopy/preempt/plain", | |
| test_multifd_postcopy_preempt); | |
| migration_test_add("/migration/multifd+postcopy/preempt/recovery/plain", | |
| test_multifd_postcopy_preempt_recovery); | |
| if (env->is_x86) { | |
| migration_test_add("/migration/postcopy/suspend", | |
| test_postcopy_suspend); | |
| } | |
| } | |
| } |