1932f74f3SFabiano Rosas /*
2932f74f3SFabiano Rosas * QTest testcases for migration compression
3932f74f3SFabiano Rosas *
4932f74f3SFabiano Rosas * Copyright (c) 2016-2018 Red Hat, Inc. and/or its affiliates
5932f74f3SFabiano Rosas * based on the vhost-user-test.c that is:
6932f74f3SFabiano Rosas * Copyright (c) 2014 Virtual Open Systems Sarl.
7932f74f3SFabiano Rosas *
8932f74f3SFabiano Rosas * This work is licensed under the terms of the GNU GPL, version 2 or later.
9932f74f3SFabiano Rosas * See the COPYING file in the top-level directory.
10932f74f3SFabiano Rosas *
11932f74f3SFabiano Rosas */
12932f74f3SFabiano Rosas
13932f74f3SFabiano Rosas #include "qemu/osdep.h"
14932f74f3SFabiano Rosas #include "libqtest.h"
15932f74f3SFabiano Rosas #include "migration/framework.h"
16932f74f3SFabiano Rosas #include "migration/migration-qmp.h"
17932f74f3SFabiano Rosas #include "migration/migration-util.h"
18932f74f3SFabiano Rosas #include "qemu/module.h"
19932f74f3SFabiano Rosas
20932f74f3SFabiano Rosas
21932f74f3SFabiano Rosas static char *tmpfs;
22932f74f3SFabiano Rosas
23932f74f3SFabiano Rosas #ifdef CONFIG_ZSTD
24932f74f3SFabiano Rosas static void *
migrate_hook_start_precopy_tcp_multifd_zstd(QTestState * from,QTestState * to)25932f74f3SFabiano Rosas migrate_hook_start_precopy_tcp_multifd_zstd(QTestState *from,
26932f74f3SFabiano Rosas QTestState *to)
27932f74f3SFabiano Rosas {
28932f74f3SFabiano Rosas migrate_set_parameter_int(from, "multifd-zstd-level", 2);
29932f74f3SFabiano Rosas migrate_set_parameter_int(to, "multifd-zstd-level", 2);
30932f74f3SFabiano Rosas
31932f74f3SFabiano Rosas return migrate_hook_start_precopy_tcp_multifd_common(from, to, "zstd");
32932f74f3SFabiano Rosas }
33932f74f3SFabiano Rosas
test_multifd_tcp_zstd(void)34932f74f3SFabiano Rosas static void test_multifd_tcp_zstd(void)
35932f74f3SFabiano Rosas {
36932f74f3SFabiano Rosas MigrateCommon args = {
37932f74f3SFabiano Rosas .listen_uri = "defer",
38932f74f3SFabiano Rosas .start_hook = migrate_hook_start_precopy_tcp_multifd_zstd,
39932f74f3SFabiano Rosas };
40932f74f3SFabiano Rosas test_precopy_common(&args);
41932f74f3SFabiano Rosas }
42932f74f3SFabiano Rosas #endif /* CONFIG_ZSTD */
43932f74f3SFabiano Rosas
44932f74f3SFabiano Rosas #ifdef CONFIG_QATZIP
45932f74f3SFabiano Rosas static void *
migrate_hook_start_precopy_tcp_multifd_qatzip(QTestState * from,QTestState * to)46932f74f3SFabiano Rosas migrate_hook_start_precopy_tcp_multifd_qatzip(QTestState *from,
47932f74f3SFabiano Rosas QTestState *to)
48932f74f3SFabiano Rosas {
49932f74f3SFabiano Rosas migrate_set_parameter_int(from, "multifd-qatzip-level", 2);
50932f74f3SFabiano Rosas migrate_set_parameter_int(to, "multifd-qatzip-level", 2);
51932f74f3SFabiano Rosas
52932f74f3SFabiano Rosas return migrate_hook_start_precopy_tcp_multifd_common(from, to, "qatzip");
53932f74f3SFabiano Rosas }
54932f74f3SFabiano Rosas
test_multifd_tcp_qatzip(void)55932f74f3SFabiano Rosas static void test_multifd_tcp_qatzip(void)
56932f74f3SFabiano Rosas {
57932f74f3SFabiano Rosas MigrateCommon args = {
58932f74f3SFabiano Rosas .listen_uri = "defer",
59932f74f3SFabiano Rosas .start_hook = migrate_hook_start_precopy_tcp_multifd_qatzip,
60932f74f3SFabiano Rosas };
61932f74f3SFabiano Rosas test_precopy_common(&args);
62932f74f3SFabiano Rosas }
63932f74f3SFabiano Rosas #endif
64932f74f3SFabiano Rosas
65932f74f3SFabiano Rosas #ifdef CONFIG_QPL
66932f74f3SFabiano Rosas static void *
migrate_hook_start_precopy_tcp_multifd_qpl(QTestState * from,QTestState * to)67932f74f3SFabiano Rosas migrate_hook_start_precopy_tcp_multifd_qpl(QTestState *from,
68932f74f3SFabiano Rosas QTestState *to)
69932f74f3SFabiano Rosas {
70932f74f3SFabiano Rosas return migrate_hook_start_precopy_tcp_multifd_common(from, to, "qpl");
71932f74f3SFabiano Rosas }
72932f74f3SFabiano Rosas
test_multifd_tcp_qpl(void)73932f74f3SFabiano Rosas static void test_multifd_tcp_qpl(void)
74932f74f3SFabiano Rosas {
75932f74f3SFabiano Rosas MigrateCommon args = {
76932f74f3SFabiano Rosas .listen_uri = "defer",
77932f74f3SFabiano Rosas .start_hook = migrate_hook_start_precopy_tcp_multifd_qpl,
78932f74f3SFabiano Rosas };
79932f74f3SFabiano Rosas test_precopy_common(&args);
80932f74f3SFabiano Rosas }
81932f74f3SFabiano Rosas #endif /* CONFIG_QPL */
82932f74f3SFabiano Rosas
83932f74f3SFabiano Rosas #ifdef CONFIG_UADK
84932f74f3SFabiano Rosas static void *
migrate_hook_start_precopy_tcp_multifd_uadk(QTestState * from,QTestState * to)85932f74f3SFabiano Rosas migrate_hook_start_precopy_tcp_multifd_uadk(QTestState *from,
86932f74f3SFabiano Rosas QTestState *to)
87932f74f3SFabiano Rosas {
88932f74f3SFabiano Rosas return migrate_hook_start_precopy_tcp_multifd_common(from, to, "uadk");
89932f74f3SFabiano Rosas }
90932f74f3SFabiano Rosas
test_multifd_tcp_uadk(void)91932f74f3SFabiano Rosas static void test_multifd_tcp_uadk(void)
92932f74f3SFabiano Rosas {
93932f74f3SFabiano Rosas MigrateCommon args = {
94932f74f3SFabiano Rosas .listen_uri = "defer",
95932f74f3SFabiano Rosas .start_hook = migrate_hook_start_precopy_tcp_multifd_uadk,
96932f74f3SFabiano Rosas };
97932f74f3SFabiano Rosas test_precopy_common(&args);
98932f74f3SFabiano Rosas }
99932f74f3SFabiano Rosas #endif /* CONFIG_UADK */
100932f74f3SFabiano Rosas
101932f74f3SFabiano Rosas static void *
migrate_hook_start_xbzrle(QTestState * from,QTestState * to)102932f74f3SFabiano Rosas migrate_hook_start_xbzrle(QTestState *from,
103932f74f3SFabiano Rosas QTestState *to)
104932f74f3SFabiano Rosas {
105932f74f3SFabiano Rosas migrate_set_parameter_int(from, "xbzrle-cache-size", 33554432);
106932f74f3SFabiano Rosas
107932f74f3SFabiano Rosas migrate_set_capability(from, "xbzrle", true);
108932f74f3SFabiano Rosas migrate_set_capability(to, "xbzrle", true);
109932f74f3SFabiano Rosas
110932f74f3SFabiano Rosas return NULL;
111932f74f3SFabiano Rosas }
112932f74f3SFabiano Rosas
test_precopy_unix_xbzrle(void)113932f74f3SFabiano Rosas static void test_precopy_unix_xbzrle(void)
114932f74f3SFabiano Rosas {
115932f74f3SFabiano Rosas g_autofree char *uri = g_strdup_printf("unix:%s/migsocket", tmpfs);
116932f74f3SFabiano Rosas MigrateCommon args = {
117932f74f3SFabiano Rosas .connect_uri = uri,
118932f74f3SFabiano Rosas .listen_uri = uri,
119932f74f3SFabiano Rosas .start_hook = migrate_hook_start_xbzrle,
120932f74f3SFabiano Rosas .iterations = 2,
121932f74f3SFabiano Rosas /*
122932f74f3SFabiano Rosas * XBZRLE needs pages to be modified when doing the 2nd+ round
123932f74f3SFabiano Rosas * iteration to have real data pushed to the stream.
124932f74f3SFabiano Rosas */
125932f74f3SFabiano Rosas .live = true,
126932f74f3SFabiano Rosas };
127932f74f3SFabiano Rosas
128932f74f3SFabiano Rosas test_precopy_common(&args);
129932f74f3SFabiano Rosas }
130932f74f3SFabiano Rosas
131932f74f3SFabiano Rosas static void *
migrate_hook_start_precopy_tcp_multifd_zlib(QTestState * from,QTestState * to)132932f74f3SFabiano Rosas migrate_hook_start_precopy_tcp_multifd_zlib(QTestState *from,
133932f74f3SFabiano Rosas QTestState *to)
134932f74f3SFabiano Rosas {
135932f74f3SFabiano Rosas /*
136932f74f3SFabiano Rosas * Overloading this test to also check that set_parameter does not error.
137932f74f3SFabiano Rosas * This is also done in the tests for the other compression methods.
138932f74f3SFabiano Rosas */
139932f74f3SFabiano Rosas migrate_set_parameter_int(from, "multifd-zlib-level", 2);
140932f74f3SFabiano Rosas migrate_set_parameter_int(to, "multifd-zlib-level", 2);
141932f74f3SFabiano Rosas
142932f74f3SFabiano Rosas return migrate_hook_start_precopy_tcp_multifd_common(from, to, "zlib");
143932f74f3SFabiano Rosas }
144932f74f3SFabiano Rosas
test_multifd_tcp_zlib(void)145932f74f3SFabiano Rosas static void test_multifd_tcp_zlib(void)
146932f74f3SFabiano Rosas {
147932f74f3SFabiano Rosas MigrateCommon args = {
148932f74f3SFabiano Rosas .listen_uri = "defer",
149932f74f3SFabiano Rosas .start_hook = migrate_hook_start_precopy_tcp_multifd_zlib,
150932f74f3SFabiano Rosas };
151932f74f3SFabiano Rosas test_precopy_common(&args);
152932f74f3SFabiano Rosas }
153932f74f3SFabiano Rosas
migration_test_add_compression_smoke(MigrationTestEnv * env)154*43ab3fb3SFabiano Rosas static void migration_test_add_compression_smoke(MigrationTestEnv *env)
155*43ab3fb3SFabiano Rosas {
156*43ab3fb3SFabiano Rosas migration_test_add("/migration/multifd/tcp/plain/zlib",
157*43ab3fb3SFabiano Rosas test_multifd_tcp_zlib);
158*43ab3fb3SFabiano Rosas }
159*43ab3fb3SFabiano Rosas
migration_test_add_compression(MigrationTestEnv * env)160932f74f3SFabiano Rosas void migration_test_add_compression(MigrationTestEnv *env)
161932f74f3SFabiano Rosas {
162932f74f3SFabiano Rosas tmpfs = env->tmpfs;
163932f74f3SFabiano Rosas
164*43ab3fb3SFabiano Rosas migration_test_add_compression_smoke(env);
165*43ab3fb3SFabiano Rosas
166bc2a1f1aSFabiano Rosas if (!env->full_set) {
167bc2a1f1aSFabiano Rosas return;
168bc2a1f1aSFabiano Rosas }
169bc2a1f1aSFabiano Rosas
170932f74f3SFabiano Rosas #ifdef CONFIG_ZSTD
171932f74f3SFabiano Rosas migration_test_add("/migration/multifd/tcp/plain/zstd",
172932f74f3SFabiano Rosas test_multifd_tcp_zstd);
173932f74f3SFabiano Rosas #endif
174932f74f3SFabiano Rosas
175932f74f3SFabiano Rosas #ifdef CONFIG_QATZIP
176932f74f3SFabiano Rosas migration_test_add("/migration/multifd/tcp/plain/qatzip",
177932f74f3SFabiano Rosas test_multifd_tcp_qatzip);
178932f74f3SFabiano Rosas #endif
179932f74f3SFabiano Rosas
180932f74f3SFabiano Rosas #ifdef CONFIG_QPL
181932f74f3SFabiano Rosas migration_test_add("/migration/multifd/tcp/plain/qpl",
182932f74f3SFabiano Rosas test_multifd_tcp_qpl);
183932f74f3SFabiano Rosas #endif
184932f74f3SFabiano Rosas
185932f74f3SFabiano Rosas #ifdef CONFIG_UADK
186932f74f3SFabiano Rosas migration_test_add("/migration/multifd/tcp/plain/uadk",
187932f74f3SFabiano Rosas test_multifd_tcp_uadk);
188932f74f3SFabiano Rosas #endif
189932f74f3SFabiano Rosas
190932f74f3SFabiano Rosas if (g_test_slow()) {
191932f74f3SFabiano Rosas migration_test_add("/migration/precopy/unix/xbzrle",
192932f74f3SFabiano Rosas test_precopy_unix_xbzrle);
193932f74f3SFabiano Rosas }
194932f74f3SFabiano Rosas }
195