/* * QTest testcases for migration compression * * 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-qmp.h" #include "migration/migration-util.h" #include "qemu/module.h" static char *tmpfs; #ifdef CONFIG_ZSTD static void * migrate_hook_start_precopy_tcp_multifd_zstd(QTestState *from, QTestState *to) { migrate_set_parameter_int(from, "multifd-zstd-level", 2); migrate_set_parameter_int(to, "multifd-zstd-level", 2); return migrate_hook_start_precopy_tcp_multifd_common(from, to, "zstd"); } static void test_multifd_tcp_zstd(void) { MigrateCommon args = { .listen_uri = "defer", .start_hook = migrate_hook_start_precopy_tcp_multifd_zstd, }; test_precopy_common(&args); } #endif /* CONFIG_ZSTD */ #ifdef CONFIG_QATZIP static void * migrate_hook_start_precopy_tcp_multifd_qatzip(QTestState *from, QTestState *to) { migrate_set_parameter_int(from, "multifd-qatzip-level", 2); migrate_set_parameter_int(to, "multifd-qatzip-level", 2); return migrate_hook_start_precopy_tcp_multifd_common(from, to, "qatzip"); } static void test_multifd_tcp_qatzip(void) { MigrateCommon args = { .listen_uri = "defer", .start_hook = migrate_hook_start_precopy_tcp_multifd_qatzip, }; test_precopy_common(&args); } #endif #ifdef CONFIG_QPL static void * migrate_hook_start_precopy_tcp_multifd_qpl(QTestState *from, QTestState *to) { return migrate_hook_start_precopy_tcp_multifd_common(from, to, "qpl"); } static void test_multifd_tcp_qpl(void) { MigrateCommon args = { .listen_uri = "defer", .start_hook = migrate_hook_start_precopy_tcp_multifd_qpl, }; test_precopy_common(&args); } #endif /* CONFIG_QPL */ #ifdef CONFIG_UADK static void * migrate_hook_start_precopy_tcp_multifd_uadk(QTestState *from, QTestState *to) { return migrate_hook_start_precopy_tcp_multifd_common(from, to, "uadk"); } static void test_multifd_tcp_uadk(void) { MigrateCommon args = { .listen_uri = "defer", .start_hook = migrate_hook_start_precopy_tcp_multifd_uadk, }; test_precopy_common(&args); } #endif /* CONFIG_UADK */ static void * migrate_hook_start_xbzrle(QTestState *from, QTestState *to) { migrate_set_parameter_int(from, "xbzrle-cache-size", 33554432); migrate_set_capability(from, "xbzrle", true); migrate_set_capability(to, "xbzrle", true); return NULL; } static void test_precopy_unix_xbzrle(void) { g_autofree char *uri = g_strdup_printf("unix:%s/migsocket", tmpfs); MigrateCommon args = { .connect_uri = uri, .listen_uri = uri, .start_hook = migrate_hook_start_xbzrle, .iterations = 2, /* * XBZRLE needs pages to be modified when doing the 2nd+ round * iteration to have real data pushed to the stream. */ .live = true, }; test_precopy_common(&args); } static void * migrate_hook_start_precopy_tcp_multifd_zlib(QTestState *from, QTestState *to) { /* * Overloading this test to also check that set_parameter does not error. * This is also done in the tests for the other compression methods. */ migrate_set_parameter_int(from, "multifd-zlib-level", 2); migrate_set_parameter_int(to, "multifd-zlib-level", 2); return migrate_hook_start_precopy_tcp_multifd_common(from, to, "zlib"); } static void test_multifd_tcp_zlib(void) { MigrateCommon args = { .listen_uri = "defer", .start_hook = migrate_hook_start_precopy_tcp_multifd_zlib, }; test_precopy_common(&args); } static void migration_test_add_compression_smoke(MigrationTestEnv *env) { migration_test_add("/migration/multifd/tcp/plain/zlib", test_multifd_tcp_zlib); } void migration_test_add_compression(MigrationTestEnv *env) { tmpfs = env->tmpfs; migration_test_add_compression_smoke(env); if (!env->full_set) { return; } #ifdef CONFIG_ZSTD migration_test_add("/migration/multifd/tcp/plain/zstd", test_multifd_tcp_zstd); #endif #ifdef CONFIG_QATZIP migration_test_add("/migration/multifd/tcp/plain/qatzip", test_multifd_tcp_qatzip); #endif #ifdef CONFIG_QPL migration_test_add("/migration/multifd/tcp/plain/qpl", test_multifd_tcp_qpl); #endif #ifdef CONFIG_UADK migration_test_add("/migration/multifd/tcp/plain/uadk", test_multifd_tcp_uadk); #endif if (g_test_slow()) { migration_test_add("/migration/precopy/unix/xbzrle", test_precopy_unix_xbzrle); } }