1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
|
/*
* QTest testcases for postcopy migration
*
* Copyright (c) 2016-2018 Red Hat, Inc. and/or its affiliates
* based on the vhost-user-test.c that is:
* Copyright (c) 2014 Virtual Open Systems Sarl.
*
* This work is licensed under the terms of the GNU GPL, version 2 or later.
* See the COPYING file in the top-level directory.
*
*/
#include "qemu/osdep.h"
#include "libqtest.h"
#include "migration/framework.h"
#include "migration/migration-util.h"
#include "qobject/qlist.h"
#include "qemu/module.h"
#include "qemu/option.h"
#include "qemu/range.h"
#include "qemu/sockets.h"
static void test_postcopy(void)
{
MigrateCommon args = { };
test_postcopy_common(&args);
}
static void test_postcopy_suspend(void)
{
MigrateCommon args = {
.start.suspend_me = true,
};
test_postcopy_common(&args);
}
static void test_postcopy_preempt(void)
{
MigrateCommon args = {
.start = {
.caps[MIGRATION_CAPABILITY_POSTCOPY_PREEMPT] = true,
},
};
test_postcopy_common(&args);
}
static void test_postcopy_recovery(void)
{
MigrateCommon args = { };
test_postcopy_recovery_common(&args);
}
static void test_postcopy_recovery_fail_handshake(void)
{
MigrateCommon args = {
.postcopy_recovery_fail_stage = POSTCOPY_FAIL_RECOVERY,
};
test_postcopy_recovery_common(&args);
}
static void test_postcopy_recovery_fail_reconnect(void)
{
MigrateCommon args = {
.postcopy_recovery_fail_stage = POSTCOPY_FAIL_CHANNEL_ESTABLISH,
};
test_postcopy_recovery_common(&args);
}
static void test_postcopy_preempt_recovery(void)
{
MigrateCommon args = {
.start = {
.caps[MIGRATION_CAPABILITY_POSTCOPY_PREEMPT] = true,
},
};
test_postcopy_recovery_common(&args);
}
static void migration_test_add_postcopy_smoke(MigrationTestEnv *env)
{
if (env->has_uffd) {
migration_test_add("/migration/postcopy/plain", test_postcopy);
migration_test_add("/migration/postcopy/recovery/plain",
test_postcopy_recovery);
migration_test_add("/migration/postcopy/preempt/plain",
test_postcopy_preempt);
}
}
static void test_multifd_postcopy(void)
{
MigrateCommon args = {
.start = {
.caps[MIGRATION_CAPABILITY_MULTIFD] = true,
},
};
test_postcopy_common(&args);
}
static void test_multifd_postcopy_preempt(void)
{
MigrateCommon args = {
.start = {
.caps[MIGRATION_CAPABILITY_MULTIFD] = true,
.caps[MIGRATION_CAPABILITY_POSTCOPY_PREEMPT] = true,
},
};
test_postcopy_common(&args);
}
void migration_test_add_postcopy(MigrationTestEnv *env)
{
migration_test_add_postcopy_smoke(env);
if (!env->full_set) {
return;
}
if (env->has_uffd) {
migration_test_add("/migration/postcopy/preempt/recovery/plain",
test_postcopy_preempt_recovery);
migration_test_add(
"/migration/postcopy/recovery/double-failures/handshake",
test_postcopy_recovery_fail_handshake);
migration_test_add(
"/migration/postcopy/recovery/double-failures/reconnect",
test_postcopy_recovery_fail_reconnect);
migration_test_add("/migration/multifd+postcopy/plain",
test_multifd_postcopy);
migration_test_add("/migration/multifd+postcopy/preempt/plain",
test_multifd_postcopy_preempt);
if (env->is_x86) {
migration_test_add("/migration/postcopy/suspend",
test_postcopy_suspend);
}
}
}
|