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 static void migration_test_add_compression_smoke(MigrationTestEnv *env) 155 { 156 migration_test_add("/migration/multifd/tcp/plain/zlib", 157 test_multifd_tcp_zlib); 158 } 159 160 void migration_test_add_compression(MigrationTestEnv *env) 161 { 162 tmpfs = env->tmpfs; 163 164 migration_test_add_compression_smoke(env); 165 166 if (!env->full_set) { 167 return; 168 } 169 170 #ifdef CONFIG_ZSTD 171 migration_test_add("/migration/multifd/tcp/plain/zstd", 172 test_multifd_tcp_zstd); 173 #endif 174 175 #ifdef CONFIG_QATZIP 176 migration_test_add("/migration/multifd/tcp/plain/qatzip", 177 test_multifd_tcp_qatzip); 178 #endif 179 180 #ifdef CONFIG_QPL 181 migration_test_add("/migration/multifd/tcp/plain/qpl", 182 test_multifd_tcp_qpl); 183 #endif 184 185 #ifdef CONFIG_UADK 186 migration_test_add("/migration/multifd/tcp/plain/uadk", 187 test_multifd_tcp_uadk); 188 #endif 189 190 if (g_test_slow()) { 191 migration_test_add("/migration/precopy/unix/xbzrle", 192 test_precopy_unix_xbzrle); 193 } 194 } 195