Lines Matching +full:migration +full:- +full:test
2 * QTest testcase for precopy migration
4 * Copyright (c) 2016-2018 Red Hat, Inc. and/or its affiliates
5 * based on the vhost-user-test.c that is:
9 * See the COPYING file in the top-level directory.
17 #include "migration/bootfile.h"
18 #include "migration/framework.h"
19 #include "migration/migration-qmp.h"
20 #include "migration/migration-util.h"
21 #include "ppc-util.h"
23 #include "qapi-types-migration.h"
46 * get-dirty-log dirty tracking. in test_precopy_unix_plain()
61 * despite being live, the test is fast because the src in test_precopy_unix_suspend_live()
93 * Besides the precopy/unix basic test, cover dirty ring interface in test_precopy_unix_dirty_ring()
94 * rather than get-dirty-log. in test_precopy_unix_dirty_ring()
107 * During migration over RDMA, it will try to pin portions of guest memory,
108 * typically exceeding 100MB in this test, while the remainder will be
115 /* check 'ulimit -l' */
133 #define RDMA_MIGRATION_HELPER "scripts/rdma-migration-helper.sh"
146 return -1; in new_rdma_link()
150 while (fgets(buffer + idx, 128 - idx, pipe) != NULL) { in new_rdma_link()
155 if (status == -1) { in new_rdma_link()
157 return -1; in new_rdma_link()
162 return -1; in new_rdma_link()
170 g_test_skip("'ulimit -l' is too small, require >=128M"); in __test_precopy_rdma_plain()
176 "# To enable the test:\n" in __test_precopy_rdma_plain()
178 "setup a new rdma/rxe link and rerun the test\n" in __test_precopy_rdma_plain()
179 "# Optional: run 'scripts/rdma-migration-helper.sh clean' " in __test_precopy_rdma_plain()
243 /* Create two connected sockets for migration */ in migrate_hook_start_fd()
250 " 'arguments': { 'fdname': 'fd-mig' }}"); in migrate_hook_start_fd()
253 /* Start incoming migration from the 1st socket */ in migrate_hook_start_fd()
254 migrate_incoming_qmp(to, "fd:fd-mig", NULL, "{}"); in migrate_hook_start_fd()
259 " 'arguments': { 'fdname': 'fd-mig' }}"); in migrate_hook_start_fd()
272 /* Test closing fds */ in migrate_hook_end_fd()
279 " 'arguments': { 'fdname': 'fd-mig' }}"); in migrate_hook_end_fd()
282 g_assert_cmpstr(error_desc, ==, "File descriptor named 'fd-mig' not found"); in migrate_hook_end_fd()
287 " 'arguments': { 'fdname': 'fd-mig' }}"); in migrate_hook_end_fd()
290 g_assert_cmpstr(error_desc, ==, "File descriptor named 'fd-mig' not found"); in migrate_hook_end_fd()
298 .connect_uri = "fd:fd-mig", in test_precopy_fd_socket()
314 assert(fds[0] != -1); in migrate_hook_start_precopy_fd_file()
317 assert(fds[1] != -1); in migrate_hook_start_precopy_fd_file()
322 " 'arguments': { 'fdname': 'fd-mig' }}"); in migrate_hook_start_precopy_fd_file()
326 " 'arguments': { 'fdname': 'fd-mig' }}"); in migrate_hook_start_precopy_fd_file()
338 .connect_uri = "fd:fd-mig", in test_precopy_fd_file()
348 * run this test. Auto_converge logic is only run once every
351 * - 3 iterations without auto_converge enabled
352 * - 3 iterations with pct = 5
353 * - 3 iterations with pct = 30
354 * - 3 iterations with pct = 55
355 * - 3 iterations with pct = 80
356 * - 3 iterations with pct = 95 (max(95, 80 + 25))
369 * We want the test to be stable and as fast as possible. in test_auto_converge()
370 * E.g., with 1Gb/s bandwidth migration may pass without throttling, in test_auto_converge()
381 migrate_set_capability(from, "auto-converge", true); in test_auto_converge()
382 migrate_set_parameter_int(from, "cpu-throttle-initial", init_pct); in test_auto_converge()
383 migrate_set_parameter_int(from, "cpu-throttle-increment", inc_pct); in test_auto_converge()
384 migrate_set_parameter_int(from, "max-cpu-throttle", max_pct); in test_auto_converge()
387 * Set the initial parameters so that the migration could not converge in test_auto_converge()
393 migrate_set_capability(from, "pause-before-switchover", true); in test_auto_converge()
403 percentage = read_migrate_property_int(from, "cpu-throttle-percentage"); in test_auto_converge()
408 g_assert_false(get_src()->stop_seen); in test_auto_converge()
426 * Note that migrate_ensure_non_converge set the max-bandwidth to 3MB/s, in test_auto_converge()
431 while (--max_try_count) { in test_auto_converge()
446 * Wait for pre-switchover status to check last throttle percentage in test_auto_converge()
449 wait_for_migration_status(from, "pre-switchover", NULL); in test_auto_converge()
452 percentage = read_migrate_property_int(from, "cpu-throttle-percentage"); in test_auto_converge()
454 migrate_continue(from, "pre-switchover"); in test_auto_converge()
476 migrate_set_parameter_str(from, "zero-page-detection", "legacy"); in migrate_hook_start_precopy_tcp_multifd_zero_page_legacy()
485 migrate_set_parameter_str(from, "zero-page-detection", "none"); in migrate_hook_start_precopy_tcp_multifd_no_zero_page()
552 .connect_channels = ("[ { 'channel-type': 'main'," in test_multifd_tcp_channels_none()
562 * This test does:
587 migrate_set_capability(from, "postcopy-ram", true); in test_multifd_tcp_cancel()
588 migrate_set_capability(to, "postcopy-ram", true); in test_multifd_tcp_cancel()
591 migrate_set_parameter_int(from, "multifd-channels", 16); in test_multifd_tcp_cancel()
592 migrate_set_parameter_int(to, "multifd-channels", 16); in test_multifd_tcp_cancel()
597 /* Start incoming migration from the 1st socket */ in test_multifd_tcp_cancel()
616 * proceed with the setup of the next migration. The migrate_start() in test_multifd_tcp_cancel()
618 * is not possible while the migration is not canceled properly. For in test_multifd_tcp_cancel()
619 * example, setting migration capabilities when the migration is still in test_multifd_tcp_cancel()
633 migrate_set_capability(to2, "postcopy-ram", true); in test_multifd_tcp_cancel()
636 migrate_set_parameter_int(to2, "multifd-channels", 16); in test_multifd_tcp_cancel()
640 /* Start incoming migration from the 1st socket */ in test_multifd_tcp_cancel()
685 /* cancelling will not move the migration out of 'failed' */ in test_cancel_src_after_failed()
692 * migration. in test_cancel_src_after_failed()
699 migrate_incoming_qmp(to, uri, NULL, "{ 'exit-on-error': false }"); in test_cancel_src_after_cancelled()
710 /* The migrate_cancel under test */ in test_cancel_src_after_cancelled()
723 migrate_incoming_qmp(to, uri, NULL, "{ 'exit-on-error': false }"); in test_cancel_src_after_complete()
734 * qmp_migrate_cancel() exits early if migration is not running in test_cancel_src_after_complete()
745 * Test that cancelling without a migration happening does not in test_cancel_src_after_none()
753 migrate_incoming_qmp(to, uri, NULL, "{ 'exit-on-error': false }"); in test_cancel_src_after_none()
765 migrate_set_capability(from, "pause-before-switchover", true); in test_cancel_src_pre_switchover()
766 migrate_set_capability(to, "pause-before-switchover", true); in test_cancel_src_pre_switchover()
771 migrate_incoming_qmp(to, uri, NULL, "{ 'exit-on-error': false }"); in test_cancel_src_pre_switchover()
817 /* any state that comes before pre-switchover */ in test_cancel_src_after_status()
827 "{ 'execute': 'calc-dirty-rate'," in calc_dirty_rate()
829 "'calc-time': %" PRIu64 "," in calc_dirty_rate()
830 "'mode': 'dirty-ring' }}", in calc_dirty_rate()
837 "{ 'execute': 'query-dirty-rate' }"); in query_dirty_rate()
843 "{ 'execute': 'set-vcpu-dirty-limit'," in dirtylimit_set_all()
845 "'dirty-rate': %" PRIu64 " } }", in dirtylimit_set_all()
852 "{ 'execute': 'cancel-vcpu-dirty-limit' }"); in cancel_vcpu_dirty_limit()
859 rsp = qtest_qmp(who, "{ 'execute': 'query-vcpu-dirty-limit' }"); in query_vcpu_dirty_limit()
889 while (!calc_dirtyrate_ready(who) && max_try_count--) { in wait_for_calc_dirtyrate_complete()
895 * if dirtyrate measurement not complete, fail test. in wait_for_calc_dirtyrate_complete()
916 rates = qdict_get_qlist(rsp_return, "vcpu-dirty-rate"); in get_dirty_rate()
925 dirtyrate = qdict_get_try_int(rate, "dirty-rate", -1); in get_dirty_rate()
951 dirtyrate = qdict_get_try_int(rate, "limit-rate", -1); in get_limit_rate()
964 cmd = g_strdup_printf("-accel kvm,dirty-ring-size=4096 " in dirtylimit_start_vm()
965 "-name dirtylimit-test,debug-threads=on " in dirtylimit_start_vm()
966 "-m 150M -smp 1 " in dirtylimit_start_vm()
967 "-serial file:%s/vm_serial " in dirtylimit_start_vm()
968 "-drive file=%s,format=raw ", in dirtylimit_start_vm()
992 /* Start vm for vcpu dirtylimit test */ in test_vcpu_dirty_limit()
1017 * Check if set-vcpu-dirty-limit and query-vcpu-dirty-limit in test_vcpu_dirty_limit()
1028 * doesn't take effect, fail test. in test_vcpu_dirty_limit()
1030 while (--max_try_count) { in test_vcpu_dirty_limit()
1052 while (--max_try_count) { in test_vcpu_dirty_limit()
1076 migrate_set_capability(from, "dirty-limit", true); in migrate_dirty_limit_wait_showup()
1079 migrate_set_parameter_int(from, "x-vcpu-dirty-limit-period", period); in migrate_dirty_limit_wait_showup()
1080 migrate_set_parameter_int(from, "vcpu-dirty-limit", value); in migrate_dirty_limit_wait_showup()
1086 migrate_set_capability(from, "pause-before-switchover", true); in migrate_dirty_limit_wait_showup()
1093 * This test does:
1104 * wait pre-switchover event
1107 * And see if dirty limit migration works correctly.
1108 * This test case involves many passes, so it runs in slow mode only.
1117 * We want the test to be stable and as fast as possible. in test_dirty_limit()
1118 * E.g., with 1Gb/s bandwidth migration may pass without dirty limit, in test_dirty_limit()
1125 * We migrate through unix-socket (> 500Mb/s). in test_dirty_limit()
1126 * Thus, expected migration speed ~= bandwidth limit (< 500Mb/s). in test_dirty_limit()
1145 /* Prepare for dirty limit migration and wait src vm show up */ in test_dirty_limit()
1156 "dirty-limit-throttle-time-per-round"); in test_dirty_limit()
1158 g_assert_false(get_src()->stop_seen); in test_dirty_limit()
1174 "dirty-limit-throttle-time-per-round"); in test_dirty_limit()
1176 g_assert_false(get_src()->stop_seen); in test_dirty_limit()
1177 } while (throttle_us_per_full != 0 && --max_try_count); in test_dirty_limit()
1204 "dirty-limit-throttle-time-per-round"); in test_dirty_limit()
1206 g_assert_false(get_src()->stop_seen); in test_dirty_limit()
1211 * query-vcpu-dirty-limit if dirty limit cap set in test_dirty_limit()
1216 migrate_set_parameter_int(from, "downtime-limit", downtime_limit); in test_dirty_limit()
1217 migrate_set_parameter_int(from, "max-bandwidth", max_bandwidth); in test_dirty_limit()
1220 * Wait for pre-switchover status to check if migration in test_dirty_limit()
1223 wait_for_migration_status(from, "pre-switchover", NULL); in test_dirty_limit()
1229 migrate_continue(from, "pre-switchover"); in test_dirty_limit()
1241 if (env->is_x86) { in migration_test_add_precopy_smoke()
1242 migration_test_add("/migration/precopy/unix/suspend/live", in migration_test_add_precopy_smoke()
1244 migration_test_add("/migration/precopy/unix/suspend/notlive", in migration_test_add_precopy_smoke()
1248 migration_test_add("/migration/precopy/unix/plain", in migration_test_add_precopy_smoke()
1251 migration_test_add("/migration/precopy/tcp/plain", test_precopy_tcp_plain); in migration_test_add_precopy_smoke()
1252 migration_test_add("/migration/multifd/tcp/uri/plain/none", in migration_test_add_precopy_smoke()
1254 migration_test_add("/migration/multifd/tcp/plain/cancel", in migration_test_add_precopy_smoke()
1256 if (env->has_uffd) { in migration_test_add_precopy_smoke()
1257 migration_test_add("/migration/multifd+postcopy/tcp/plain/cancel", in migration_test_add_precopy_smoke()
1262 migration_test_add("/migration/precopy/rdma/plain", in migration_test_add_precopy_smoke()
1264 migration_test_add("/migration/precopy/rdma/plain/ipv6", in migration_test_add_precopy_smoke()
1271 tmpfs = env->tmpfs; in migration_test_add_precopy()
1275 if (!env->full_set) { in migration_test_add_precopy()
1279 migration_test_add("/migration/precopy/tcp/plain/switchover-ack", in migration_test_add_precopy()
1283 migration_test_add("/migration/precopy/fd/tcp", in migration_test_add_precopy()
1285 migration_test_add("/migration/precopy/fd/file", in migration_test_add_precopy()
1290 * See explanation why this test is slow on function definition in migration_test_add_precopy()
1293 migration_test_add("/migration/auto_converge", in migration_test_add_precopy()
1295 if (g_str_equal(env->arch, "x86_64") && in migration_test_add_precopy()
1296 env->has_kvm && env->has_dirty_ring) { in migration_test_add_precopy()
1301 migration_test_add("/migration/multifd/tcp/channels/plain/none", in migration_test_add_precopy()
1303 migration_test_add("/migration/multifd/tcp/plain/zero-page/legacy", in migration_test_add_precopy()
1305 migration_test_add("/migration/multifd/tcp/plain/zero-page/none", in migration_test_add_precopy()
1307 if (g_str_equal(env->arch, "x86_64") in migration_test_add_precopy()
1308 && env->has_kvm && env->has_dirty_ring) { in migration_test_add_precopy()
1310 migration_test_add("/migration/dirty_ring", in migration_test_add_precopy()
1313 migration_test_add("/migration/vcpu_dirty_limit", in migration_test_add_precopy()
1332 migration_test_add_suffix("/migration/cancel/src/after/", in migration_test_add_precopy()