xref: /qemu/tests/qtest/migration/compression-tests.c (revision 70ce076fa6dff60585c229a4b641b13e64bf03cf)
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