1 /* 2 * QTest testcases for migration compression 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 #include "libqtest.h" 15 #include "migration/framework.h" 16 #include "migration/migration-qmp.h" 17 #include "migration/migration-util.h" 18 #include "qemu/module.h" 19 20 21 static char *tmpfs; 22 23 #ifdef CONFIG_ZSTD 24 static void * 25 migrate_hook_start_precopy_tcp_multifd_zstd(QTestState *from, 26 QTestState *to) 27 { 28 migrate_set_parameter_int(from, "multifd-zstd-level", 2); 29 migrate_set_parameter_int(to, "multifd-zstd-level", 2); 30 31 return migrate_hook_start_precopy_tcp_multifd_common(from, to, "zstd"); 32 } 33 34 static void test_multifd_tcp_zstd(void) 35 { 36 MigrateCommon args = { 37 .listen_uri = "defer", 38 .start_hook = migrate_hook_start_precopy_tcp_multifd_zstd, 39 }; 40 test_precopy_common(&args); 41 } 42 #endif /* CONFIG_ZSTD */ 43 44 #ifdef CONFIG_QATZIP 45 static void * 46 migrate_hook_start_precopy_tcp_multifd_qatzip(QTestState *from, 47 QTestState *to) 48 { 49 migrate_set_parameter_int(from, "multifd-qatzip-level", 2); 50 migrate_set_parameter_int(to, "multifd-qatzip-level", 2); 51 52 return migrate_hook_start_precopy_tcp_multifd_common(from, to, "qatzip"); 53 } 54 55 static void test_multifd_tcp_qatzip(void) 56 { 57 MigrateCommon args = { 58 .listen_uri = "defer", 59 .start_hook = migrate_hook_start_precopy_tcp_multifd_qatzip, 60 }; 61 test_precopy_common(&args); 62 } 63 #endif 64 65 #ifdef CONFIG_QPL 66 static void * 67 migrate_hook_start_precopy_tcp_multifd_qpl(QTestState *from, 68 QTestState *to) 69 { 70 return migrate_hook_start_precopy_tcp_multifd_common(from, to, "qpl"); 71 } 72 73 static void test_multifd_tcp_qpl(void) 74 { 75 MigrateCommon args = { 76 .listen_uri = "defer", 77 .start_hook = migrate_hook_start_precopy_tcp_multifd_qpl, 78 }; 79 test_precopy_common(&args); 80 } 81 #endif /* CONFIG_QPL */ 82 83 #ifdef CONFIG_UADK 84 static void * 85 migrate_hook_start_precopy_tcp_multifd_uadk(QTestState *from, 86 QTestState *to) 87 { 88 return migrate_hook_start_precopy_tcp_multifd_common(from, to, "uadk"); 89 } 90 91 static void test_multifd_tcp_uadk(void) 92 { 93 MigrateCommon args = { 94 .listen_uri = "defer", 95 .start_hook = migrate_hook_start_precopy_tcp_multifd_uadk, 96 }; 97 test_precopy_common(&args); 98 } 99 #endif /* CONFIG_UADK */ 100 101 static void * 102 migrate_hook_start_xbzrle(QTestState *from, 103 QTestState *to) 104 { 105 migrate_set_parameter_int(from, "xbzrle-cache-size", 33554432); 106 107 migrate_set_capability(from, "xbzrle", true); 108 migrate_set_capability(to, "xbzrle", true); 109 110 return NULL; 111 } 112 113 static void test_precopy_unix_xbzrle(void) 114 { 115 g_autofree char *uri = g_strdup_printf("unix:%s/migsocket", tmpfs); 116 MigrateCommon args = { 117 .connect_uri = uri, 118 .listen_uri = uri, 119 .start_hook = migrate_hook_start_xbzrle, 120 .iterations = 2, 121 /* 122 * XBZRLE needs pages to be modified when doing the 2nd+ round 123 * iteration to have real data pushed to the stream. 124 */ 125 .live = true, 126 }; 127 128 test_precopy_common(&args); 129 } 130 131 static void * 132 migrate_hook_start_precopy_tcp_multifd_zlib(QTestState *from, 133 QTestState *to) 134 { 135 /* 136 * Overloading this test to also check that set_parameter does not error. 137 * This is also done in the tests for the other compression methods. 138 */ 139 migrate_set_parameter_int(from, "multifd-zlib-level", 2); 140 migrate_set_parameter_int(to, "multifd-zlib-level", 2); 141 142 return migrate_hook_start_precopy_tcp_multifd_common(from, to, "zlib"); 143 } 144 145 static void test_multifd_tcp_zlib(void) 146 { 147 MigrateCommon args = { 148 .listen_uri = "defer", 149 .start_hook = migrate_hook_start_precopy_tcp_multifd_zlib, 150 }; 151 test_precopy_common(&args); 152 } 153 154 void migration_test_add_compression(MigrationTestEnv *env) 155 { 156 tmpfs = env->tmpfs; 157 158 #ifdef CONFIG_ZSTD 159 migration_test_add("/migration/multifd/tcp/plain/zstd", 160 test_multifd_tcp_zstd); 161 #endif 162 163 #ifdef CONFIG_QATZIP 164 migration_test_add("/migration/multifd/tcp/plain/qatzip", 165 test_multifd_tcp_qatzip); 166 #endif 167 168 #ifdef CONFIG_QPL 169 migration_test_add("/migration/multifd/tcp/plain/qpl", 170 test_multifd_tcp_qpl); 171 #endif 172 173 #ifdef CONFIG_UADK 174 migration_test_add("/migration/multifd/tcp/plain/uadk", 175 test_multifd_tcp_uadk); 176 #endif 177 178 if (g_test_slow()) { 179 migration_test_add("/migration/precopy/unix/xbzrle", 180 test_precopy_unix_xbzrle); 181 } 182 183 migration_test_add("/migration/multifd/tcp/plain/zlib", 184 test_multifd_tcp_zlib); 185 } 186