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
25
26struct MigrationIncomingState {
27 QEMUFile *from_src_file;
28
29
30
31
32
33 QemuEvent main_thread_load_event;
34
35 size_t largest_page_size;
36 bool have_fault_thread;
37 QemuThread fault_thread;
38 QemuSemaphore fault_thread_sem;
39
40 bool fault_thread_quit;
41
42 bool have_listen_thread;
43 QemuThread listen_thread;
44 QemuSemaphore listen_thread_sem;
45
46
47 int userfault_fd;
48
49 int userfault_event_fd;
50 QEMUFile *to_src_file;
51 QemuMutex rp_mutex;
52
53 RAMBlock *last_rb;
54 void *postcopy_tmp_page;
55 void *postcopy_tmp_zero_page;
56
57 GArray *postcopy_remote_fds;
58
59 QEMUBH *bh;
60
61 int state;
62
63 bool have_colo_incoming_thread;
64 QemuThread colo_incoming_thread;
65
66 Coroutine *migration_incoming_co;
67 QemuSemaphore colo_incoming_sem;
68};
69
70MigrationIncomingState *migration_incoming_get_current(void);
71void migration_incoming_state_destroy(void);
72
73#define TYPE_MIGRATION "migration"
74
75#define MIGRATION_CLASS(klass) \
76 OBJECT_CLASS_CHECK(MigrationClass, (klass), TYPE_MIGRATION)
77#define MIGRATION_OBJ(obj) \
78 OBJECT_CHECK(MigrationState, (obj), TYPE_MIGRATION)
79#define MIGRATION_GET_CLASS(obj) \
80 OBJECT_GET_CLASS(MigrationClass, (obj), TYPE_MIGRATION)
81
82typedef struct MigrationClass {
83
84 DeviceClass parent_class;
85} MigrationClass;
86
87struct MigrationState
88{
89
90 DeviceState parent_obj;
91
92
93 size_t bytes_xfer;
94 size_t xfer_limit;
95 QemuThread thread;
96 QEMUBH *cleanup_bh;
97 QEMUFile *to_dst_file;
98
99
100 uint64_t iteration_initial_bytes;
101
102 int64_t iteration_start_time;
103
104
105
106
107
108 int64_t threshold_size;
109
110
111 MigrationParameters parameters;
112
113 int state;
114
115
116 struct {
117 QEMUFile *from_dst_file;
118 QemuThread rp_thread;
119 bool error;
120 } rp_state;
121
122 double mbps;
123
124 int64_t start_time;
125
126 int64_t total_time;
127
128 int64_t downtime_start;
129 int64_t downtime;
130 int64_t expected_downtime;
131 bool enabled_capabilities[MIGRATION_CAPABILITY__MAX];
132 int64_t setup_time;
133
134
135
136
137
138 bool vm_was_running;
139
140
141 bool start_postcopy;
142
143 bool postcopy_after_devices;
144
145
146 bool migration_thread_running;
147
148
149 bool block_inactive;
150
151
152 QemuSemaphore pause_sem;
153
154
155 QemuSemaphore colo_exit_sem;
156
157
158 QemuSemaphore colo_checkpoint_sem;
159 int64_t colo_checkpoint_time;
160 QEMUTimer *colo_delay_timer;
161
162
163
164 Error *error;
165
166 QemuMutex error_mutex;
167
168
169
170 bool must_remove_block_options;
171
172
173
174
175
176 bool store_global_state;
177
178
179 bool only_migratable;
180
181
182 bool send_configuration;
183
184 bool send_section_footer;
185};
186
187void migrate_set_state(int *state, int old_state, int new_state);
188
189void migration_fd_process_incoming(QEMUFile *f);
190void migration_ioc_process_incoming(QIOChannel *ioc);
191
192bool migration_has_all_channels(void);
193
194uint64_t migrate_max_downtime(void);
195
196void migrate_set_error(MigrationState *s, const Error *error);
197void migrate_fd_error(MigrationState *s, const Error *error);
198
199void migrate_fd_connect(MigrationState *s, Error *error_in);
200
201void migrate_init(MigrationState *s);
202bool migration_is_blocked(Error **errp);
203
204bool migration_in_postcopy(void);
205MigrationState *migrate_get_current(void);
206
207bool migrate_postcopy(void);
208
209bool migrate_release_ram(void);
210bool migrate_postcopy_ram(void);
211bool migrate_zero_blocks(void);
212bool migrate_dirty_bitmaps(void);
213
214bool migrate_auto_converge(void);
215bool migrate_use_multifd(void);
216bool migrate_pause_before_switchover(void);
217int migrate_multifd_channels(void);
218int migrate_multifd_page_count(void);
219
220int migrate_use_xbzrle(void);
221int64_t migrate_xbzrle_cache_size(void);
222bool migrate_colo_enabled(void);
223
224bool migrate_use_block(void);
225bool migrate_use_block_incremental(void);
226bool migrate_use_return_path(void);
227
228bool migrate_use_compression(void);
229int migrate_compress_level(void);
230int migrate_compress_threads(void);
231int migrate_decompress_threads(void);
232bool migrate_use_events(void);
233
234
235void migrate_send_rp_shut(MigrationIncomingState *mis,
236 uint32_t value);
237void migrate_send_rp_pong(MigrationIncomingState *mis,
238 uint32_t value);
239int migrate_send_rp_req_pages(MigrationIncomingState *mis, const char* rbname,
240 ram_addr_t start, size_t len);
241
242void dirty_bitmap_mig_before_vm_start(void);
243void init_dirty_bitmap_incoming_migration(void);
244
245#endif
246