Statistics
| Branch: | Revision:

root / migration.c @ e659586e

History | View | Annotate | Download (21 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 caf71f86 Paolo Bonzini
#include "migration/migration.h"
18 83c9089e Paolo Bonzini
#include "monitor/monitor.h"
19 0d82d0e8 Juan Quintela
#include "migration/qemu-file.h"
20 9c17d615 Paolo Bonzini
#include "sysemu/sysemu.h"
21 737e150e Paolo Bonzini
#include "block/block.h"
22 1de7afc9 Paolo Bonzini
#include "qemu/sockets.h"
23 caf71f86 Paolo Bonzini
#include "migration/block.h"
24 766bd176 Juan Quintela
#include "qemu/thread.h"
25 791e7c82 Luiz Capitulino
#include "qmp-commands.h"
26 065e2813 aliguori
27 065e2813 aliguori
//#define DEBUG_MIGRATION
28 065e2813 aliguori
29 065e2813 aliguori
#ifdef DEBUG_MIGRATION
30 d0f2c4c6 malc
#define DPRINTF(fmt, ...) \
31 065e2813 aliguori
    do { printf("migration: " fmt, ## __VA_ARGS__); } while (0)
32 065e2813 aliguori
#else
33 d0f2c4c6 malc
#define DPRINTF(fmt, ...) \
34 065e2813 aliguori
    do { } while (0)
35 065e2813 aliguori
#endif
36 5bb7910a aliguori
37 7dc688ed Juan Quintela
enum {
38 7dc688ed Juan Quintela
    MIG_STATE_ERROR,
39 7dc688ed Juan Quintela
    MIG_STATE_SETUP,
40 7dc688ed Juan Quintela
    MIG_STATE_CANCELLED,
41 7dc688ed Juan Quintela
    MIG_STATE_ACTIVE,
42 7dc688ed Juan Quintela
    MIG_STATE_COMPLETED,
43 7dc688ed Juan Quintela
};
44 5bb7910a aliguori
45 d0ae46c1 Juan Quintela
#define MAX_THROTTLE  (32 << 20)      /* Migration speed throttling */
46 5bb7910a aliguori
47 5b4e1eb7 Juan Quintela
/* Amount of time to allocate to each "chunk" of bandwidth-throttled
48 5b4e1eb7 Juan Quintela
 * data. */
49 5b4e1eb7 Juan Quintela
#define BUFFER_DELAY     100
50 5b4e1eb7 Juan Quintela
#define XFER_LIMIT_RATIO (1000 / BUFFER_DELAY)
51 5b4e1eb7 Juan Quintela
52 17ad9b35 Orit Wasserman
/* Migration XBZRLE default cache size */
53 17ad9b35 Orit Wasserman
#define DEFAULT_MIGRATE_CACHE_SIZE (64 * 1024 * 1024)
54 17ad9b35 Orit Wasserman
55 99a0db9b Gerd Hoffmann
static NotifierList migration_state_notifiers =
56 99a0db9b Gerd Hoffmann
    NOTIFIER_LIST_INITIALIZER(migration_state_notifiers);
57 99a0db9b Gerd Hoffmann
58 17549e84 Juan Quintela
/* When we add fault tolerance, we could have several
59 17549e84 Juan Quintela
   migrations at once.  For now we don't need to add
60 17549e84 Juan Quintela
   dynamic creation of migration */
61 17549e84 Juan Quintela
62 859bc756 Juan Quintela
MigrationState *migrate_get_current(void)
63 17549e84 Juan Quintela
{
64 17549e84 Juan Quintela
    static MigrationState current_migration = {
65 17549e84 Juan Quintela
        .state = MIG_STATE_SETUP,
66 d0ae46c1 Juan Quintela
        .bandwidth_limit = MAX_THROTTLE,
67 17ad9b35 Orit Wasserman
        .xbzrle_cache_size = DEFAULT_MIGRATE_CACHE_SIZE,
68 17549e84 Juan Quintela
    };
69 17549e84 Juan Quintela
70 17549e84 Juan Quintela
    return &current_migration;
71 17549e84 Juan Quintela
}
72 17549e84 Juan Quintela
73 43eaae28 Paolo Bonzini
void qemu_start_incoming_migration(const char *uri, Error **errp)
74 5bb7910a aliguori
{
75 34c9dd8e aliguori
    const char *p;
76 34c9dd8e aliguori
77 34c9dd8e aliguori
    if (strstart(uri, "tcp:", &p))
78 43eaae28 Paolo Bonzini
        tcp_start_incoming_migration(p, errp);
79 065e2813 aliguori
#if !defined(WIN32)
80 065e2813 aliguori
    else if (strstart(uri, "exec:", &p))
81 43eaae28 Paolo Bonzini
        exec_start_incoming_migration(p, errp);
82 4951f65b Chris Lalancette
    else if (strstart(uri, "unix:", &p))
83 43eaae28 Paolo Bonzini
        unix_start_incoming_migration(p, errp);
84 5ac1fad3 Paolo Bonzini
    else if (strstart(uri, "fd:", &p))
85 43eaae28 Paolo Bonzini
        fd_start_incoming_migration(p, errp);
86 065e2813 aliguori
#endif
87 8ca5e801 Juan Quintela
    else {
88 43eaae28 Paolo Bonzini
        error_setg(errp, "unknown migration protocol: %s\n", uri);
89 8ca5e801 Juan Quintela
    }
90 5bb7910a aliguori
}
91 5bb7910a aliguori
92 82a4da79 Paolo Bonzini
static void process_incoming_migration_co(void *opaque)
93 511c0231 Juan Quintela
{
94 82a4da79 Paolo Bonzini
    QEMUFile *f = opaque;
95 1c12e1f5 Paolo Bonzini
    int ret;
96 1c12e1f5 Paolo Bonzini
97 1c12e1f5 Paolo Bonzini
    ret = qemu_loadvm_state(f);
98 82a4da79 Paolo Bonzini
    qemu_set_fd_handler(qemu_get_fd(f), NULL, NULL, NULL);
99 1c12e1f5 Paolo Bonzini
    qemu_fclose(f);
100 1c12e1f5 Paolo Bonzini
    if (ret < 0) {
101 511c0231 Juan Quintela
        fprintf(stderr, "load of migration failed\n");
102 511c0231 Juan Quintela
        exit(0);
103 511c0231 Juan Quintela
    }
104 511c0231 Juan Quintela
    qemu_announce_self();
105 511c0231 Juan Quintela
    DPRINTF("successfully loaded vm state\n");
106 511c0231 Juan Quintela
107 901862cb Benoît Canet
    bdrv_clear_incoming_migration_all();
108 0f15423c Anthony Liguori
    /* Make sure all file formats flush their mutable metadata */
109 0f15423c Anthony Liguori
    bdrv_invalidate_cache_all();
110 0f15423c Anthony Liguori
111 f5bbfba1 Luiz Capitulino
    if (autostart) {
112 511c0231 Juan Quintela
        vm_start();
113 f5bbfba1 Luiz Capitulino
    } else {
114 29ed72f1 Paolo Bonzini
        runstate_set(RUN_STATE_PAUSED);
115 f5bbfba1 Luiz Capitulino
    }
116 511c0231 Juan Quintela
}
117 511c0231 Juan Quintela
118 82a4da79 Paolo Bonzini
static void enter_migration_coroutine(void *opaque)
119 82a4da79 Paolo Bonzini
{
120 82a4da79 Paolo Bonzini
    Coroutine *co = opaque;
121 82a4da79 Paolo Bonzini
    qemu_coroutine_enter(co, NULL);
122 82a4da79 Paolo Bonzini
}
123 82a4da79 Paolo Bonzini
124 82a4da79 Paolo Bonzini
void process_incoming_migration(QEMUFile *f)
125 82a4da79 Paolo Bonzini
{
126 82a4da79 Paolo Bonzini
    Coroutine *co = qemu_coroutine_create(process_incoming_migration_co);
127 82a4da79 Paolo Bonzini
    int fd = qemu_get_fd(f);
128 82a4da79 Paolo Bonzini
129 82a4da79 Paolo Bonzini
    assert(fd != -1);
130 82a4da79 Paolo Bonzini
    socket_set_nonblock(fd);
131 82a4da79 Paolo Bonzini
    qemu_set_fd_handler(fd, enter_migration_coroutine, NULL, co);
132 82a4da79 Paolo Bonzini
    qemu_coroutine_enter(co, f);
133 82a4da79 Paolo Bonzini
}
134 82a4da79 Paolo Bonzini
135 a0a3fd60 Glauber Costa
/* amount of nanoseconds we are willing to wait for migration to be down.
136 a0a3fd60 Glauber Costa
 * the choice of nanoseconds is because it is the maximum resolution that
137 a0a3fd60 Glauber Costa
 * get_clock() can achieve. It is an internal measure. All user-visible
138 a0a3fd60 Glauber Costa
 * units must be in seconds */
139 a0a3fd60 Glauber Costa
static uint64_t max_downtime = 30000000;
140 a0a3fd60 Glauber Costa
141 a0a3fd60 Glauber Costa
uint64_t migrate_max_downtime(void)
142 a0a3fd60 Glauber Costa
{
143 a0a3fd60 Glauber Costa
    return max_downtime;
144 a0a3fd60 Glauber Costa
}
145 a0a3fd60 Glauber Costa
146 bbf6da32 Orit Wasserman
MigrationCapabilityStatusList *qmp_query_migrate_capabilities(Error **errp)
147 bbf6da32 Orit Wasserman
{
148 bbf6da32 Orit Wasserman
    MigrationCapabilityStatusList *head = NULL;
149 bbf6da32 Orit Wasserman
    MigrationCapabilityStatusList *caps;
150 bbf6da32 Orit Wasserman
    MigrationState *s = migrate_get_current();
151 bbf6da32 Orit Wasserman
    int i;
152 bbf6da32 Orit Wasserman
153 bbf6da32 Orit Wasserman
    for (i = 0; i < MIGRATION_CAPABILITY_MAX; i++) {
154 bbf6da32 Orit Wasserman
        if (head == NULL) {
155 bbf6da32 Orit Wasserman
            head = g_malloc0(sizeof(*caps));
156 bbf6da32 Orit Wasserman
            caps = head;
157 bbf6da32 Orit Wasserman
        } else {
158 bbf6da32 Orit Wasserman
            caps->next = g_malloc0(sizeof(*caps));
159 bbf6da32 Orit Wasserman
            caps = caps->next;
160 bbf6da32 Orit Wasserman
        }
161 bbf6da32 Orit Wasserman
        caps->value =
162 bbf6da32 Orit Wasserman
            g_malloc(sizeof(*caps->value));
163 bbf6da32 Orit Wasserman
        caps->value->capability = i;
164 bbf6da32 Orit Wasserman
        caps->value->state = s->enabled_capabilities[i];
165 bbf6da32 Orit Wasserman
    }
166 bbf6da32 Orit Wasserman
167 bbf6da32 Orit Wasserman
    return head;
168 bbf6da32 Orit Wasserman
}
169 bbf6da32 Orit Wasserman
170 f36d55af Orit Wasserman
static void get_xbzrle_cache_stats(MigrationInfo *info)
171 f36d55af Orit Wasserman
{
172 f36d55af Orit Wasserman
    if (migrate_use_xbzrle()) {
173 f36d55af Orit Wasserman
        info->has_xbzrle_cache = true;
174 f36d55af Orit Wasserman
        info->xbzrle_cache = g_malloc0(sizeof(*info->xbzrle_cache));
175 f36d55af Orit Wasserman
        info->xbzrle_cache->cache_size = migrate_xbzrle_cache_size();
176 f36d55af Orit Wasserman
        info->xbzrle_cache->bytes = xbzrle_mig_bytes_transferred();
177 f36d55af Orit Wasserman
        info->xbzrle_cache->pages = xbzrle_mig_pages_transferred();
178 f36d55af Orit Wasserman
        info->xbzrle_cache->cache_miss = xbzrle_mig_pages_cache_miss();
179 f36d55af Orit Wasserman
        info->xbzrle_cache->overflow = xbzrle_mig_pages_overflow();
180 f36d55af Orit Wasserman
    }
181 f36d55af Orit Wasserman
}
182 f36d55af Orit Wasserman
183 791e7c82 Luiz Capitulino
MigrationInfo *qmp_query_migrate(Error **errp)
184 5bb7910a aliguori
{
185 791e7c82 Luiz Capitulino
    MigrationInfo *info = g_malloc0(sizeof(*info));
186 17549e84 Juan Quintela
    MigrationState *s = migrate_get_current();
187 17549e84 Juan Quintela
188 17549e84 Juan Quintela
    switch (s->state) {
189 17549e84 Juan Quintela
    case MIG_STATE_SETUP:
190 17549e84 Juan Quintela
        /* no migration has happened ever */
191 17549e84 Juan Quintela
        break;
192 17549e84 Juan Quintela
    case MIG_STATE_ACTIVE:
193 791e7c82 Luiz Capitulino
        info->has_status = true;
194 791e7c82 Luiz Capitulino
        info->status = g_strdup("active");
195 7aa939af Juan Quintela
        info->has_total_time = true;
196 7aa939af Juan Quintela
        info->total_time = qemu_get_clock_ms(rt_clock)
197 7aa939af Juan Quintela
            - s->total_time;
198 2c52ddf1 Juan Quintela
        info->has_expected_downtime = true;
199 2c52ddf1 Juan Quintela
        info->expected_downtime = s->expected_downtime;
200 17549e84 Juan Quintela
201 791e7c82 Luiz Capitulino
        info->has_ram = true;
202 791e7c82 Luiz Capitulino
        info->ram = g_malloc0(sizeof(*info->ram));
203 791e7c82 Luiz Capitulino
        info->ram->transferred = ram_bytes_transferred();
204 791e7c82 Luiz Capitulino
        info->ram->remaining = ram_bytes_remaining();
205 791e7c82 Luiz Capitulino
        info->ram->total = ram_bytes_total();
206 004d4c10 Orit Wasserman
        info->ram->duplicate = dup_mig_pages_transferred();
207 004d4c10 Orit Wasserman
        info->ram->normal = norm_mig_pages_transferred();
208 004d4c10 Orit Wasserman
        info->ram->normal_bytes = norm_mig_bytes_transferred();
209 8d017193 Juan Quintela
        info->ram->dirty_pages_rate = s->dirty_pages_rate;
210 8d017193 Juan Quintela
211 17549e84 Juan Quintela
212 17549e84 Juan Quintela
        if (blk_mig_active()) {
213 791e7c82 Luiz Capitulino
            info->has_disk = true;
214 791e7c82 Luiz Capitulino
            info->disk = g_malloc0(sizeof(*info->disk));
215 791e7c82 Luiz Capitulino
            info->disk->transferred = blk_mig_bytes_transferred();
216 791e7c82 Luiz Capitulino
            info->disk->remaining = blk_mig_bytes_remaining();
217 791e7c82 Luiz Capitulino
            info->disk->total = blk_mig_bytes_total();
218 ff8d81d8 aliguori
        }
219 f36d55af Orit Wasserman
220 f36d55af Orit Wasserman
        get_xbzrle_cache_stats(info);
221 17549e84 Juan Quintela
        break;
222 17549e84 Juan Quintela
    case MIG_STATE_COMPLETED:
223 f36d55af Orit Wasserman
        get_xbzrle_cache_stats(info);
224 f36d55af Orit Wasserman
225 791e7c82 Luiz Capitulino
        info->has_status = true;
226 791e7c82 Luiz Capitulino
        info->status = g_strdup("completed");
227 7aa939af Juan Quintela
        info->total_time = s->total_time;
228 9c5a9fcf Juan Quintela
        info->has_downtime = true;
229 9c5a9fcf Juan Quintela
        info->downtime = s->downtime;
230 d5f8a570 Juan Quintela
231 d5f8a570 Juan Quintela
        info->has_ram = true;
232 d5f8a570 Juan Quintela
        info->ram = g_malloc0(sizeof(*info->ram));
233 d5f8a570 Juan Quintela
        info->ram->transferred = ram_bytes_transferred();
234 d5f8a570 Juan Quintela
        info->ram->remaining = 0;
235 d5f8a570 Juan Quintela
        info->ram->total = ram_bytes_total();
236 004d4c10 Orit Wasserman
        info->ram->duplicate = dup_mig_pages_transferred();
237 004d4c10 Orit Wasserman
        info->ram->normal = norm_mig_pages_transferred();
238 004d4c10 Orit Wasserman
        info->ram->normal_bytes = norm_mig_bytes_transferred();
239 17549e84 Juan Quintela
        break;
240 17549e84 Juan Quintela
    case MIG_STATE_ERROR:
241 791e7c82 Luiz Capitulino
        info->has_status = true;
242 791e7c82 Luiz Capitulino
        info->status = g_strdup("failed");
243 17549e84 Juan Quintela
        break;
244 17549e84 Juan Quintela
    case MIG_STATE_CANCELLED:
245 791e7c82 Luiz Capitulino
        info->has_status = true;
246 791e7c82 Luiz Capitulino
        info->status = g_strdup("cancelled");
247 17549e84 Juan Quintela
        break;
248 5bb7910a aliguori
    }
249 791e7c82 Luiz Capitulino
250 791e7c82 Luiz Capitulino
    return info;
251 5bb7910a aliguori
}
252 5bb7910a aliguori
253 00458433 Orit Wasserman
void qmp_migrate_set_capabilities(MigrationCapabilityStatusList *params,
254 00458433 Orit Wasserman
                                  Error **errp)
255 00458433 Orit Wasserman
{
256 00458433 Orit Wasserman
    MigrationState *s = migrate_get_current();
257 00458433 Orit Wasserman
    MigrationCapabilityStatusList *cap;
258 00458433 Orit Wasserman
259 00458433 Orit Wasserman
    if (s->state == MIG_STATE_ACTIVE) {
260 00458433 Orit Wasserman
        error_set(errp, QERR_MIGRATION_ACTIVE);
261 00458433 Orit Wasserman
        return;
262 00458433 Orit Wasserman
    }
263 00458433 Orit Wasserman
264 00458433 Orit Wasserman
    for (cap = params; cap; cap = cap->next) {
265 00458433 Orit Wasserman
        s->enabled_capabilities[cap->value->capability] = cap->value->state;
266 00458433 Orit Wasserman
    }
267 00458433 Orit Wasserman
}
268 00458433 Orit Wasserman
269 065e2813 aliguori
/* shared migration helpers */
270 065e2813 aliguori
271 8b6b99b3 Juan Quintela
static int migrate_fd_cleanup(MigrationState *s)
272 065e2813 aliguori
{
273 41ef56e6 Anthony Liguori
    int ret = 0;
274 41ef56e6 Anthony Liguori
275 065e2813 aliguori
    if (s->file) {
276 d0f2c4c6 malc
        DPRINTF("closing file\n");
277 a6d34a94 Eduardo Habkost
        ret = qemu_fclose(s->file);
278 5d39c799 Jan Kiszka
        s->file = NULL;
279 065e2813 aliguori
    }
280 065e2813 aliguori
281 24ea1e4b Paolo Bonzini
    assert(s->fd == -1);
282 41ef56e6 Anthony Liguori
    return ret;
283 065e2813 aliguori
}
284 065e2813 aliguori
285 8b6b99b3 Juan Quintela
void migrate_fd_error(MigrationState *s)
286 065e2813 aliguori
{
287 8b6b99b3 Juan Quintela
    DPRINTF("setting error state\n");
288 8b6b99b3 Juan Quintela
    s->state = MIG_STATE_ERROR;
289 e0eb7390 Juan Quintela
    notifier_list_notify(&migration_state_notifiers, s);
290 8b6b99b3 Juan Quintela
    migrate_fd_cleanup(s);
291 8b6b99b3 Juan Quintela
}
292 8b6b99b3 Juan Quintela
293 458cf28e Juan Quintela
static void migrate_fd_completed(MigrationState *s)
294 458cf28e Juan Quintela
{
295 458cf28e Juan Quintela
    DPRINTF("setting completed state\n");
296 458cf28e Juan Quintela
    if (migrate_fd_cleanup(s) < 0) {
297 458cf28e Juan Quintela
        s->state = MIG_STATE_ERROR;
298 458cf28e Juan Quintela
    } else {
299 458cf28e Juan Quintela
        s->state = MIG_STATE_COMPLETED;
300 458cf28e Juan Quintela
        runstate_set(RUN_STATE_POSTMIGRATE);
301 458cf28e Juan Quintela
    }
302 e0eb7390 Juan Quintela
    notifier_list_notify(&migration_state_notifiers, s);
303 458cf28e Juan Quintela
}
304 458cf28e Juan Quintela
305 c87b015b Juan Quintela
ssize_t migrate_fd_put_buffer(MigrationState *s, const void *data,
306 c87b015b Juan Quintela
                              size_t size)
307 065e2813 aliguori
{
308 065e2813 aliguori
    ssize_t ret;
309 065e2813 aliguori
310 fdbecb5d Juan Quintela
    if (s->state != MIG_STATE_ACTIVE) {
311 fdbecb5d Juan Quintela
        return -EIO;
312 fdbecb5d Juan Quintela
    }
313 fdbecb5d Juan Quintela
314 065e2813 aliguori
    do {
315 065e2813 aliguori
        ret = s->write(s, data, size);
316 95b134ea Uri Lublin
    } while (ret == -1 && ((s->get_error(s)) == EINTR));
317 065e2813 aliguori
318 065e2813 aliguori
    if (ret == -1)
319 065e2813 aliguori
        ret = -(s->get_error(s));
320 065e2813 aliguori
321 065e2813 aliguori
    return ret;
322 065e2813 aliguori
}
323 065e2813 aliguori
324 0edda1c4 Juan Quintela
static void migrate_fd_cancel(MigrationState *s)
325 065e2813 aliguori
{
326 065e2813 aliguori
    if (s->state != MIG_STATE_ACTIVE)
327 065e2813 aliguori
        return;
328 065e2813 aliguori
329 d0f2c4c6 malc
    DPRINTF("cancelling migration\n");
330 065e2813 aliguori
331 065e2813 aliguori
    s->state = MIG_STATE_CANCELLED;
332 e0eb7390 Juan Quintela
    notifier_list_notify(&migration_state_notifiers, s);
333 539de124 Luiz Capitulino
    qemu_savevm_state_cancel(s->file);
334 065e2813 aliguori
335 065e2813 aliguori
    migrate_fd_cleanup(s);
336 065e2813 aliguori
}
337 065e2813 aliguori
338 11c76741 Juan Quintela
int migrate_fd_close(MigrationState *s)
339 065e2813 aliguori
{
340 8dc592e6 Paolo Bonzini
    int rc = 0;
341 8dc592e6 Paolo Bonzini
    if (s->fd != -1) {
342 8dc592e6 Paolo Bonzini
        rc = s->close(s);
343 8dc592e6 Paolo Bonzini
        s->fd = -1;
344 8dc592e6 Paolo Bonzini
    }
345 8dc592e6 Paolo Bonzini
    return rc;
346 065e2813 aliguori
}
347 99a0db9b Gerd Hoffmann
348 99a0db9b Gerd Hoffmann
void add_migration_state_change_notifier(Notifier *notify)
349 99a0db9b Gerd Hoffmann
{
350 99a0db9b Gerd Hoffmann
    notifier_list_add(&migration_state_notifiers, notify);
351 99a0db9b Gerd Hoffmann
}
352 99a0db9b Gerd Hoffmann
353 99a0db9b Gerd Hoffmann
void remove_migration_state_change_notifier(Notifier *notify)
354 99a0db9b Gerd Hoffmann
{
355 31552529 Paolo Bonzini
    notifier_remove(notify);
356 99a0db9b Gerd Hoffmann
}
357 99a0db9b Gerd Hoffmann
358 afe2df69 Gerd Hoffmann
bool migration_is_active(MigrationState *s)
359 afe2df69 Gerd Hoffmann
{
360 afe2df69 Gerd Hoffmann
    return s->state == MIG_STATE_ACTIVE;
361 afe2df69 Gerd Hoffmann
}
362 afe2df69 Gerd Hoffmann
363 7073693b Juan Quintela
bool migration_has_finished(MigrationState *s)
364 99a0db9b Gerd Hoffmann
{
365 7073693b Juan Quintela
    return s->state == MIG_STATE_COMPLETED;
366 99a0db9b Gerd Hoffmann
}
367 0edda1c4 Juan Quintela
368 afe2df69 Gerd Hoffmann
bool migration_has_failed(MigrationState *s)
369 afe2df69 Gerd Hoffmann
{
370 afe2df69 Gerd Hoffmann
    return (s->state == MIG_STATE_CANCELLED ||
371 afe2df69 Gerd Hoffmann
            s->state == MIG_STATE_ERROR);
372 afe2df69 Gerd Hoffmann
}
373 afe2df69 Gerd Hoffmann
374 6607ae23 Isaku Yamahata
static MigrationState *migrate_init(const MigrationParams *params)
375 0edda1c4 Juan Quintela
{
376 17549e84 Juan Quintela
    MigrationState *s = migrate_get_current();
377 d0ae46c1 Juan Quintela
    int64_t bandwidth_limit = s->bandwidth_limit;
378 bbf6da32 Orit Wasserman
    bool enabled_capabilities[MIGRATION_CAPABILITY_MAX];
379 17ad9b35 Orit Wasserman
    int64_t xbzrle_cache_size = s->xbzrle_cache_size;
380 bbf6da32 Orit Wasserman
381 bbf6da32 Orit Wasserman
    memcpy(enabled_capabilities, s->enabled_capabilities,
382 bbf6da32 Orit Wasserman
           sizeof(enabled_capabilities));
383 0edda1c4 Juan Quintela
384 17549e84 Juan Quintela
    memset(s, 0, sizeof(*s));
385 d0ae46c1 Juan Quintela
    s->bandwidth_limit = bandwidth_limit;
386 6607ae23 Isaku Yamahata
    s->params = *params;
387 bbf6da32 Orit Wasserman
    memcpy(s->enabled_capabilities, enabled_capabilities,
388 bbf6da32 Orit Wasserman
           sizeof(enabled_capabilities));
389 17ad9b35 Orit Wasserman
    s->xbzrle_cache_size = xbzrle_cache_size;
390 1299c631 Juan Quintela
391 0edda1c4 Juan Quintela
    s->bandwidth_limit = bandwidth_limit;
392 d5934dde Juan Quintela
    s->state = MIG_STATE_SETUP;
393 d5f8a570 Juan Quintela
    s->total_time = qemu_get_clock_ms(rt_clock);
394 0edda1c4 Juan Quintela
395 0edda1c4 Juan Quintela
    return s;
396 0edda1c4 Juan Quintela
}
397 cab30143 Juan Quintela
398 fa2756b7 Anthony Liguori
static GSList *migration_blockers;
399 fa2756b7 Anthony Liguori
400 fa2756b7 Anthony Liguori
void migrate_add_blocker(Error *reason)
401 fa2756b7 Anthony Liguori
{
402 fa2756b7 Anthony Liguori
    migration_blockers = g_slist_prepend(migration_blockers, reason);
403 fa2756b7 Anthony Liguori
}
404 fa2756b7 Anthony Liguori
405 fa2756b7 Anthony Liguori
void migrate_del_blocker(Error *reason)
406 fa2756b7 Anthony Liguori
{
407 fa2756b7 Anthony Liguori
    migration_blockers = g_slist_remove(migration_blockers, reason);
408 fa2756b7 Anthony Liguori
}
409 fa2756b7 Anthony Liguori
410 e1c37d0e Luiz Capitulino
void qmp_migrate(const char *uri, bool has_blk, bool blk,
411 e1c37d0e Luiz Capitulino
                 bool has_inc, bool inc, bool has_detach, bool detach,
412 e1c37d0e Luiz Capitulino
                 Error **errp)
413 cab30143 Juan Quintela
{
414 be7059cd Paolo Bonzini
    Error *local_err = NULL;
415 17549e84 Juan Quintela
    MigrationState *s = migrate_get_current();
416 6607ae23 Isaku Yamahata
    MigrationParams params;
417 cab30143 Juan Quintela
    const char *p;
418 cab30143 Juan Quintela
419 6607ae23 Isaku Yamahata
    params.blk = blk;
420 6607ae23 Isaku Yamahata
    params.shared = inc;
421 6607ae23 Isaku Yamahata
422 17549e84 Juan Quintela
    if (s->state == MIG_STATE_ACTIVE) {
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 cab30143 Juan Quintela
#if !defined(WIN32)
441 cab30143 Juan Quintela
    } else if (strstart(uri, "exec:", &p)) {
442 f37afb5a Paolo Bonzini
        exec_start_outgoing_migration(s, p, &local_err);
443 cab30143 Juan Quintela
    } else if (strstart(uri, "unix:", &p)) {
444 f37afb5a Paolo Bonzini
        unix_start_outgoing_migration(s, p, &local_err);
445 cab30143 Juan Quintela
    } else if (strstart(uri, "fd:", &p)) {
446 f37afb5a Paolo Bonzini
        fd_start_outgoing_migration(s, p, &local_err);
447 cab30143 Juan Quintela
#endif
448 99a0db9b Gerd Hoffmann
    } else {
449 e1c37d0e Luiz Capitulino
        error_set(errp, QERR_INVALID_PARAMETER_VALUE, "uri", "a valid migration protocol");
450 e1c37d0e Luiz Capitulino
        return;
451 cab30143 Juan Quintela
    }
452 cab30143 Juan Quintela
453 f37afb5a Paolo Bonzini
    if (local_err) {
454 342ab8d1 Paolo Bonzini
        migrate_fd_error(s);
455 f37afb5a Paolo Bonzini
        error_propagate(errp, local_err);
456 e1c37d0e Luiz Capitulino
        return;
457 1299c631 Juan Quintela
    }
458 cab30143 Juan Quintela
}
459 cab30143 Juan Quintela
460 6cdedb07 Luiz Capitulino
void qmp_migrate_cancel(Error **errp)
461 cab30143 Juan Quintela
{
462 17549e84 Juan Quintela
    migrate_fd_cancel(migrate_get_current());
463 cab30143 Juan Quintela
}
464 cab30143 Juan Quintela
465 9e1ba4cc Orit Wasserman
void qmp_migrate_set_cache_size(int64_t value, Error **errp)
466 9e1ba4cc Orit Wasserman
{
467 9e1ba4cc Orit Wasserman
    MigrationState *s = migrate_get_current();
468 9e1ba4cc Orit Wasserman
469 9e1ba4cc Orit Wasserman
    /* Check for truncation */
470 9e1ba4cc Orit Wasserman
    if (value != (size_t)value) {
471 9e1ba4cc Orit Wasserman
        error_set(errp, QERR_INVALID_PARAMETER_VALUE, "cache size",
472 9e1ba4cc Orit Wasserman
                  "exceeding address space");
473 9e1ba4cc Orit Wasserman
        return;
474 9e1ba4cc Orit Wasserman
    }
475 9e1ba4cc Orit Wasserman
476 9e1ba4cc Orit Wasserman
    s->xbzrle_cache_size = xbzrle_cache_resize(value);
477 9e1ba4cc Orit Wasserman
}
478 9e1ba4cc Orit Wasserman
479 9e1ba4cc Orit Wasserman
int64_t qmp_query_migrate_cache_size(Error **errp)
480 9e1ba4cc Orit Wasserman
{
481 9e1ba4cc Orit Wasserman
    return migrate_xbzrle_cache_size();
482 9e1ba4cc Orit Wasserman
}
483 9e1ba4cc Orit Wasserman
484 3dc85383 Luiz Capitulino
void qmp_migrate_set_speed(int64_t value, Error **errp)
485 cab30143 Juan Quintela
{
486 cab30143 Juan Quintela
    MigrationState *s;
487 cab30143 Juan Quintela
488 3dc85383 Luiz Capitulino
    if (value < 0) {
489 3dc85383 Luiz Capitulino
        value = 0;
490 99a0db9b Gerd Hoffmann
    }
491 cab30143 Juan Quintela
492 17549e84 Juan Quintela
    s = migrate_get_current();
493 3dc85383 Luiz Capitulino
    s->bandwidth_limit = value;
494 d0ae46c1 Juan Quintela
    qemu_file_set_rate_limit(s->file, s->bandwidth_limit);
495 cab30143 Juan Quintela
}
496 cab30143 Juan Quintela
497 4f0a993b Luiz Capitulino
void qmp_migrate_set_downtime(double value, Error **errp)
498 cab30143 Juan Quintela
{
499 4f0a993b Luiz Capitulino
    value *= 1e9;
500 4f0a993b Luiz Capitulino
    value = MAX(0, MIN(UINT64_MAX, value));
501 4f0a993b Luiz Capitulino
    max_downtime = (uint64_t)value;
502 99a0db9b Gerd Hoffmann
}
503 17ad9b35 Orit Wasserman
504 17ad9b35 Orit Wasserman
int migrate_use_xbzrle(void)
505 17ad9b35 Orit Wasserman
{
506 17ad9b35 Orit Wasserman
    MigrationState *s;
507 17ad9b35 Orit Wasserman
508 17ad9b35 Orit Wasserman
    s = migrate_get_current();
509 17ad9b35 Orit Wasserman
510 17ad9b35 Orit Wasserman
    return s->enabled_capabilities[MIGRATION_CAPABILITY_XBZRLE];
511 17ad9b35 Orit Wasserman
}
512 17ad9b35 Orit Wasserman
513 17ad9b35 Orit Wasserman
int64_t migrate_xbzrle_cache_size(void)
514 17ad9b35 Orit Wasserman
{
515 17ad9b35 Orit Wasserman
    MigrationState *s;
516 17ad9b35 Orit Wasserman
517 17ad9b35 Orit Wasserman
    s = migrate_get_current();
518 17ad9b35 Orit Wasserman
519 17ad9b35 Orit Wasserman
    return s->xbzrle_cache_size;
520 17ad9b35 Orit Wasserman
}
521 0d82d0e8 Juan Quintela
522 0d82d0e8 Juan Quintela
/* migration thread support */
523 0d82d0e8 Juan Quintela
524 0d82d0e8 Juan Quintela
typedef struct QEMUFileBuffered {
525 0d82d0e8 Juan Quintela
    MigrationState *migration_state;
526 0d82d0e8 Juan Quintela
    QEMUFile *file;
527 0d82d0e8 Juan Quintela
    size_t bytes_xfer;
528 0d82d0e8 Juan Quintela
    size_t xfer_limit;
529 0d82d0e8 Juan Quintela
    uint8_t *buffer;
530 0d82d0e8 Juan Quintela
    size_t buffer_size;
531 0d82d0e8 Juan Quintela
    size_t buffer_capacity;
532 0d82d0e8 Juan Quintela
    QemuThread thread;
533 0d82d0e8 Juan Quintela
} QEMUFileBuffered;
534 0d82d0e8 Juan Quintela
535 0d82d0e8 Juan Quintela
static ssize_t buffered_flush(QEMUFileBuffered *s)
536 0d82d0e8 Juan Quintela
{
537 0d82d0e8 Juan Quintela
    size_t offset = 0;
538 0d82d0e8 Juan Quintela
    ssize_t ret = 0;
539 0d82d0e8 Juan Quintela
540 0d82d0e8 Juan Quintela
    DPRINTF("flushing %zu byte(s) of data\n", s->buffer_size);
541 0d82d0e8 Juan Quintela
542 0d82d0e8 Juan Quintela
    while (s->bytes_xfer < s->xfer_limit && offset < s->buffer_size) {
543 0d82d0e8 Juan Quintela
        size_t to_send = MIN(s->buffer_size - offset, s->xfer_limit - s->bytes_xfer);
544 0d82d0e8 Juan Quintela
        ret = migrate_fd_put_buffer(s->migration_state, s->buffer + offset,
545 0d82d0e8 Juan Quintela
                                    to_send);
546 0d82d0e8 Juan Quintela
        if (ret <= 0) {
547 0d82d0e8 Juan Quintela
            DPRINTF("error flushing data, %zd\n", ret);
548 0d82d0e8 Juan Quintela
            break;
549 0d82d0e8 Juan Quintela
        } else {
550 0d82d0e8 Juan Quintela
            DPRINTF("flushed %zd byte(s)\n", ret);
551 0d82d0e8 Juan Quintela
            offset += ret;
552 0d82d0e8 Juan Quintela
            s->bytes_xfer += ret;
553 0d82d0e8 Juan Quintela
        }
554 0d82d0e8 Juan Quintela
    }
555 0d82d0e8 Juan Quintela
556 0d82d0e8 Juan Quintela
    DPRINTF("flushed %zu of %zu byte(s)\n", offset, s->buffer_size);
557 0d82d0e8 Juan Quintela
    memmove(s->buffer, s->buffer + offset, s->buffer_size - offset);
558 0d82d0e8 Juan Quintela
    s->buffer_size -= offset;
559 0d82d0e8 Juan Quintela
560 0d82d0e8 Juan Quintela
    if (ret < 0) {
561 0d82d0e8 Juan Quintela
        return ret;
562 0d82d0e8 Juan Quintela
    }
563 0d82d0e8 Juan Quintela
    return offset;
564 0d82d0e8 Juan Quintela
}
565 0d82d0e8 Juan Quintela
566 0d82d0e8 Juan Quintela
static int buffered_put_buffer(void *opaque, const uint8_t *buf,
567 0d82d0e8 Juan Quintela
                               int64_t pos, int size)
568 0d82d0e8 Juan Quintela
{
569 0d82d0e8 Juan Quintela
    QEMUFileBuffered *s = opaque;
570 0d82d0e8 Juan Quintela
    ssize_t error;
571 0d82d0e8 Juan Quintela
572 0d82d0e8 Juan Quintela
    DPRINTF("putting %d bytes at %" PRId64 "\n", size, pos);
573 0d82d0e8 Juan Quintela
574 0d82d0e8 Juan Quintela
    error = qemu_file_get_error(s->file);
575 0d82d0e8 Juan Quintela
    if (error) {
576 0d82d0e8 Juan Quintela
        DPRINTF("flush when error, bailing: %s\n", strerror(-error));
577 0d82d0e8 Juan Quintela
        return error;
578 0d82d0e8 Juan Quintela
    }
579 0d82d0e8 Juan Quintela
580 0d82d0e8 Juan Quintela
    if (size <= 0) {
581 0d82d0e8 Juan Quintela
        return size;
582 0d82d0e8 Juan Quintela
    }
583 0d82d0e8 Juan Quintela
584 0d82d0e8 Juan Quintela
    if (size > (s->buffer_capacity - s->buffer_size)) {
585 0d82d0e8 Juan Quintela
        DPRINTF("increasing buffer capacity from %zu by %zu\n",
586 0d82d0e8 Juan Quintela
                s->buffer_capacity, size + 1024);
587 0d82d0e8 Juan Quintela
588 0d82d0e8 Juan Quintela
        s->buffer_capacity += size + 1024;
589 0d82d0e8 Juan Quintela
590 0d82d0e8 Juan Quintela
        s->buffer = g_realloc(s->buffer, s->buffer_capacity);
591 0d82d0e8 Juan Quintela
    }
592 0d82d0e8 Juan Quintela
593 0d82d0e8 Juan Quintela
    memcpy(s->buffer + s->buffer_size, buf, size);
594 0d82d0e8 Juan Quintela
    s->buffer_size += size;
595 0d82d0e8 Juan Quintela
596 0d82d0e8 Juan Quintela
    return size;
597 0d82d0e8 Juan Quintela
}
598 0d82d0e8 Juan Quintela
599 0d82d0e8 Juan Quintela
static int buffered_close(void *opaque)
600 0d82d0e8 Juan Quintela
{
601 0d82d0e8 Juan Quintela
    QEMUFileBuffered *s = opaque;
602 0d82d0e8 Juan Quintela
    ssize_t ret = 0;
603 0d82d0e8 Juan Quintela
    int ret2;
604 0d82d0e8 Juan Quintela
605 0d82d0e8 Juan Quintela
    DPRINTF("closing\n");
606 0d82d0e8 Juan Quintela
607 0d82d0e8 Juan Quintela
    s->xfer_limit = INT_MAX;
608 0d82d0e8 Juan Quintela
    while (!qemu_file_get_error(s->file) && s->buffer_size) {
609 0d82d0e8 Juan Quintela
        ret = buffered_flush(s);
610 0d82d0e8 Juan Quintela
        if (ret < 0) {
611 0d82d0e8 Juan Quintela
            break;
612 0d82d0e8 Juan Quintela
        }
613 0d82d0e8 Juan Quintela
    }
614 0d82d0e8 Juan Quintela
615 0d82d0e8 Juan Quintela
    ret2 = migrate_fd_close(s->migration_state);
616 0d82d0e8 Juan Quintela
    if (ret >= 0) {
617 0d82d0e8 Juan Quintela
        ret = ret2;
618 0d82d0e8 Juan Quintela
    }
619 0d82d0e8 Juan Quintela
    ret = migrate_fd_close(s->migration_state);
620 0d82d0e8 Juan Quintela
    s->migration_state->complete = true;
621 0d82d0e8 Juan Quintela
    return ret;
622 0d82d0e8 Juan Quintela
}
623 0d82d0e8 Juan Quintela
624 0d82d0e8 Juan Quintela
static int buffered_get_fd(void *opaque)
625 0d82d0e8 Juan Quintela
{
626 0d82d0e8 Juan Quintela
    QEMUFileBuffered *s = opaque;
627 0d82d0e8 Juan Quintela
628 e659586e Paolo Bonzini
    return s->migration_state->fd;
629 0d82d0e8 Juan Quintela
}
630 0d82d0e8 Juan Quintela
631 0d82d0e8 Juan Quintela
/*
632 0d82d0e8 Juan Quintela
 * The meaning of the return values is:
633 0d82d0e8 Juan Quintela
 *   0: We can continue sending
634 0d82d0e8 Juan Quintela
 *   1: Time to stop
635 0d82d0e8 Juan Quintela
 *   negative: There has been an error
636 0d82d0e8 Juan Quintela
 */
637 0d82d0e8 Juan Quintela
static int buffered_rate_limit(void *opaque)
638 0d82d0e8 Juan Quintela
{
639 0d82d0e8 Juan Quintela
    QEMUFileBuffered *s = opaque;
640 0d82d0e8 Juan Quintela
    int ret;
641 0d82d0e8 Juan Quintela
642 0d82d0e8 Juan Quintela
    ret = qemu_file_get_error(s->file);
643 0d82d0e8 Juan Quintela
    if (ret) {
644 0d82d0e8 Juan Quintela
        return ret;
645 0d82d0e8 Juan Quintela
    }
646 0d82d0e8 Juan Quintela
647 0d82d0e8 Juan Quintela
    if (s->bytes_xfer > s->xfer_limit) {
648 0d82d0e8 Juan Quintela
        return 1;
649 0d82d0e8 Juan Quintela
    }
650 0d82d0e8 Juan Quintela
651 0d82d0e8 Juan Quintela
    return 0;
652 0d82d0e8 Juan Quintela
}
653 0d82d0e8 Juan Quintela
654 0d82d0e8 Juan Quintela
static int64_t buffered_set_rate_limit(void *opaque, int64_t new_rate)
655 0d82d0e8 Juan Quintela
{
656 0d82d0e8 Juan Quintela
    QEMUFileBuffered *s = opaque;
657 0d82d0e8 Juan Quintela
    if (qemu_file_get_error(s->file)) {
658 0d82d0e8 Juan Quintela
        goto out;
659 0d82d0e8 Juan Quintela
    }
660 0d82d0e8 Juan Quintela
    if (new_rate > SIZE_MAX) {
661 0d82d0e8 Juan Quintela
        new_rate = SIZE_MAX;
662 0d82d0e8 Juan Quintela
    }
663 0d82d0e8 Juan Quintela
664 0d82d0e8 Juan Quintela
    s->xfer_limit = new_rate / 10;
665 0d82d0e8 Juan Quintela
666 0d82d0e8 Juan Quintela
out:
667 0d82d0e8 Juan Quintela
    return s->xfer_limit;
668 0d82d0e8 Juan Quintela
}
669 0d82d0e8 Juan Quintela
670 0d82d0e8 Juan Quintela
static int64_t buffered_get_rate_limit(void *opaque)
671 0d82d0e8 Juan Quintela
{
672 0d82d0e8 Juan Quintela
    QEMUFileBuffered *s = opaque;
673 0d82d0e8 Juan Quintela
674 0d82d0e8 Juan Quintela
    return s->xfer_limit;
675 0d82d0e8 Juan Quintela
}
676 0d82d0e8 Juan Quintela
677 0e288fa3 Juan Quintela
static bool migrate_fd_put_ready(MigrationState *s, uint64_t max_size)
678 0e288fa3 Juan Quintela
{
679 0e288fa3 Juan Quintela
    int ret;
680 0e288fa3 Juan Quintela
    uint64_t pending_size;
681 0e288fa3 Juan Quintela
    bool last_round = false;
682 0e288fa3 Juan Quintela
683 0e288fa3 Juan Quintela
    qemu_mutex_lock_iothread();
684 0e288fa3 Juan Quintela
    if (s->state != MIG_STATE_ACTIVE) {
685 0e288fa3 Juan Quintela
        DPRINTF("put_ready returning because of non-active state\n");
686 0e288fa3 Juan Quintela
        qemu_mutex_unlock_iothread();
687 0e288fa3 Juan Quintela
        return false;
688 0e288fa3 Juan Quintela
    }
689 0e288fa3 Juan Quintela
    if (s->first_time) {
690 0e288fa3 Juan Quintela
        s->first_time = false;
691 0e288fa3 Juan Quintela
        DPRINTF("beginning savevm\n");
692 0e288fa3 Juan Quintela
        ret = qemu_savevm_state_begin(s->file, &s->params);
693 0e288fa3 Juan Quintela
        if (ret < 0) {
694 0e288fa3 Juan Quintela
            DPRINTF("failed, %d\n", ret);
695 0e288fa3 Juan Quintela
            migrate_fd_error(s);
696 0e288fa3 Juan Quintela
            qemu_mutex_unlock_iothread();
697 0e288fa3 Juan Quintela
            return false;
698 0e288fa3 Juan Quintela
        }
699 0e288fa3 Juan Quintela
    }
700 0e288fa3 Juan Quintela
701 0e288fa3 Juan Quintela
    DPRINTF("iterate\n");
702 0e288fa3 Juan Quintela
    pending_size = qemu_savevm_state_pending(s->file, max_size);
703 0e288fa3 Juan Quintela
    DPRINTF("pending size %lu max %lu\n", pending_size, max_size);
704 0e288fa3 Juan Quintela
    if (pending_size >= max_size) {
705 0e288fa3 Juan Quintela
        ret = qemu_savevm_state_iterate(s->file);
706 0e288fa3 Juan Quintela
        if (ret < 0) {
707 0e288fa3 Juan Quintela
            migrate_fd_error(s);
708 0e288fa3 Juan Quintela
        }
709 0e288fa3 Juan Quintela
    } else {
710 0e288fa3 Juan Quintela
        int old_vm_running = runstate_is_running();
711 0e288fa3 Juan Quintela
        int64_t start_time, end_time;
712 0e288fa3 Juan Quintela
713 0e288fa3 Juan Quintela
        DPRINTF("done iterating\n");
714 0e288fa3 Juan Quintela
        start_time = qemu_get_clock_ms(rt_clock);
715 0e288fa3 Juan Quintela
        qemu_system_wakeup_request(QEMU_WAKEUP_REASON_OTHER);
716 0e288fa3 Juan Quintela
        if (old_vm_running) {
717 0e288fa3 Juan Quintela
            vm_stop(RUN_STATE_FINISH_MIGRATE);
718 0e288fa3 Juan Quintela
        } else {
719 0e288fa3 Juan Quintela
            vm_stop_force_state(RUN_STATE_FINISH_MIGRATE);
720 0e288fa3 Juan Quintela
        }
721 0e288fa3 Juan Quintela
722 0e288fa3 Juan Quintela
        if (qemu_savevm_state_complete(s->file) < 0) {
723 0e288fa3 Juan Quintela
            migrate_fd_error(s);
724 0e288fa3 Juan Quintela
        } else {
725 0e288fa3 Juan Quintela
            migrate_fd_completed(s);
726 0e288fa3 Juan Quintela
        }
727 0e288fa3 Juan Quintela
        end_time = qemu_get_clock_ms(rt_clock);
728 0e288fa3 Juan Quintela
        s->total_time = end_time - s->total_time;
729 0e288fa3 Juan Quintela
        s->downtime = end_time - start_time;
730 0e288fa3 Juan Quintela
        if (s->state != MIG_STATE_COMPLETED) {
731 0e288fa3 Juan Quintela
            if (old_vm_running) {
732 0e288fa3 Juan Quintela
                vm_start();
733 0e288fa3 Juan Quintela
            }
734 0e288fa3 Juan Quintela
        }
735 0e288fa3 Juan Quintela
        last_round = true;
736 0e288fa3 Juan Quintela
    }
737 0e288fa3 Juan Quintela
    qemu_mutex_unlock_iothread();
738 0e288fa3 Juan Quintela
739 0e288fa3 Juan Quintela
    return last_round;
740 0e288fa3 Juan Quintela
}
741 0e288fa3 Juan Quintela
742 0d82d0e8 Juan Quintela
static void *buffered_file_thread(void *opaque)
743 0d82d0e8 Juan Quintela
{
744 0d82d0e8 Juan Quintela
    QEMUFileBuffered *s = opaque;
745 0d82d0e8 Juan Quintela
    int64_t initial_time = qemu_get_clock_ms(rt_clock);
746 0d82d0e8 Juan Quintela
    int64_t max_size = 0;
747 0d82d0e8 Juan Quintela
    bool last_round = false;
748 0d82d0e8 Juan Quintela
749 0d82d0e8 Juan Quintela
    while (true) {
750 0d82d0e8 Juan Quintela
        int64_t current_time = qemu_get_clock_ms(rt_clock);
751 0d82d0e8 Juan Quintela
752 0d82d0e8 Juan Quintela
        if (s->migration_state->complete) {
753 0d82d0e8 Juan Quintela
            break;
754 0d82d0e8 Juan Quintela
        }
755 0d82d0e8 Juan Quintela
        if (current_time >= initial_time + BUFFER_DELAY) {
756 0d82d0e8 Juan Quintela
            uint64_t transferred_bytes = s->bytes_xfer;
757 0d82d0e8 Juan Quintela
            uint64_t time_spent = current_time - initial_time;
758 0d82d0e8 Juan Quintela
            double bandwidth = transferred_bytes / time_spent;
759 0d82d0e8 Juan Quintela
            max_size = bandwidth * migrate_max_downtime() / 1000000;
760 0d82d0e8 Juan Quintela
761 0d82d0e8 Juan Quintela
            DPRINTF("transferred %" PRIu64 " time_spent %" PRIu64
762 0d82d0e8 Juan Quintela
                    " bandwidth %g max_size %" PRId64 "\n",
763 0d82d0e8 Juan Quintela
                    transferred_bytes, time_spent, bandwidth, max_size);
764 0d82d0e8 Juan Quintela
765 0d82d0e8 Juan Quintela
            s->bytes_xfer = 0;
766 0d82d0e8 Juan Quintela
            initial_time = current_time;
767 0d82d0e8 Juan Quintela
        }
768 0d82d0e8 Juan Quintela
        if (!last_round && (s->bytes_xfer >= s->xfer_limit)) {
769 0d82d0e8 Juan Quintela
            /* usleep expects microseconds */
770 0d82d0e8 Juan Quintela
            g_usleep((initial_time + BUFFER_DELAY - current_time)*1000);
771 0d82d0e8 Juan Quintela
        }
772 0d82d0e8 Juan Quintela
        if (buffered_flush(s) < 0) {
773 0d82d0e8 Juan Quintela
            break;
774 0d82d0e8 Juan Quintela
        }
775 0d82d0e8 Juan Quintela
776 0d82d0e8 Juan Quintela
        DPRINTF("file is ready\n");
777 0d82d0e8 Juan Quintela
        if (s->bytes_xfer < s->xfer_limit) {
778 0d82d0e8 Juan Quintela
            DPRINTF("notifying client\n");
779 0d82d0e8 Juan Quintela
            last_round = migrate_fd_put_ready(s->migration_state, max_size);
780 0d82d0e8 Juan Quintela
        }
781 0d82d0e8 Juan Quintela
    }
782 0d82d0e8 Juan Quintela
783 0d82d0e8 Juan Quintela
    g_free(s->buffer);
784 0d82d0e8 Juan Quintela
    g_free(s);
785 0d82d0e8 Juan Quintela
    return NULL;
786 0d82d0e8 Juan Quintela
}
787 0d82d0e8 Juan Quintela
788 0d82d0e8 Juan Quintela
static const QEMUFileOps buffered_file_ops = {
789 0d82d0e8 Juan Quintela
    .get_fd =         buffered_get_fd,
790 0d82d0e8 Juan Quintela
    .put_buffer =     buffered_put_buffer,
791 0d82d0e8 Juan Quintela
    .close =          buffered_close,
792 0d82d0e8 Juan Quintela
    .rate_limit =     buffered_rate_limit,
793 0d82d0e8 Juan Quintela
    .get_rate_limit = buffered_get_rate_limit,
794 0d82d0e8 Juan Quintela
    .set_rate_limit = buffered_set_rate_limit,
795 0d82d0e8 Juan Quintela
};
796 0d82d0e8 Juan Quintela
797 2e450865 Juan Quintela
void migrate_fd_connect(MigrationState *migration_state)
798 0d82d0e8 Juan Quintela
{
799 0d82d0e8 Juan Quintela
    QEMUFileBuffered *s;
800 0d82d0e8 Juan Quintela
801 2e450865 Juan Quintela
    migration_state->state = MIG_STATE_ACTIVE;
802 2e450865 Juan Quintela
    migration_state->first_time = true;
803 0d82d0e8 Juan Quintela
    s = g_malloc0(sizeof(*s));
804 0d82d0e8 Juan Quintela
805 0d82d0e8 Juan Quintela
    s->migration_state = migration_state;
806 5b4e1eb7 Juan Quintela
    s->xfer_limit = s->migration_state->bandwidth_limit / XFER_LIMIT_RATIO;
807 0d82d0e8 Juan Quintela
    s->migration_state->complete = false;
808 0d82d0e8 Juan Quintela
809 0d82d0e8 Juan Quintela
    s->file = qemu_fopen_ops(s, &buffered_file_ops);
810 0d82d0e8 Juan Quintela
811 0d82d0e8 Juan Quintela
    migration_state->file = s->file;
812 0d82d0e8 Juan Quintela
813 0d82d0e8 Juan Quintela
    qemu_thread_create(&s->thread, buffered_file_thread, s,
814 0d82d0e8 Juan Quintela
                       QEMU_THREAD_DETACHED);
815 0d3b26f5 Juan Quintela
    notifier_list_notify(&migration_state_notifiers, s);
816 0d82d0e8 Juan Quintela
}