Statistics
| Branch: | Revision:

root / migration.c @ 216db403

History | View | Annotate | Download (19.7 kB)

1 5bb7910a aliguori
/*
2 5bb7910a aliguori
 * QEMU live migration
3 5bb7910a aliguori
 *
4 5bb7910a aliguori
 * Copyright IBM, Corp. 2008
5 5bb7910a aliguori
 *
6 5bb7910a aliguori
 * Authors:
7 5bb7910a aliguori
 *  Anthony Liguori   <aliguori@us.ibm.com>
8 5bb7910a aliguori
 *
9 5bb7910a aliguori
 * This work is licensed under the terms of the GNU GPL, version 2.  See
10 5bb7910a aliguori
 * the COPYING file in the top-level directory.
11 5bb7910a aliguori
 *
12 6b620ca3 Paolo Bonzini
 * Contributions after 2012-01-13 are licensed under the terms of the
13 6b620ca3 Paolo Bonzini
 * GNU GPL, version 2 or (at your option) any later version.
14 5bb7910a aliguori
 */
15 5bb7910a aliguori
16 5bb7910a aliguori
#include "qemu-common.h"
17 6a1751b7 Alex Bligh
#include "qemu/main-loop.h"
18 caf71f86 Paolo Bonzini
#include "migration/migration.h"
19 83c9089e Paolo Bonzini
#include "monitor/monitor.h"
20 0d82d0e8 Juan Quintela
#include "migration/qemu-file.h"
21 9c17d615 Paolo Bonzini
#include "sysemu/sysemu.h"
22 737e150e Paolo Bonzini
#include "block/block.h"
23 1de7afc9 Paolo Bonzini
#include "qemu/sockets.h"
24 caf71f86 Paolo Bonzini
#include "migration/block.h"
25 766bd176 Juan Quintela
#include "qemu/thread.h"
26 791e7c82 Luiz Capitulino
#include "qmp-commands.h"
27 c09e5bb1 Kazuya Saito
#include "trace.h"
28 065e2813 aliguori
29 065e2813 aliguori
//#define DEBUG_MIGRATION
30 065e2813 aliguori
31 065e2813 aliguori
#ifdef DEBUG_MIGRATION
32 d0f2c4c6 malc
#define DPRINTF(fmt, ...) \
33 065e2813 aliguori
    do { printf("migration: " fmt, ## __VA_ARGS__); } while (0)
34 065e2813 aliguori
#else
35 d0f2c4c6 malc
#define DPRINTF(fmt, ...) \
36 065e2813 aliguori
    do { } while (0)
37 065e2813 aliguori
#endif
38 5bb7910a aliguori
39 7dc688ed Juan Quintela
enum {
40 29ae8a41 Michael R. Hines
    MIG_STATE_ERROR = -1,
41 29ae8a41 Michael R. Hines
    MIG_STATE_NONE,
42 7dc688ed Juan Quintela
    MIG_STATE_SETUP,
43 51cf4c1a Zhanghaoyu (A)
    MIG_STATE_CANCELLING,
44 7dc688ed Juan Quintela
    MIG_STATE_CANCELLED,
45 7dc688ed Juan Quintela
    MIG_STATE_ACTIVE,
46 7dc688ed Juan Quintela
    MIG_STATE_COMPLETED,
47 7dc688ed Juan Quintela
};
48 5bb7910a aliguori
49 d0ae46c1 Juan Quintela
#define MAX_THROTTLE  (32 << 20)      /* Migration speed throttling */
50 5bb7910a aliguori
51 5b4e1eb7 Juan Quintela
/* Amount of time to allocate to each "chunk" of bandwidth-throttled
52 5b4e1eb7 Juan Quintela
 * data. */
53 5b4e1eb7 Juan Quintela
#define BUFFER_DELAY     100
54 5b4e1eb7 Juan Quintela
#define XFER_LIMIT_RATIO (1000 / BUFFER_DELAY)
55 5b4e1eb7 Juan Quintela
56 17ad9b35 Orit Wasserman
/* Migration XBZRLE default cache size */
57 17ad9b35 Orit Wasserman
#define DEFAULT_MIGRATE_CACHE_SIZE (64 * 1024 * 1024)
58 17ad9b35 Orit Wasserman
59 99a0db9b Gerd Hoffmann
static NotifierList migration_state_notifiers =
60 99a0db9b Gerd Hoffmann
    NOTIFIER_LIST_INITIALIZER(migration_state_notifiers);
61 99a0db9b Gerd Hoffmann
62 17549e84 Juan Quintela
/* When we add fault tolerance, we could have several
63 17549e84 Juan Quintela
   migrations at once.  For now we don't need to add
64 17549e84 Juan Quintela
   dynamic creation of migration */
65 17549e84 Juan Quintela
66 859bc756 Juan Quintela
MigrationState *migrate_get_current(void)
67 17549e84 Juan Quintela
{
68 17549e84 Juan Quintela
    static MigrationState current_migration = {
69 29ae8a41 Michael R. Hines
        .state = MIG_STATE_NONE,
70 d0ae46c1 Juan Quintela
        .bandwidth_limit = MAX_THROTTLE,
71 17ad9b35 Orit Wasserman
        .xbzrle_cache_size = DEFAULT_MIGRATE_CACHE_SIZE,
72 7e114f8c Michael R. Hines
        .mbps = -1,
73 17549e84 Juan Quintela
    };
74 17549e84 Juan Quintela
75 17549e84 Juan Quintela
    return &current_migration;
76 17549e84 Juan Quintela
}
77 17549e84 Juan Quintela
78 43eaae28 Paolo Bonzini
void qemu_start_incoming_migration(const char *uri, Error **errp)
79 5bb7910a aliguori
{
80 34c9dd8e aliguori
    const char *p;
81 34c9dd8e aliguori
82 34c9dd8e aliguori
    if (strstart(uri, "tcp:", &p))
83 43eaae28 Paolo Bonzini
        tcp_start_incoming_migration(p, errp);
84 2da776db Michael R. Hines
#ifdef CONFIG_RDMA
85 2da776db Michael R. Hines
    else if (strstart(uri, "x-rdma:", &p))
86 2da776db Michael R. Hines
        rdma_start_incoming_migration(p, errp);
87 2da776db Michael R. Hines
#endif
88 065e2813 aliguori
#if !defined(WIN32)
89 065e2813 aliguori
    else if (strstart(uri, "exec:", &p))
90 43eaae28 Paolo Bonzini
        exec_start_incoming_migration(p, errp);
91 4951f65b Chris Lalancette
    else if (strstart(uri, "unix:", &p))
92 43eaae28 Paolo Bonzini
        unix_start_incoming_migration(p, errp);
93 5ac1fad3 Paolo Bonzini
    else if (strstart(uri, "fd:", &p))
94 43eaae28 Paolo Bonzini
        fd_start_incoming_migration(p, errp);
95 065e2813 aliguori
#endif
96 8ca5e801 Juan Quintela
    else {
97 312fd5f2 Markus Armbruster
        error_setg(errp, "unknown migration protocol: %s", uri);
98 8ca5e801 Juan Quintela
    }
99 5bb7910a aliguori
}
100 5bb7910a aliguori
101 82a4da79 Paolo Bonzini
static void process_incoming_migration_co(void *opaque)
102 511c0231 Juan Quintela
{
103 82a4da79 Paolo Bonzini
    QEMUFile *f = opaque;
104 1c12e1f5 Paolo Bonzini
    int ret;
105 1c12e1f5 Paolo Bonzini
106 1c12e1f5 Paolo Bonzini
    ret = qemu_loadvm_state(f);
107 1c12e1f5 Paolo Bonzini
    qemu_fclose(f);
108 905f26f2 Gonglei (Arei)
    free_xbzrle_decoded_buf();
109 1c12e1f5 Paolo Bonzini
    if (ret < 0) {
110 511c0231 Juan Quintela
        fprintf(stderr, "load of migration failed\n");
111 4aead692 Eric Blake
        exit(EXIT_FAILURE);
112 511c0231 Juan Quintela
    }
113 511c0231 Juan Quintela
    qemu_announce_self();
114 511c0231 Juan Quintela
    DPRINTF("successfully loaded vm state\n");
115 511c0231 Juan Quintela
116 901862cb Benoît Canet
    bdrv_clear_incoming_migration_all();
117 0f15423c Anthony Liguori
    /* Make sure all file formats flush their mutable metadata */
118 0f15423c Anthony Liguori
    bdrv_invalidate_cache_all();
119 0f15423c Anthony Liguori
120 f5bbfba1 Luiz Capitulino
    if (autostart) {
121 511c0231 Juan Quintela
        vm_start();
122 f5bbfba1 Luiz Capitulino
    } else {
123 29ed72f1 Paolo Bonzini
        runstate_set(RUN_STATE_PAUSED);
124 f5bbfba1 Luiz Capitulino
    }
125 511c0231 Juan Quintela
}
126 511c0231 Juan Quintela
127 82a4da79 Paolo Bonzini
void process_incoming_migration(QEMUFile *f)
128 82a4da79 Paolo Bonzini
{
129 82a4da79 Paolo Bonzini
    Coroutine *co = qemu_coroutine_create(process_incoming_migration_co);
130 82a4da79 Paolo Bonzini
    int fd = qemu_get_fd(f);
131 82a4da79 Paolo Bonzini
132 82a4da79 Paolo Bonzini
    assert(fd != -1);
133 f9e8cacc Stefan Hajnoczi
    qemu_set_nonblock(fd);
134 82a4da79 Paolo Bonzini
    qemu_coroutine_enter(co, f);
135 82a4da79 Paolo Bonzini
}
136 82a4da79 Paolo Bonzini
137 a0a3fd60 Glauber Costa
/* amount of nanoseconds we are willing to wait for migration to be down.
138 a0a3fd60 Glauber Costa
 * the choice of nanoseconds is because it is the maximum resolution that
139 a0a3fd60 Glauber Costa
 * get_clock() can achieve. It is an internal measure. All user-visible
140 a0a3fd60 Glauber Costa
 * units must be in seconds */
141 a0a3fd60 Glauber Costa
static uint64_t max_downtime = 30000000;
142 a0a3fd60 Glauber Costa
143 a0a3fd60 Glauber Costa
uint64_t migrate_max_downtime(void)
144 a0a3fd60 Glauber Costa
{
145 a0a3fd60 Glauber Costa
    return max_downtime;
146 a0a3fd60 Glauber Costa
}
147 a0a3fd60 Glauber Costa
148 bbf6da32 Orit Wasserman
MigrationCapabilityStatusList *qmp_query_migrate_capabilities(Error **errp)
149 bbf6da32 Orit Wasserman
{
150 bbf6da32 Orit Wasserman
    MigrationCapabilityStatusList *head = NULL;
151 bbf6da32 Orit Wasserman
    MigrationCapabilityStatusList *caps;
152 bbf6da32 Orit Wasserman
    MigrationState *s = migrate_get_current();
153 bbf6da32 Orit Wasserman
    int i;
154 bbf6da32 Orit Wasserman
155 387eedeb Michael Tokarev
    caps = NULL; /* silence compiler warning */
156 bbf6da32 Orit Wasserman
    for (i = 0; i < MIGRATION_CAPABILITY_MAX; i++) {
157 bbf6da32 Orit Wasserman
        if (head == NULL) {
158 bbf6da32 Orit Wasserman
            head = g_malloc0(sizeof(*caps));
159 bbf6da32 Orit Wasserman
            caps = head;
160 bbf6da32 Orit Wasserman
        } else {
161 bbf6da32 Orit Wasserman
            caps->next = g_malloc0(sizeof(*caps));
162 bbf6da32 Orit Wasserman
            caps = caps->next;
163 bbf6da32 Orit Wasserman
        }
164 bbf6da32 Orit Wasserman
        caps->value =
165 bbf6da32 Orit Wasserman
            g_malloc(sizeof(*caps->value));
166 bbf6da32 Orit Wasserman
        caps->value->capability = i;
167 bbf6da32 Orit Wasserman
        caps->value->state = s->enabled_capabilities[i];
168 bbf6da32 Orit Wasserman
    }
169 bbf6da32 Orit Wasserman
170 bbf6da32 Orit Wasserman
    return head;
171 bbf6da32 Orit Wasserman
}
172 bbf6da32 Orit Wasserman
173 f36d55af Orit Wasserman
static void get_xbzrle_cache_stats(MigrationInfo *info)
174 f36d55af Orit Wasserman
{
175 f36d55af Orit Wasserman
    if (migrate_use_xbzrle()) {
176 f36d55af Orit Wasserman
        info->has_xbzrle_cache = true;
177 f36d55af Orit Wasserman
        info->xbzrle_cache = g_malloc0(sizeof(*info->xbzrle_cache));
178 f36d55af Orit Wasserman
        info->xbzrle_cache->cache_size = migrate_xbzrle_cache_size();
179 f36d55af Orit Wasserman
        info->xbzrle_cache->bytes = xbzrle_mig_bytes_transferred();
180 f36d55af Orit Wasserman
        info->xbzrle_cache->pages = xbzrle_mig_pages_transferred();
181 f36d55af Orit Wasserman
        info->xbzrle_cache->cache_miss = xbzrle_mig_pages_cache_miss();
182 f36d55af Orit Wasserman
        info->xbzrle_cache->overflow = xbzrle_mig_pages_overflow();
183 f36d55af Orit Wasserman
    }
184 f36d55af Orit Wasserman
}
185 f36d55af Orit Wasserman
186 791e7c82 Luiz Capitulino
MigrationInfo *qmp_query_migrate(Error **errp)
187 5bb7910a aliguori
{
188 791e7c82 Luiz Capitulino
    MigrationInfo *info = g_malloc0(sizeof(*info));
189 17549e84 Juan Quintela
    MigrationState *s = migrate_get_current();
190 17549e84 Juan Quintela
191 17549e84 Juan Quintela
    switch (s->state) {
192 29ae8a41 Michael R. Hines
    case MIG_STATE_NONE:
193 17549e84 Juan Quintela
        /* no migration has happened ever */
194 17549e84 Juan Quintela
        break;
195 29ae8a41 Michael R. Hines
    case MIG_STATE_SETUP:
196 29ae8a41 Michael R. Hines
        info->has_status = true;
197 29ae8a41 Michael R. Hines
        info->status = g_strdup("setup");
198 ed4fbd10 Michael R. Hines
        info->has_total_time = false;
199 29ae8a41 Michael R. Hines
        break;
200 17549e84 Juan Quintela
    case MIG_STATE_ACTIVE:
201 51cf4c1a Zhanghaoyu (A)
    case MIG_STATE_CANCELLING:
202 791e7c82 Luiz Capitulino
        info->has_status = true;
203 791e7c82 Luiz Capitulino
        info->status = g_strdup("active");
204 7aa939af Juan Quintela
        info->has_total_time = true;
205 bc72ad67 Alex Bligh
        info->total_time = qemu_clock_get_ms(QEMU_CLOCK_REALTIME)
206 7aa939af Juan Quintela
            - s->total_time;
207 2c52ddf1 Juan Quintela
        info->has_expected_downtime = true;
208 2c52ddf1 Juan Quintela
        info->expected_downtime = s->expected_downtime;
209 ed4fbd10 Michael R. Hines
        info->has_setup_time = true;
210 ed4fbd10 Michael R. Hines
        info->setup_time = s->setup_time;
211 17549e84 Juan Quintela
212 791e7c82 Luiz Capitulino
        info->has_ram = true;
213 791e7c82 Luiz Capitulino
        info->ram = g_malloc0(sizeof(*info->ram));
214 791e7c82 Luiz Capitulino
        info->ram->transferred = ram_bytes_transferred();
215 791e7c82 Luiz Capitulino
        info->ram->remaining = ram_bytes_remaining();
216 791e7c82 Luiz Capitulino
        info->ram->total = ram_bytes_total();
217 004d4c10 Orit Wasserman
        info->ram->duplicate = dup_mig_pages_transferred();
218 f1c72795 Peter Lieven
        info->ram->skipped = skipped_mig_pages_transferred();
219 004d4c10 Orit Wasserman
        info->ram->normal = norm_mig_pages_transferred();
220 004d4c10 Orit Wasserman
        info->ram->normal_bytes = norm_mig_bytes_transferred();
221 8d017193 Juan Quintela
        info->ram->dirty_pages_rate = s->dirty_pages_rate;
222 7e114f8c Michael R. Hines
        info->ram->mbps = s->mbps;
223 8d017193 Juan Quintela
224 17549e84 Juan Quintela
        if (blk_mig_active()) {
225 791e7c82 Luiz Capitulino
            info->has_disk = true;
226 791e7c82 Luiz Capitulino
            info->disk = g_malloc0(sizeof(*info->disk));
227 791e7c82 Luiz Capitulino
            info->disk->transferred = blk_mig_bytes_transferred();
228 791e7c82 Luiz Capitulino
            info->disk->remaining = blk_mig_bytes_remaining();
229 791e7c82 Luiz Capitulino
            info->disk->total = blk_mig_bytes_total();
230 ff8d81d8 aliguori
        }
231 f36d55af Orit Wasserman
232 f36d55af Orit Wasserman
        get_xbzrle_cache_stats(info);
233 17549e84 Juan Quintela
        break;
234 17549e84 Juan Quintela
    case MIG_STATE_COMPLETED:
235 f36d55af Orit Wasserman
        get_xbzrle_cache_stats(info);
236 f36d55af Orit Wasserman
237 791e7c82 Luiz Capitulino
        info->has_status = true;
238 791e7c82 Luiz Capitulino
        info->status = g_strdup("completed");
239 00c14997 Pawit Pornkitprasan
        info->has_total_time = true;
240 7aa939af Juan Quintela
        info->total_time = s->total_time;
241 9c5a9fcf Juan Quintela
        info->has_downtime = true;
242 9c5a9fcf Juan Quintela
        info->downtime = s->downtime;
243 ed4fbd10 Michael R. Hines
        info->has_setup_time = true;
244 ed4fbd10 Michael R. Hines
        info->setup_time = s->setup_time;
245 d5f8a570 Juan Quintela
246 d5f8a570 Juan Quintela
        info->has_ram = true;
247 d5f8a570 Juan Quintela
        info->ram = g_malloc0(sizeof(*info->ram));
248 d5f8a570 Juan Quintela
        info->ram->transferred = ram_bytes_transferred();
249 d5f8a570 Juan Quintela
        info->ram->remaining = 0;
250 d5f8a570 Juan Quintela
        info->ram->total = ram_bytes_total();
251 004d4c10 Orit Wasserman
        info->ram->duplicate = dup_mig_pages_transferred();
252 f1c72795 Peter Lieven
        info->ram->skipped = skipped_mig_pages_transferred();
253 004d4c10 Orit Wasserman
        info->ram->normal = norm_mig_pages_transferred();
254 004d4c10 Orit Wasserman
        info->ram->normal_bytes = norm_mig_bytes_transferred();
255 7e114f8c Michael R. Hines
        info->ram->mbps = s->mbps;
256 17549e84 Juan Quintela
        break;
257 17549e84 Juan Quintela
    case MIG_STATE_ERROR:
258 791e7c82 Luiz Capitulino
        info->has_status = true;
259 791e7c82 Luiz Capitulino
        info->status = g_strdup("failed");
260 17549e84 Juan Quintela
        break;
261 17549e84 Juan Quintela
    case MIG_STATE_CANCELLED:
262 791e7c82 Luiz Capitulino
        info->has_status = true;
263 791e7c82 Luiz Capitulino
        info->status = g_strdup("cancelled");
264 17549e84 Juan Quintela
        break;
265 5bb7910a aliguori
    }
266 791e7c82 Luiz Capitulino
267 791e7c82 Luiz Capitulino
    return info;
268 5bb7910a aliguori
}
269 5bb7910a aliguori
270 00458433 Orit Wasserman
void qmp_migrate_set_capabilities(MigrationCapabilityStatusList *params,
271 00458433 Orit Wasserman
                                  Error **errp)
272 00458433 Orit Wasserman
{
273 00458433 Orit Wasserman
    MigrationState *s = migrate_get_current();
274 00458433 Orit Wasserman
    MigrationCapabilityStatusList *cap;
275 00458433 Orit Wasserman
276 29ae8a41 Michael R. Hines
    if (s->state == MIG_STATE_ACTIVE || s->state == MIG_STATE_SETUP) {
277 00458433 Orit Wasserman
        error_set(errp, QERR_MIGRATION_ACTIVE);
278 00458433 Orit Wasserman
        return;
279 00458433 Orit Wasserman
    }
280 00458433 Orit Wasserman
281 00458433 Orit Wasserman
    for (cap = params; cap; cap = cap->next) {
282 00458433 Orit Wasserman
        s->enabled_capabilities[cap->value->capability] = cap->value->state;
283 00458433 Orit Wasserman
    }
284 00458433 Orit Wasserman
}
285 00458433 Orit Wasserman
286 065e2813 aliguori
/* shared migration helpers */
287 065e2813 aliguori
288 51cf4c1a Zhanghaoyu (A)
static void migrate_set_state(MigrationState *s, int old_state, int new_state)
289 51cf4c1a Zhanghaoyu (A)
{
290 51cf4c1a Zhanghaoyu (A)
    if (atomic_cmpxchg(&s->state, old_state, new_state) == new_state) {
291 51cf4c1a Zhanghaoyu (A)
        trace_migrate_set_state(new_state);
292 51cf4c1a Zhanghaoyu (A)
    }
293 51cf4c1a Zhanghaoyu (A)
}
294 51cf4c1a Zhanghaoyu (A)
295 bb1fadc4 Paolo Bonzini
static void migrate_fd_cleanup(void *opaque)
296 065e2813 aliguori
{
297 bb1fadc4 Paolo Bonzini
    MigrationState *s = opaque;
298 bb1fadc4 Paolo Bonzini
299 bb1fadc4 Paolo Bonzini
    qemu_bh_delete(s->cleanup_bh);
300 bb1fadc4 Paolo Bonzini
    s->cleanup_bh = NULL;
301 bb1fadc4 Paolo Bonzini
302 065e2813 aliguori
    if (s->file) {
303 d0f2c4c6 malc
        DPRINTF("closing file\n");
304 404a7c05 Paolo Bonzini
        qemu_mutex_unlock_iothread();
305 404a7c05 Paolo Bonzini
        qemu_thread_join(&s->thread);
306 404a7c05 Paolo Bonzini
        qemu_mutex_lock_iothread();
307 404a7c05 Paolo Bonzini
308 6f190a06 Paolo Bonzini
        qemu_fclose(s->file);
309 6f190a06 Paolo Bonzini
        s->file = NULL;
310 065e2813 aliguori
    }
311 065e2813 aliguori
312 a3fa1d78 Paolo Bonzini
    assert(s->state != MIG_STATE_ACTIVE);
313 7a2c1721 Paolo Bonzini
314 a3fa1d78 Paolo Bonzini
    if (s->state != MIG_STATE_COMPLETED) {
315 7a2c1721 Paolo Bonzini
        qemu_savevm_state_cancel();
316 51cf4c1a Zhanghaoyu (A)
        if (s->state == MIG_STATE_CANCELLING) {
317 51cf4c1a Zhanghaoyu (A)
            migrate_set_state(s, MIG_STATE_CANCELLING, MIG_STATE_CANCELLED);
318 51cf4c1a Zhanghaoyu (A)
        }
319 7a2c1721 Paolo Bonzini
    }
320 a3fa1d78 Paolo Bonzini
321 a3fa1d78 Paolo Bonzini
    notifier_list_notify(&migration_state_notifiers, s);
322 065e2813 aliguori
}
323 065e2813 aliguori
324 8b6b99b3 Juan Quintela
void migrate_fd_error(MigrationState *s)
325 065e2813 aliguori
{
326 8b6b99b3 Juan Quintela
    DPRINTF("setting error state\n");
327 bb1fadc4 Paolo Bonzini
    assert(s->file == NULL);
328 bb1fadc4 Paolo Bonzini
    s->state = MIG_STATE_ERROR;
329 bb1fadc4 Paolo Bonzini
    trace_migrate_set_state(MIG_STATE_ERROR);
330 bb1fadc4 Paolo Bonzini
    notifier_list_notify(&migration_state_notifiers, s);
331 458cf28e Juan Quintela
}
332 458cf28e Juan Quintela
333 0edda1c4 Juan Quintela
static void migrate_fd_cancel(MigrationState *s)
334 065e2813 aliguori
{
335 6f2b811a Zhanghaoyu (A)
    int old_state ;
336 d0f2c4c6 malc
    DPRINTF("cancelling migration\n");
337 065e2813 aliguori
338 6f2b811a Zhanghaoyu (A)
    do {
339 6f2b811a Zhanghaoyu (A)
        old_state = s->state;
340 6f2b811a Zhanghaoyu (A)
        if (old_state != MIG_STATE_SETUP && old_state != MIG_STATE_ACTIVE) {
341 6f2b811a Zhanghaoyu (A)
            break;
342 6f2b811a Zhanghaoyu (A)
        }
343 51cf4c1a Zhanghaoyu (A)
        migrate_set_state(s, old_state, MIG_STATE_CANCELLING);
344 51cf4c1a Zhanghaoyu (A)
    } while (s->state != MIG_STATE_CANCELLING);
345 065e2813 aliguori
}
346 065e2813 aliguori
347 99a0db9b Gerd Hoffmann
void add_migration_state_change_notifier(Notifier *notify)
348 99a0db9b Gerd Hoffmann
{
349 99a0db9b Gerd Hoffmann
    notifier_list_add(&migration_state_notifiers, notify);
350 99a0db9b Gerd Hoffmann
}
351 99a0db9b Gerd Hoffmann
352 99a0db9b Gerd Hoffmann
void remove_migration_state_change_notifier(Notifier *notify)
353 99a0db9b Gerd Hoffmann
{
354 31552529 Paolo Bonzini
    notifier_remove(notify);
355 99a0db9b Gerd Hoffmann
}
356 99a0db9b Gerd Hoffmann
357 02edd2e7 Stefan Hajnoczi
bool migration_in_setup(MigrationState *s)
358 afe2df69 Gerd Hoffmann
{
359 02edd2e7 Stefan Hajnoczi
    return s->state == MIG_STATE_SETUP;
360 afe2df69 Gerd Hoffmann
}
361 afe2df69 Gerd Hoffmann
362 7073693b Juan Quintela
bool migration_has_finished(MigrationState *s)
363 99a0db9b Gerd Hoffmann
{
364 7073693b Juan Quintela
    return s->state == MIG_STATE_COMPLETED;
365 99a0db9b Gerd Hoffmann
}
366 0edda1c4 Juan Quintela
367 afe2df69 Gerd Hoffmann
bool migration_has_failed(MigrationState *s)
368 afe2df69 Gerd Hoffmann
{
369 afe2df69 Gerd Hoffmann
    return (s->state == MIG_STATE_CANCELLED ||
370 afe2df69 Gerd Hoffmann
            s->state == MIG_STATE_ERROR);
371 afe2df69 Gerd Hoffmann
}
372 afe2df69 Gerd Hoffmann
373 6607ae23 Isaku Yamahata
static MigrationState *migrate_init(const MigrationParams *params)
374 0edda1c4 Juan Quintela
{
375 17549e84 Juan Quintela
    MigrationState *s = migrate_get_current();
376 d0ae46c1 Juan Quintela
    int64_t bandwidth_limit = s->bandwidth_limit;
377 bbf6da32 Orit Wasserman
    bool enabled_capabilities[MIGRATION_CAPABILITY_MAX];
378 17ad9b35 Orit Wasserman
    int64_t xbzrle_cache_size = s->xbzrle_cache_size;
379 bbf6da32 Orit Wasserman
380 bbf6da32 Orit Wasserman
    memcpy(enabled_capabilities, s->enabled_capabilities,
381 bbf6da32 Orit Wasserman
           sizeof(enabled_capabilities));
382 0edda1c4 Juan Quintela
383 17549e84 Juan Quintela
    memset(s, 0, sizeof(*s));
384 6607ae23 Isaku Yamahata
    s->params = *params;
385 bbf6da32 Orit Wasserman
    memcpy(s->enabled_capabilities, enabled_capabilities,
386 bbf6da32 Orit Wasserman
           sizeof(enabled_capabilities));
387 17ad9b35 Orit Wasserman
    s->xbzrle_cache_size = xbzrle_cache_size;
388 1299c631 Juan Quintela
389 0edda1c4 Juan Quintela
    s->bandwidth_limit = bandwidth_limit;
390 d5934dde Juan Quintela
    s->state = MIG_STATE_SETUP;
391 c09e5bb1 Kazuya Saito
    trace_migrate_set_state(MIG_STATE_SETUP);
392 0edda1c4 Juan Quintela
393 bc72ad67 Alex Bligh
    s->total_time = qemu_clock_get_ms(QEMU_CLOCK_REALTIME);
394 0edda1c4 Juan Quintela
    return s;
395 0edda1c4 Juan Quintela
}
396 cab30143 Juan Quintela
397 fa2756b7 Anthony Liguori
static GSList *migration_blockers;
398 fa2756b7 Anthony Liguori
399 fa2756b7 Anthony Liguori
void migrate_add_blocker(Error *reason)
400 fa2756b7 Anthony Liguori
{
401 fa2756b7 Anthony Liguori
    migration_blockers = g_slist_prepend(migration_blockers, reason);
402 fa2756b7 Anthony Liguori
}
403 fa2756b7 Anthony Liguori
404 fa2756b7 Anthony Liguori
void migrate_del_blocker(Error *reason)
405 fa2756b7 Anthony Liguori
{
406 fa2756b7 Anthony Liguori
    migration_blockers = g_slist_remove(migration_blockers, reason);
407 fa2756b7 Anthony Liguori
}
408 fa2756b7 Anthony Liguori
409 e1c37d0e Luiz Capitulino
void qmp_migrate(const char *uri, bool has_blk, bool blk,
410 e1c37d0e Luiz Capitulino
                 bool has_inc, bool inc, bool has_detach, bool detach,
411 e1c37d0e Luiz Capitulino
                 Error **errp)
412 cab30143 Juan Quintela
{
413 be7059cd Paolo Bonzini
    Error *local_err = NULL;
414 17549e84 Juan Quintela
    MigrationState *s = migrate_get_current();
415 6607ae23 Isaku Yamahata
    MigrationParams params;
416 cab30143 Juan Quintela
    const char *p;
417 cab30143 Juan Quintela
418 8c0426ae Pawit Pornkitprasan
    params.blk = has_blk && blk;
419 8c0426ae Pawit Pornkitprasan
    params.shared = has_inc && inc;
420 6607ae23 Isaku Yamahata
421 51cf4c1a Zhanghaoyu (A)
    if (s->state == MIG_STATE_ACTIVE || s->state == MIG_STATE_SETUP ||
422 51cf4c1a Zhanghaoyu (A)
        s->state == MIG_STATE_CANCELLING) {
423 e1c37d0e Luiz Capitulino
        error_set(errp, QERR_MIGRATION_ACTIVE);
424 e1c37d0e Luiz Capitulino
        return;
425 cab30143 Juan Quintela
    }
426 cab30143 Juan Quintela
427 e1c37d0e Luiz Capitulino
    if (qemu_savevm_state_blocked(errp)) {
428 e1c37d0e Luiz Capitulino
        return;
429 cab30143 Juan Quintela
    }
430 cab30143 Juan Quintela
431 fa2756b7 Anthony Liguori
    if (migration_blockers) {
432 e1c37d0e Luiz Capitulino
        *errp = error_copy(migration_blockers->data);
433 e1c37d0e Luiz Capitulino
        return;
434 fa2756b7 Anthony Liguori
    }
435 fa2756b7 Anthony Liguori
436 6607ae23 Isaku Yamahata
    s = migrate_init(&params);
437 cab30143 Juan Quintela
438 cab30143 Juan Quintela
    if (strstart(uri, "tcp:", &p)) {
439 f37afb5a Paolo Bonzini
        tcp_start_outgoing_migration(s, p, &local_err);
440 2da776db Michael R. Hines
#ifdef CONFIG_RDMA
441 2da776db Michael R. Hines
    } else if (strstart(uri, "x-rdma:", &p)) {
442 2da776db Michael R. Hines
        rdma_start_outgoing_migration(s, p, &local_err);
443 2da776db Michael R. Hines
#endif
444 cab30143 Juan Quintela
#if !defined(WIN32)
445 cab30143 Juan Quintela
    } else if (strstart(uri, "exec:", &p)) {
446 f37afb5a Paolo Bonzini
        exec_start_outgoing_migration(s, p, &local_err);
447 cab30143 Juan Quintela
    } else if (strstart(uri, "unix:", &p)) {
448 f37afb5a Paolo Bonzini
        unix_start_outgoing_migration(s, p, &local_err);
449 cab30143 Juan Quintela
    } else if (strstart(uri, "fd:", &p)) {
450 f37afb5a Paolo Bonzini
        fd_start_outgoing_migration(s, p, &local_err);
451 cab30143 Juan Quintela
#endif
452 99a0db9b Gerd Hoffmann
    } else {
453 e1c37d0e Luiz Capitulino
        error_set(errp, QERR_INVALID_PARAMETER_VALUE, "uri", "a valid migration protocol");
454 c9501142 Luiz Capitulino
        s->state = MIG_STATE_ERROR;
455 e1c37d0e Luiz Capitulino
        return;
456 cab30143 Juan Quintela
    }
457 cab30143 Juan Quintela
458 f37afb5a Paolo Bonzini
    if (local_err) {
459 342ab8d1 Paolo Bonzini
        migrate_fd_error(s);
460 f37afb5a Paolo Bonzini
        error_propagate(errp, local_err);
461 e1c37d0e Luiz Capitulino
        return;
462 1299c631 Juan Quintela
    }
463 cab30143 Juan Quintela
}
464 cab30143 Juan Quintela
465 6cdedb07 Luiz Capitulino
void qmp_migrate_cancel(Error **errp)
466 cab30143 Juan Quintela
{
467 17549e84 Juan Quintela
    migrate_fd_cancel(migrate_get_current());
468 cab30143 Juan Quintela
}
469 cab30143 Juan Quintela
470 9e1ba4cc Orit Wasserman
void qmp_migrate_set_cache_size(int64_t value, Error **errp)
471 9e1ba4cc Orit Wasserman
{
472 9e1ba4cc Orit Wasserman
    MigrationState *s = migrate_get_current();
473 c91e681a Orit Wasserman
    int64_t new_size;
474 9e1ba4cc Orit Wasserman
475 9e1ba4cc Orit Wasserman
    /* Check for truncation */
476 9e1ba4cc Orit Wasserman
    if (value != (size_t)value) {
477 9e1ba4cc Orit Wasserman
        error_set(errp, QERR_INVALID_PARAMETER_VALUE, "cache size",
478 9e1ba4cc Orit Wasserman
                  "exceeding address space");
479 9e1ba4cc Orit Wasserman
        return;
480 9e1ba4cc Orit Wasserman
    }
481 9e1ba4cc Orit Wasserman
482 a5615b14 Orit Wasserman
    /* Cache should not be larger than guest ram size */
483 a5615b14 Orit Wasserman
    if (value > ram_bytes_total()) {
484 a5615b14 Orit Wasserman
        error_set(errp, QERR_INVALID_PARAMETER_VALUE, "cache size",
485 a5615b14 Orit Wasserman
                  "exceeds guest ram size ");
486 a5615b14 Orit Wasserman
        return;
487 a5615b14 Orit Wasserman
    }
488 a5615b14 Orit Wasserman
489 c91e681a Orit Wasserman
    new_size = xbzrle_cache_resize(value);
490 c91e681a Orit Wasserman
    if (new_size < 0) {
491 c91e681a Orit Wasserman
        error_set(errp, QERR_INVALID_PARAMETER_VALUE, "cache size",
492 c91e681a Orit Wasserman
                  "is smaller than page size");
493 c91e681a Orit Wasserman
        return;
494 c91e681a Orit Wasserman
    }
495 c91e681a Orit Wasserman
496 c91e681a Orit Wasserman
    s->xbzrle_cache_size = new_size;
497 9e1ba4cc Orit Wasserman
}
498 9e1ba4cc Orit Wasserman
499 9e1ba4cc Orit Wasserman
int64_t qmp_query_migrate_cache_size(Error **errp)
500 9e1ba4cc Orit Wasserman
{
501 9e1ba4cc Orit Wasserman
    return migrate_xbzrle_cache_size();
502 9e1ba4cc Orit Wasserman
}
503 9e1ba4cc Orit Wasserman
504 3dc85383 Luiz Capitulino
void qmp_migrate_set_speed(int64_t value, Error **errp)
505 cab30143 Juan Quintela
{
506 cab30143 Juan Quintela
    MigrationState *s;
507 cab30143 Juan Quintela
508 3dc85383 Luiz Capitulino
    if (value < 0) {
509 3dc85383 Luiz Capitulino
        value = 0;
510 99a0db9b Gerd Hoffmann
    }
511 442773ce Paolo Bonzini
    if (value > SIZE_MAX) {
512 442773ce Paolo Bonzini
        value = SIZE_MAX;
513 442773ce Paolo Bonzini
    }
514 cab30143 Juan Quintela
515 17549e84 Juan Quintela
    s = migrate_get_current();
516 3dc85383 Luiz Capitulino
    s->bandwidth_limit = value;
517 442773ce Paolo Bonzini
    if (s->file) {
518 442773ce Paolo Bonzini
        qemu_file_set_rate_limit(s->file, s->bandwidth_limit / XFER_LIMIT_RATIO);
519 442773ce Paolo Bonzini
    }
520 cab30143 Juan Quintela
}
521 cab30143 Juan Quintela
522 4f0a993b Luiz Capitulino
void qmp_migrate_set_downtime(double value, Error **errp)
523 cab30143 Juan Quintela
{
524 4f0a993b Luiz Capitulino
    value *= 1e9;
525 4f0a993b Luiz Capitulino
    value = MAX(0, MIN(UINT64_MAX, value));
526 4f0a993b Luiz Capitulino
    max_downtime = (uint64_t)value;
527 99a0db9b Gerd Hoffmann
}
528 17ad9b35 Orit Wasserman
529 60d9222c Michael R. Hines
bool migrate_rdma_pin_all(void)
530 60d9222c Michael R. Hines
{
531 60d9222c Michael R. Hines
    MigrationState *s;
532 60d9222c Michael R. Hines
533 60d9222c Michael R. Hines
    s = migrate_get_current();
534 60d9222c Michael R. Hines
535 60d9222c Michael R. Hines
    return s->enabled_capabilities[MIGRATION_CAPABILITY_X_RDMA_PIN_ALL];
536 60d9222c Michael R. Hines
}
537 60d9222c Michael R. Hines
538 bde1e2ec Chegu Vinod
bool migrate_auto_converge(void)
539 bde1e2ec Chegu Vinod
{
540 bde1e2ec Chegu Vinod
    MigrationState *s;
541 bde1e2ec Chegu Vinod
542 bde1e2ec Chegu Vinod
    s = migrate_get_current();
543 bde1e2ec Chegu Vinod
544 bde1e2ec Chegu Vinod
    return s->enabled_capabilities[MIGRATION_CAPABILITY_AUTO_CONVERGE];
545 bde1e2ec Chegu Vinod
}
546 bde1e2ec Chegu Vinod
547 323004a3 Peter Lieven
bool migrate_zero_blocks(void)
548 323004a3 Peter Lieven
{
549 323004a3 Peter Lieven
    MigrationState *s;
550 323004a3 Peter Lieven
551 323004a3 Peter Lieven
    s = migrate_get_current();
552 323004a3 Peter Lieven
553 323004a3 Peter Lieven
    return s->enabled_capabilities[MIGRATION_CAPABILITY_ZERO_BLOCKS];
554 323004a3 Peter Lieven
}
555 323004a3 Peter Lieven
556 17ad9b35 Orit Wasserman
int migrate_use_xbzrle(void)
557 17ad9b35 Orit Wasserman
{
558 17ad9b35 Orit Wasserman
    MigrationState *s;
559 17ad9b35 Orit Wasserman
560 17ad9b35 Orit Wasserman
    s = migrate_get_current();
561 17ad9b35 Orit Wasserman
562 17ad9b35 Orit Wasserman
    return s->enabled_capabilities[MIGRATION_CAPABILITY_XBZRLE];
563 17ad9b35 Orit Wasserman
}
564 17ad9b35 Orit Wasserman
565 17ad9b35 Orit Wasserman
int64_t migrate_xbzrle_cache_size(void)
566 17ad9b35 Orit Wasserman
{
567 17ad9b35 Orit Wasserman
    MigrationState *s;
568 17ad9b35 Orit Wasserman
569 17ad9b35 Orit Wasserman
    s = migrate_get_current();
570 17ad9b35 Orit Wasserman
571 17ad9b35 Orit Wasserman
    return s->xbzrle_cache_size;
572 17ad9b35 Orit Wasserman
}
573 0d82d0e8 Juan Quintela
574 0d82d0e8 Juan Quintela
/* migration thread support */
575 0d82d0e8 Juan Quintela
576 5f496a1b Juan Quintela
static void *migration_thread(void *opaque)
577 0d82d0e8 Juan Quintela
{
578 9848a404 Juan Quintela
    MigrationState *s = opaque;
579 bc72ad67 Alex Bligh
    int64_t initial_time = qemu_clock_get_ms(QEMU_CLOCK_REALTIME);
580 bc72ad67 Alex Bligh
    int64_t setup_start = qemu_clock_get_ms(QEMU_CLOCK_HOST);
581 be7172e2 Paolo Bonzini
    int64_t initial_bytes = 0;
582 0d82d0e8 Juan Quintela
    int64_t max_size = 0;
583 a3fa1d78 Paolo Bonzini
    int64_t start_time = initial_time;
584 a3fa1d78 Paolo Bonzini
    bool old_vm_running = false;
585 76f5933a Juan Quintela
586 76f5933a Juan Quintela
    DPRINTF("beginning savevm\n");
587 dba433c0 Paolo Bonzini
    qemu_savevm_state_begin(s->file, &s->params);
588 0d82d0e8 Juan Quintela
589 bc72ad67 Alex Bligh
    s->setup_time = qemu_clock_get_ms(QEMU_CLOCK_HOST) - setup_start;
590 29ae8a41 Michael R. Hines
    migrate_set_state(s, MIG_STATE_SETUP, MIG_STATE_ACTIVE);
591 29ae8a41 Michael R. Hines
592 ed4fbd10 Michael R. Hines
    DPRINTF("setup complete\n");
593 ed4fbd10 Michael R. Hines
594 dba433c0 Paolo Bonzini
    while (s->state == MIG_STATE_ACTIVE) {
595 a3e879cd Juan Quintela
        int64_t current_time;
596 c369f40d Juan Quintela
        uint64_t pending_size;
597 0d82d0e8 Juan Quintela
598 a0ff044b Paolo Bonzini
        if (!qemu_file_rate_limit(s->file)) {
599 c369f40d Juan Quintela
            DPRINTF("iterate\n");
600 c369f40d Juan Quintela
            pending_size = qemu_savevm_state_pending(s->file, max_size);
601 5016e2df Christoffer Dall
            DPRINTF("pending size %" PRIu64 " max %" PRIu64 "\n",
602 5016e2df Christoffer Dall
                    pending_size, max_size);
603 b22ff1fb Juan Quintela
            if (pending_size && pending_size >= max_size) {
604 dba433c0 Paolo Bonzini
                qemu_savevm_state_iterate(s->file);
605 c369f40d Juan Quintela
            } else {
606 0e1146a7 Kevin Wolf
                int ret;
607 0e1146a7 Kevin Wolf
608 c369f40d Juan Quintela
                DPRINTF("done iterating\n");
609 32c835ba Paolo Bonzini
                qemu_mutex_lock_iothread();
610 bc72ad67 Alex Bligh
                start_time = qemu_clock_get_ms(QEMU_CLOCK_REALTIME);
611 c369f40d Juan Quintela
                qemu_system_wakeup_request(QEMU_WAKEUP_REASON_OTHER);
612 a3fa1d78 Paolo Bonzini
                old_vm_running = runstate_is_running();
613 0e1146a7 Kevin Wolf
614 0e1146a7 Kevin Wolf
                ret = vm_stop_force_state(RUN_STATE_FINISH_MIGRATE);
615 0e1146a7 Kevin Wolf
                if (ret >= 0) {
616 40596834 Matthew Garrett
                    qemu_file_set_rate_limit(s->file, INT64_MAX);
617 0e1146a7 Kevin Wolf
                    qemu_savevm_state_complete(s->file);
618 0e1146a7 Kevin Wolf
                }
619 32c835ba Paolo Bonzini
                qemu_mutex_unlock_iothread();
620 0e1146a7 Kevin Wolf
621 0e1146a7 Kevin Wolf
                if (ret < 0) {
622 d58f574b Michael R. Hines
                    migrate_set_state(s, MIG_STATE_ACTIVE, MIG_STATE_ERROR);
623 0e1146a7 Kevin Wolf
                    break;
624 0e1146a7 Kevin Wolf
                }
625 0e1146a7 Kevin Wolf
626 059f896c Paolo Bonzini
                if (!qemu_file_get_error(s->file)) {
627 d58f574b Michael R. Hines
                    migrate_set_state(s, MIG_STATE_ACTIVE, MIG_STATE_COMPLETED);
628 059f896c Paolo Bonzini
                    break;
629 059f896c Paolo Bonzini
                }
630 c369f40d Juan Quintela
            }
631 c369f40d Juan Quintela
        }
632 f4410a5d Paolo Bonzini
633 fd45ee2c Paolo Bonzini
        if (qemu_file_get_error(s->file)) {
634 d58f574b Michael R. Hines
            migrate_set_state(s, MIG_STATE_ACTIVE, MIG_STATE_ERROR);
635 fd45ee2c Paolo Bonzini
            break;
636 fd45ee2c Paolo Bonzini
        }
637 bc72ad67 Alex Bligh
        current_time = qemu_clock_get_ms(QEMU_CLOCK_REALTIME);
638 0d82d0e8 Juan Quintela
        if (current_time >= initial_time + BUFFER_DELAY) {
639 be7172e2 Paolo Bonzini
            uint64_t transferred_bytes = qemu_ftell(s->file) - initial_bytes;
640 77417f10 Michael Roth
            uint64_t time_spent = current_time - initial_time;
641 0d82d0e8 Juan Quintela
            double bandwidth = transferred_bytes / time_spent;
642 0d82d0e8 Juan Quintela
            max_size = bandwidth * migrate_max_downtime() / 1000000;
643 0d82d0e8 Juan Quintela
644 7e114f8c Michael R. Hines
            s->mbps = time_spent ? (((double) transferred_bytes * 8.0) /
645 7e114f8c Michael R. Hines
                    ((double) time_spent / 1000.0)) / 1000.0 / 1000.0 : -1;
646 7e114f8c Michael R. Hines
647 0d82d0e8 Juan Quintela
            DPRINTF("transferred %" PRIu64 " time_spent %" PRIu64
648 0d82d0e8 Juan Quintela
                    " bandwidth %g max_size %" PRId64 "\n",
649 0d82d0e8 Juan Quintela
                    transferred_bytes, time_spent, bandwidth, max_size);
650 90f8ae72 Juan Quintela
            /* if we haven't sent anything, we don't want to recalculate
651 90f8ae72 Juan Quintela
               10000 is a small enough number for our purposes */
652 90f8ae72 Juan Quintela
            if (s->dirty_bytes_rate && transferred_bytes > 10000) {
653 90f8ae72 Juan Quintela
                s->expected_downtime = s->dirty_bytes_rate / bandwidth;
654 90f8ae72 Juan Quintela
            }
655 0d82d0e8 Juan Quintela
656 1964a397 Paolo Bonzini
            qemu_file_reset_rate_limit(s->file);
657 0d82d0e8 Juan Quintela
            initial_time = current_time;
658 be7172e2 Paolo Bonzini
            initial_bytes = qemu_ftell(s->file);
659 0d82d0e8 Juan Quintela
        }
660 a0ff044b Paolo Bonzini
        if (qemu_file_rate_limit(s->file)) {
661 0d82d0e8 Juan Quintela
            /* usleep expects microseconds */
662 0d82d0e8 Juan Quintela
            g_usleep((initial_time + BUFFER_DELAY - current_time)*1000);
663 0d82d0e8 Juan Quintela
        }
664 a3fa1d78 Paolo Bonzini
    }
665 a3fa1d78 Paolo Bonzini
666 f4410a5d Paolo Bonzini
    qemu_mutex_lock_iothread();
667 a3fa1d78 Paolo Bonzini
    if (s->state == MIG_STATE_COMPLETED) {
668 bc72ad67 Alex Bligh
        int64_t end_time = qemu_clock_get_ms(QEMU_CLOCK_REALTIME);
669 a3fa1d78 Paolo Bonzini
        s->total_time = end_time - s->total_time;
670 a3fa1d78 Paolo Bonzini
        s->downtime = end_time - start_time;
671 a3fa1d78 Paolo Bonzini
        runstate_set(RUN_STATE_POSTMIGRATE);
672 a3fa1d78 Paolo Bonzini
    } else {
673 a3fa1d78 Paolo Bonzini
        if (old_vm_running) {
674 a3fa1d78 Paolo Bonzini
            vm_start();
675 dba433c0 Paolo Bonzini
        }
676 0d82d0e8 Juan Quintela
    }
677 bb1fadc4 Paolo Bonzini
    qemu_bh_schedule(s->cleanup_bh);
678 dba433c0 Paolo Bonzini
    qemu_mutex_unlock_iothread();
679 f4410a5d Paolo Bonzini
680 0d82d0e8 Juan Quintela
    return NULL;
681 0d82d0e8 Juan Quintela
}
682 0d82d0e8 Juan Quintela
683 9848a404 Juan Quintela
void migrate_fd_connect(MigrationState *s)
684 0d82d0e8 Juan Quintela
{
685 29ae8a41 Michael R. Hines
    s->state = MIG_STATE_SETUP;
686 29ae8a41 Michael R. Hines
    trace_migrate_set_state(MIG_STATE_SETUP);
687 c09e5bb1 Kazuya Saito
688 cc283e3b Juan Quintela
    /* This is a best 1st approximation. ns to ms */
689 cc283e3b Juan Quintela
    s->expected_downtime = max_downtime/1000000;
690 bb1fadc4 Paolo Bonzini
    s->cleanup_bh = qemu_bh_new(migrate_fd_cleanup, s);
691 0d82d0e8 Juan Quintela
692 442773ce Paolo Bonzini
    qemu_file_set_rate_limit(s->file,
693 442773ce Paolo Bonzini
                             s->bandwidth_limit / XFER_LIMIT_RATIO);
694 442773ce Paolo Bonzini
695 9287ac27 Stefan Hajnoczi
    /* Notify before starting migration thread */
696 9287ac27 Stefan Hajnoczi
    notifier_list_notify(&migration_state_notifiers, s);
697 9287ac27 Stefan Hajnoczi
698 5f496a1b Juan Quintela
    qemu_thread_create(&s->thread, migration_thread, s,
699 bb1fadc4 Paolo Bonzini
                       QEMU_THREAD_JOINABLE);
700 0d82d0e8 Juan Quintela
}