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