Lines Matching +full:suspend +full:- +full:to +full:- +full:ram

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.
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()
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,
115 /* check 'ulimit -l' */
133 #define RDMA_MIGRATION_HELPER "scripts/rdma-migration-helper.sh"
145 perror("Failed to run script"); in new_rdma_link()
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()
177 "# Run \'" RDMA_MIGRATION_HELPER " setup\' with root to " in __test_precopy_rdma_plain()
179 "# Optional: run 'scripts/rdma-migration-helper.sh clean' " in __test_precopy_rdma_plain()
180 "to revert the 'setup'"); in __test_precopy_rdma_plain()
227 * Source VM must be running in order to consider the switchover ACK in test_precopy_tcp_switchover_ack()
228 * when deciding to do switchover or not. in test_precopy_tcp_switchover_ack()
238 QTestState *to) in migrate_hook_start_fd() argument
247 /* Send the 1st socket to the target */ in migrate_hook_start_fd()
248 qtest_qmp_fds_assert_success(to, &pair[0], 1, in migrate_hook_start_fd()
250 " 'arguments': { 'fdname': 'fd-mig' }}"); in migrate_hook_start_fd()
254 migrate_incoming_qmp(to, "fd:fd-mig", NULL, "{}"); in migrate_hook_start_fd()
256 /* Send the 2nd socket to the target */ in migrate_hook_start_fd()
259 " 'arguments': { 'fdname': 'fd-mig' }}"); in migrate_hook_start_fd()
266 QTestState *to, in migrate_hook_end_fd() argument
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()
285 rsp = qtest_qmp(to, 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()
306 QTestState *to) in migrate_hook_start_precopy_fd_file() argument
314 assert(fds[0] != -1); in migrate_hook_start_precopy_fd_file()
317 assert(fds[1] != -1); in migrate_hook_start_precopy_fd_file()
320 qtest_qmp_fds_assert_success(to, &fds[0], 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()
347 * The way auto_converge works, we need to do too many passes to
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))
358 * To make things even worse, we need to run the initial stage at
365 QTestState *from, *to; in test_auto_converge() local
369 * We want the test to be stable and as fast as possible. in test_auto_converge()
371 * so we need to decrease a bandwidth. in test_auto_converge()
377 if (migrate_start(&from, &to, uri, &args)) { 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()
392 /* To check remaining size after precopy */ in test_auto_converge()
393 migrate_set_capability(from, "pause-before-switchover", true); in test_auto_converge()
398 migrate_qmp(from, to, uri, NULL, "{}"); 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()
424 * the timeout to 10 seconds to ensure it changes. in test_auto_converge()
426 * Note that migrate_ensure_non_converge set the max-bandwidth to 3MB/s, in test_auto_converge()
428 * to complete; this ensures that the RAMBlock dirty sync occurs. 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()
456 qtest_qmp_eventwait(to, "RESUME"); in test_auto_converge()
461 migrate_end(from, to, true); in test_auto_converge()
466 QTestState *to) in migrate_hook_start_precopy_tcp_multifd() argument
468 return migrate_hook_start_precopy_tcp_multifd_common(from, to, "none"); in migrate_hook_start_precopy_tcp_multifd()
473 QTestState *to) in migrate_hook_start_precopy_tcp_multifd_zero_page_legacy() argument
475 migrate_hook_start_precopy_tcp_multifd_common(from, to, "none"); in migrate_hook_start_precopy_tcp_multifd_zero_page_legacy()
476 migrate_set_parameter_str(from, "zero-page-detection", "legacy"); in migrate_hook_start_precopy_tcp_multifd_zero_page_legacy()
482 QTestState *to) in migrate_hook_start_precopy_tcp_multifd_no_zero_page() argument
484 migrate_hook_start_precopy_tcp_multifd_common(from, to, "none"); in migrate_hook_start_precopy_tcp_multifd_no_zero_page()
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()
577 QTestState *from, *to, *to2; in test_multifd_tcp_cancel() local
579 if (migrate_start(&from, &to, "defer", &args)) { in test_multifd_tcp_cancel()
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()
595 migrate_set_capability(to, "multifd", true); in test_multifd_tcp_cancel()
598 migrate_incoming_qmp(to, "tcp:127.0.0.1:0", NULL, "{}"); in test_multifd_tcp_cancel()
603 migrate_qmp(from, to, NULL, NULL, "{}"); in test_multifd_tcp_cancel()
605 migrate_wait_for_dirty_mem(from, to); in test_multifd_tcp_cancel()
609 /* Make sure QEMU process "to" exited */ in test_multifd_tcp_cancel()
610 qtest_set_expected_status(to, EXIT_FAILURE); in test_multifd_tcp_cancel()
611 qtest_wait_qemu(to); in test_multifd_tcp_cancel()
612 qtest_quit(to); in test_multifd_tcp_cancel()
617 * function and others might want to interact with the source in a way that in test_multifd_tcp_cancel()
620 * running leads to an error. 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()
669 static void test_cancel_src_after_failed(QTestState *from, QTestState *to, in test_cancel_src_after_failed() argument
673 * No migrate_incoming_qmp() at the start to force source into in test_cancel_src_after_failed()
680 migrate_qmp(from, to, uri, NULL, "{}"); in test_cancel_src_after_failed()
696 static void test_cancel_src_after_cancelled(QTestState *from, QTestState *to, in test_cancel_src_after_cancelled() argument
699 migrate_incoming_qmp(to, uri, NULL, "{ 'exit-on-error': false }"); in test_cancel_src_after_cancelled()
704 migrate_qmp(from, to, uri, NULL, "{}"); in test_cancel_src_after_cancelled()
706 /* To move to cancelled/cancelling */ in test_cancel_src_after_cancelled()
716 wait_for_migration_status(to, "failed", in test_cancel_src_after_cancelled()
720 static void test_cancel_src_after_complete(QTestState *from, QTestState *to, in test_cancel_src_after_complete() argument
723 migrate_incoming_qmp(to, uri, NULL, "{ 'exit-on-error': false }"); in test_cancel_src_after_complete()
728 migrate_qmp(from, to, uri, NULL, "{}"); in test_cancel_src_after_complete()
735 * anymore, the status will not change to cancelled. in test_cancel_src_after_complete()
738 wait_for_migration_complete(to); in test_cancel_src_after_complete()
741 static void test_cancel_src_after_none(QTestState *from, QTestState *to, in test_cancel_src_after_none() argument
748 migrate_cancel(to); in test_cancel_src_after_none()
753 migrate_incoming_qmp(to, uri, NULL, "{ 'exit-on-error': false }"); in test_cancel_src_after_none()
756 migrate_qmp(from, to, uri, NULL, "{}"); in test_cancel_src_after_none()
759 wait_for_migration_complete(to); in test_cancel_src_after_none()
762 static void test_cancel_src_pre_switchover(QTestState *from, QTestState *to, in test_cancel_src_pre_switchover() argument
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()
769 migrate_set_capability(to, "multifd", true); in test_cancel_src_pre_switchover()
771 migrate_incoming_qmp(to, uri, NULL, "{ 'exit-on-error': false }"); in test_cancel_src_pre_switchover()
776 migrate_qmp(from, to, uri, NULL, "{}"); in test_cancel_src_pre_switchover()
785 wait_for_migration_status(to, "failed", in test_cancel_src_pre_switchover()
794 QTestState *from, *to; in test_cancel_src_after_status() local
799 if (migrate_start(&from, &to, "defer", &args)) { in test_cancel_src_after_status()
805 test_cancel_src_after_cancelled(from, to, uri, phase); in test_cancel_src_after_status()
808 test_cancel_src_after_complete(from, to, uri, phase); in test_cancel_src_after_status()
811 test_cancel_src_after_failed(from, to, uri, phase); in test_cancel_src_after_status()
814 test_cancel_src_after_none(from, to, uri, phase); in test_cancel_src_after_status()
817 /* any state that comes before pre-switchover */ in test_cancel_src_after_status()
818 test_cancel_src_pre_switchover(from, to, uri, phase); in test_cancel_src_after_status()
821 migrate_end(from, to, false); 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()
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()
1017 * Check if set-vcpu-dirty-limit and query-vcpu-dirty-limit in test_vcpu_dirty_limit()
1022 /* Sleep a bit to check if it take effect */ 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()
1085 /* To check limit rate after precopy */ in migrate_dirty_limit_wait_showup()
1086 migrate_set_capability(from, "pause-before-switchover", true); in migrate_dirty_limit_wait_showup()
1098 * wait dirty limit to begin
1103 * wait dirty limit to begin
1104 * wait pre-switchover event
1113 QTestState *from, *to; in test_dirty_limit() local
1117 * We want the test to be stable and as fast as possible. in test_dirty_limit()
1119 * so we need to decrease a bandwidth. in test_dirty_limit()
1125 * We migrate through unix-socket (> 500Mb/s). in test_dirty_limit()
1141 if (migrate_start(&from, &to, args.listen_uri, &args.start)) { in test_dirty_limit()
1149 migrate_qmp(from, to, args.connect_uri, NULL, "{}"); 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()
1166 migration_event_wait(to, "failed"); in test_dirty_limit()
1167 qtest_set_expected_status(to, EXIT_FAILURE); in test_dirty_limit()
1168 qtest_quit(to); 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()
1192 if (migrate_start(&from, &to, args.listen_uri, &args.start)) { in test_dirty_limit()
1197 migrate_qmp(from, to, args.connect_uri, NULL, "{}"); 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()
1231 qtest_qmp_eventwait(to, "RESUME"); in test_dirty_limit()
1236 migrate_end(from, to, true); 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()
1256 if (env->has_uffd) { 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()
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()
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()