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 *
migrate_hook_start_precopy_tcp_multifd_zstd(QTestState * from,QTestState * to)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
test_multifd_tcp_zstd(void)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 *
migrate_hook_start_precopy_tcp_multifd_qatzip(QTestState * from,QTestState * to)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
test_multifd_tcp_qatzip(void)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 *
migrate_hook_start_precopy_tcp_multifd_qpl(QTestState * from,QTestState * to)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
test_multifd_tcp_qpl(void)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 *
migrate_hook_start_precopy_tcp_multifd_uadk(QTestState * from,QTestState * to)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
test_multifd_tcp_uadk(void)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 *
migrate_hook_start_xbzrle(QTestState * from,QTestState * to)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
test_precopy_unix_xbzrle(void)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 *
migrate_hook_start_precopy_tcp_multifd_zlib(QTestState * from,QTestState * to)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
test_multifd_tcp_zlib(void)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
migration_test_add_compression_smoke(MigrationTestEnv * env)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
migration_test_add_compression(MigrationTestEnv * env)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