1
2
3
4
5
6
7
8
9
10
11
12
13
14#ifndef QEMU_MIGRATION_H
15#define QEMU_MIGRATION_H
16
17#include "qapi/qapi-types-migration.h"
18#include "qemu/thread.h"
19#include "exec/cpu-common.h"
20#include "qemu/coroutine_int.h"
21#include "hw/qdev.h"
22#include "io/channel.h"
23#include "net/announce.h"
24
25struct PostcopyBlocktimeContext;
26
27#define MIGRATION_RESUME_ACK_VALUE (1)
28
29
30
31
32
33
34#define CLEAR_BITMAP_SHIFT_MIN 6
35
36
37
38
39#define CLEAR_BITMAP_SHIFT_DEFAULT 18
40
41
42
43
44#define CLEAR_BITMAP_SHIFT_MAX 31
45
46
47struct MigrationIncomingState {
48 QEMUFile *from_src_file;
49
50
51
52
53
54 QemuEvent main_thread_load_event;
55
56
57 AnnounceTimer announce_timer;
58
59 size_t largest_page_size;
60 bool have_fault_thread;
61 QemuThread fault_thread;
62 QemuSemaphore fault_thread_sem;
63
64 bool fault_thread_quit;
65
66 bool have_listen_thread;
67 QemuThread listen_thread;
68 QemuSemaphore listen_thread_sem;
69
70
71 int userfault_fd;
72
73 int userfault_event_fd;
74 QEMUFile *to_src_file;
75 QemuMutex rp_mutex;
76
77 RAMBlock *last_rb;
78 void *postcopy_tmp_page;
79 void *postcopy_tmp_zero_page;
80
81 GArray *postcopy_remote_fds;
82
83 QEMUBH *bh;
84
85 int state;
86
87 bool have_colo_incoming_thread;
88 QemuThread colo_incoming_thread;
89
90 Coroutine *migration_incoming_co;
91 QemuSemaphore colo_incoming_sem;
92
93
94
95
96
97 struct PostcopyBlocktimeContext *blocktime_ctx;
98
99
100 bool postcopy_recover_triggered;
101 QemuSemaphore postcopy_pause_sem_dst;
102 QemuSemaphore postcopy_pause_sem_fault;
103
104
105 SocketAddressList *socket_address_list;
106};
107
108MigrationIncomingState *migration_incoming_get_current(void);
109void migration_incoming_state_destroy(void);
110
111
112
113void fill_destination_postcopy_migration_info(MigrationInfo *info);
114
115#define TYPE_MIGRATION "migration"
116
117#define MIGRATION_CLASS(klass) \
118 OBJECT_CLASS_CHECK(MigrationClass, (klass), TYPE_MIGRATION)
119#define MIGRATION_OBJ(obj) \
120 OBJECT_CHECK(MigrationState, (obj), TYPE_MIGRATION)
121#define MIGRATION_GET_CLASS(obj) \
122 OBJECT_GET_CLASS(MigrationClass, (obj), TYPE_MIGRATION)
123
124typedef struct MigrationClass {
125
126 DeviceClass parent_class;
127} MigrationClass;
128
129struct MigrationState
130{
131
132 DeviceState parent_obj;
133
134
135 size_t bytes_xfer;
136 QemuThread thread;
137 QEMUBH *cleanup_bh;
138 QEMUFile *to_dst_file;
139
140
141
142
143
144 QemuMutex qemu_file_lock;
145
146
147
148
149 QemuSemaphore rate_limit_sem;
150
151
152 uint64_t iteration_initial_pages;
153
154
155 double pages_per_second;
156
157
158 uint64_t iteration_initial_bytes;
159
160 int64_t iteration_start_time;
161
162
163
164
165
166 int64_t threshold_size;
167
168
169 MigrationParameters parameters;
170
171 int state;
172
173
174 struct {
175 QEMUFile *from_dst_file;
176 QemuThread rp_thread;
177 bool error;
178 QemuSemaphore rp_sem;
179 } rp_state;
180
181 double mbps;
182
183 int64_t start_time;
184
185 int64_t total_time;
186
187 int64_t downtime_start;
188 int64_t downtime;
189 int64_t expected_downtime;
190 bool enabled_capabilities[MIGRATION_CAPABILITY__MAX];
191 int64_t setup_time;
192
193
194
195
196
197 bool vm_was_running;
198
199
200 bool start_postcopy;
201
202 bool postcopy_after_devices;
203
204
205 bool migration_thread_running;
206
207
208 bool block_inactive;
209
210
211 QemuSemaphore pause_sem;
212
213
214 QemuSemaphore colo_exit_sem;
215
216
217 QemuSemaphore colo_checkpoint_sem;
218 int64_t colo_checkpoint_time;
219 QEMUTimer *colo_delay_timer;
220
221
222
223 Error *error;
224
225 QemuMutex error_mutex;
226
227
228
229 bool must_remove_block_options;
230
231
232
233
234
235 bool store_global_state;
236
237
238 bool send_configuration;
239
240 bool send_section_footer;
241
242
243 QemuSemaphore postcopy_pause_sem;
244 QemuSemaphore postcopy_pause_rp_sem;
245
246
247
248
249
250
251 bool decompress_error_check;
252
253
254
255
256
257
258
259
260
261 uint8_t clear_bitmap_shift;
262};
263
264void migrate_set_state(int *state, int old_state, int new_state);
265
266void migration_fd_process_incoming(QEMUFile *f);
267void migration_ioc_process_incoming(QIOChannel *ioc, Error **errp);
268void migration_incoming_process(void);
269
270bool migration_has_all_channels(void);
271
272uint64_t migrate_max_downtime(void);
273
274void migrate_set_error(MigrationState *s, const Error *error);
275void migrate_fd_error(MigrationState *s, const Error *error);
276
277void migrate_fd_connect(MigrationState *s, Error *error_in);
278
279bool migration_is_setup_or_active(int state);
280
281void migrate_init(MigrationState *s);
282bool migration_is_blocked(Error **errp);
283
284bool migration_in_postcopy(void);
285MigrationState *migrate_get_current(void);
286
287bool migrate_postcopy(void);
288
289bool migrate_release_ram(void);
290bool migrate_postcopy_ram(void);
291bool migrate_zero_blocks(void);
292bool migrate_dirty_bitmaps(void);
293bool migrate_ignore_shared(void);
294
295bool migrate_auto_converge(void);
296bool migrate_use_multifd(void);
297bool migrate_pause_before_switchover(void);
298int migrate_multifd_channels(void);
299
300int migrate_use_xbzrle(void);
301int64_t migrate_xbzrle_cache_size(void);
302bool migrate_colo_enabled(void);
303
304bool migrate_use_block(void);
305bool migrate_use_block_incremental(void);
306int migrate_max_cpu_throttle(void);
307bool migrate_use_return_path(void);
308
309uint64_t ram_get_total_transferred_pages(void);
310
311bool migrate_use_compression(void);
312int migrate_compress_level(void);
313int migrate_compress_threads(void);
314int migrate_compress_wait_thread(void);
315int migrate_decompress_threads(void);
316bool migrate_use_events(void);
317bool migrate_postcopy_blocktime(void);
318
319
320void migrate_send_rp_shut(MigrationIncomingState *mis,
321 uint32_t value);
322void migrate_send_rp_pong(MigrationIncomingState *mis,
323 uint32_t value);
324int migrate_send_rp_req_pages(MigrationIncomingState *mis, const char* rbname,
325 ram_addr_t start, size_t len);
326void migrate_send_rp_recv_bitmap(MigrationIncomingState *mis,
327 char *block_name);
328void migrate_send_rp_resume_ack(MigrationIncomingState *mis, uint32_t value);
329
330void dirty_bitmap_mig_before_vm_start(void);
331void init_dirty_bitmap_incoming_migration(void);
332void migrate_add_address(SocketAddress *address);
333
334int foreach_not_ignored_block(RAMBlockIterFunc func, void *opaque);
335
336#define qemu_ram_foreach_block \
337 #warning "Use foreach_not_ignored_block in migration code"
338
339void migration_make_urgent_request(void);
340void migration_consume_urgent_request(void);
341
342#endif
343