Statistics
| Branch: | Revision:

root / migration.c @ 11c7549d

History | View | Annotate | Download (16.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 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 c09e5bb1 Kazuya Saito
#include "trace.h"
27 065e2813 aliguori
28 065e2813 aliguori
//#define DEBUG_MIGRATION
29 065e2813 aliguori
30 065e2813 aliguori
#ifdef DEBUG_MIGRATION
31 d0f2c4c6 malc
#define DPRINTF(fmt, ...) \
32 065e2813 aliguori
    do { printf("migration: " fmt, ## __VA_ARGS__); } while (0)
33 065e2813 aliguori
#else
34 d0f2c4c6 malc
#define DPRINTF(fmt, ...) \
35 065e2813 aliguori
    do { } while (0)
36 065e2813 aliguori
#endif
37 5bb7910a aliguori
38 7dc688ed Juan Quintela
enum {
39 7dc688ed Juan Quintela
    MIG_STATE_ERROR,
40 7dc688ed Juan Quintela
    MIG_STATE_SETUP,
41 7dc688ed Juan Quintela
    MIG_STATE_CANCELLED,
42 7dc688ed Juan Quintela
    MIG_STATE_ACTIVE,
43 7dc688ed Juan Quintela
    MIG_STATE_COMPLETED,
44 7dc688ed Juan Quintela
};
45 5bb7910a aliguori
46 d0ae46c1 Juan Quintela
#define MAX_THROTTLE  (32 << 20)      /* Migration speed throttling */
47 5bb7910a aliguori
48 5b4e1eb7 Juan Quintela
/* Amount of time to allocate to each "chunk" of bandwidth-throttled
49 5b4e1eb7 Juan Quintela
 * data. */
50 5b4e1eb7 Juan Quintela
#define BUFFER_DELAY     100
51 5b4e1eb7 Juan Quintela
#define XFER_LIMIT_RATIO (1000 / BUFFER_DELAY)
52 5b4e1eb7 Juan Quintela
53 17ad9b35 Orit Wasserman
/* Migration XBZRLE default cache size */
54 17ad9b35 Orit Wasserman
#define DEFAULT_MIGRATE_CACHE_SIZE (64 * 1024 * 1024)
55 17ad9b35 Orit Wasserman
56 99a0db9b Gerd Hoffmann
static NotifierList migration_state_notifiers =
57 99a0db9b Gerd Hoffmann
    NOTIFIER_LIST_INITIALIZER(migration_state_notifiers);
58 99a0db9b Gerd Hoffmann
59 17549e84 Juan Quintela
/* When we add fault tolerance, we could have several
60 17549e84 Juan Quintela
   migrations at once.  For now we don't need to add
61 17549e84 Juan Quintela
   dynamic creation of migration */
62 17549e84 Juan Quintela
63 859bc756 Juan Quintela
MigrationState *migrate_get_current(void)
64 17549e84 Juan Quintela
{
65 17549e84 Juan Quintela
    static MigrationState current_migration = {
66 17549e84 Juan Quintela
        .state = MIG_STATE_SETUP,
67 d0ae46c1 Juan Quintela
        .bandwidth_limit = MAX_THROTTLE,
68 17ad9b35 Orit Wasserman
        .xbzrle_cache_size = DEFAULT_MIGRATE_CACHE_SIZE,
69 17549e84 Juan Quintela
    };
70 17549e84 Juan Quintela
71 17549e84 Juan Quintela
    return &current_migration;
72 17549e84 Juan Quintela
}
73 17549e84 Juan Quintela
74 43eaae28 Paolo Bonzini
void qemu_start_incoming_migration(const char *uri, Error **errp)
75 5bb7910a aliguori
{
76 34c9dd8e aliguori
    const char *p;
77 34c9dd8e aliguori
78 34c9dd8e aliguori
    if (strstart(uri, "tcp:", &p))
79 43eaae28 Paolo Bonzini
        tcp_start_incoming_migration(p, errp);
80 065e2813 aliguori
#if !defined(WIN32)
81 065e2813 aliguori
    else if (strstart(uri, "exec:", &p))
82 43eaae28 Paolo Bonzini
        exec_start_incoming_migration(p, errp);
83 4951f65b Chris Lalancette
    else if (strstart(uri, "unix:", &p))
84 43eaae28 Paolo Bonzini
        unix_start_incoming_migration(p, errp);
85 5ac1fad3 Paolo Bonzini
    else if (strstart(uri, "fd:", &p))
86 43eaae28 Paolo Bonzini
        fd_start_incoming_migration(p, errp);
87 065e2813 aliguori
#endif
88 8ca5e801 Juan Quintela
    else {
89 312fd5f2 Markus Armbruster
        error_setg(errp, "unknown migration protocol: %s", uri);
90 8ca5e801 Juan Quintela
    }
91 5bb7910a aliguori
}
92 5bb7910a aliguori
93 82a4da79 Paolo Bonzini
static void process_incoming_migration_co(void *opaque)
94 511c0231 Juan Quintela
{
95 82a4da79 Paolo Bonzini
    QEMUFile *f = opaque;
96 1c12e1f5 Paolo Bonzini
    int ret;
97 1c12e1f5 Paolo Bonzini
98 1c12e1f5 Paolo Bonzini
    ret = qemu_loadvm_state(f);
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 4aead692 Eric Blake
        exit(EXIT_FAILURE);
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
void process_incoming_migration(QEMUFile *f)
119 82a4da79 Paolo Bonzini
{
120 82a4da79 Paolo Bonzini
    Coroutine *co = qemu_coroutine_create(process_incoming_migration_co);
121 82a4da79 Paolo Bonzini
    int fd = qemu_get_fd(f);
122 82a4da79 Paolo Bonzini
123 82a4da79 Paolo Bonzini
    assert(fd != -1);
124 f9e8cacc Stefan Hajnoczi
    qemu_set_nonblock(fd);
125 82a4da79 Paolo Bonzini
    qemu_coroutine_enter(co, f);
126 82a4da79 Paolo Bonzini
}
127 82a4da79 Paolo Bonzini
128 a0a3fd60 Glauber Costa
/* amount of nanoseconds we are willing to wait for migration to be down.
129 a0a3fd60 Glauber Costa
 * the choice of nanoseconds is because it is the maximum resolution that
130 a0a3fd60 Glauber Costa
 * get_clock() can achieve. It is an internal measure. All user-visible
131 a0a3fd60 Glauber Costa
 * units must be in seconds */
132 a0a3fd60 Glauber Costa
static uint64_t max_downtime = 30000000;
133 a0a3fd60 Glauber Costa
134 a0a3fd60 Glauber Costa
uint64_t migrate_max_downtime(void)
135 a0a3fd60 Glauber Costa
{
136 a0a3fd60 Glauber Costa
    return max_downtime;
137 a0a3fd60 Glauber Costa
}
138 a0a3fd60 Glauber Costa
139 bbf6da32 Orit Wasserman
MigrationCapabilityStatusList *qmp_query_migrate_capabilities(Error **errp)
140 bbf6da32 Orit Wasserman
{
141 bbf6da32 Orit Wasserman
    MigrationCapabilityStatusList *head = NULL;
142 bbf6da32 Orit Wasserman
    MigrationCapabilityStatusList *caps;
143 bbf6da32 Orit Wasserman
    MigrationState *s = migrate_get_current();
144 bbf6da32 Orit Wasserman
    int i;
145 bbf6da32 Orit Wasserman
146 bbf6da32 Orit Wasserman
    for (i = 0; i < MIGRATION_CAPABILITY_MAX; i++) {
147 bbf6da32 Orit Wasserman
        if (head == NULL) {
148 bbf6da32 Orit Wasserman
            head = g_malloc0(sizeof(*caps));
149 bbf6da32 Orit Wasserman
            caps = head;
150 bbf6da32 Orit Wasserman
        } else {
151 bbf6da32 Orit Wasserman
            caps->next = g_malloc0(sizeof(*caps));
152 bbf6da32 Orit Wasserman
            caps = caps->next;
153 bbf6da32 Orit Wasserman
        }
154 bbf6da32 Orit Wasserman
        caps->value =
155 bbf6da32 Orit Wasserman
            g_malloc(sizeof(*caps->value));
156 bbf6da32 Orit Wasserman
        caps->value->capability = i;
157 bbf6da32 Orit Wasserman
        caps->value->state = s->enabled_capabilities[i];
158 bbf6da32 Orit Wasserman
    }
159 bbf6da32 Orit Wasserman
160 bbf6da32 Orit Wasserman
    return head;
161 bbf6da32 Orit Wasserman
}
162 bbf6da32 Orit Wasserman
163 f36d55af Orit Wasserman
static void get_xbzrle_cache_stats(MigrationInfo *info)
164 f36d55af Orit Wasserman
{
165 f36d55af Orit Wasserman
    if (migrate_use_xbzrle()) {
166 f36d55af Orit Wasserman
        info->has_xbzrle_cache = true;
167 f36d55af Orit Wasserman
        info->xbzrle_cache = g_malloc0(sizeof(*info->xbzrle_cache));
168 f36d55af Orit Wasserman
        info->xbzrle_cache->cache_size = migrate_xbzrle_cache_size();
169 f36d55af Orit Wasserman
        info->xbzrle_cache->bytes = xbzrle_mig_bytes_transferred();
170 f36d55af Orit Wasserman
        info->xbzrle_cache->pages = xbzrle_mig_pages_transferred();
171 f36d55af Orit Wasserman
        info->xbzrle_cache->cache_miss = xbzrle_mig_pages_cache_miss();
172 f36d55af Orit Wasserman
        info->xbzrle_cache->overflow = xbzrle_mig_pages_overflow();
173 f36d55af Orit Wasserman
    }
174 f36d55af Orit Wasserman
}
175 f36d55af Orit Wasserman
176 791e7c82 Luiz Capitulino
MigrationInfo *qmp_query_migrate(Error **errp)
177 5bb7910a aliguori
{
178 791e7c82 Luiz Capitulino
    MigrationInfo *info = g_malloc0(sizeof(*info));
179 17549e84 Juan Quintela
    MigrationState *s = migrate_get_current();
180 17549e84 Juan Quintela
181 17549e84 Juan Quintela
    switch (s->state) {
182 17549e84 Juan Quintela
    case MIG_STATE_SETUP:
183 17549e84 Juan Quintela
        /* no migration has happened ever */
184 17549e84 Juan Quintela
        break;
185 17549e84 Juan Quintela
    case MIG_STATE_ACTIVE:
186 791e7c82 Luiz Capitulino
        info->has_status = true;
187 791e7c82 Luiz Capitulino
        info->status = g_strdup("active");
188 7aa939af Juan Quintela
        info->has_total_time = true;
189 7aa939af Juan Quintela
        info->total_time = qemu_get_clock_ms(rt_clock)
190 7aa939af Juan Quintela
            - s->total_time;
191 2c52ddf1 Juan Quintela
        info->has_expected_downtime = true;
192 2c52ddf1 Juan Quintela
        info->expected_downtime = s->expected_downtime;
193 17549e84 Juan Quintela
194 791e7c82 Luiz Capitulino
        info->has_ram = true;
195 791e7c82 Luiz Capitulino
        info->ram = g_malloc0(sizeof(*info->ram));
196 791e7c82 Luiz Capitulino
        info->ram->transferred = ram_bytes_transferred();
197 791e7c82 Luiz Capitulino
        info->ram->remaining = ram_bytes_remaining();
198 791e7c82 Luiz Capitulino
        info->ram->total = ram_bytes_total();
199 004d4c10 Orit Wasserman
        info->ram->duplicate = dup_mig_pages_transferred();
200 f1c72795 Peter Lieven
        info->ram->skipped = skipped_mig_pages_transferred();
201 004d4c10 Orit Wasserman
        info->ram->normal = norm_mig_pages_transferred();
202 004d4c10 Orit Wasserman
        info->ram->normal_bytes = norm_mig_bytes_transferred();
203 8d017193 Juan Quintela
        info->ram->dirty_pages_rate = s->dirty_pages_rate;
204 8d017193 Juan Quintela
205 17549e84 Juan Quintela
        if (blk_mig_active()) {
206 791e7c82 Luiz Capitulino
            info->has_disk = true;
207 791e7c82 Luiz Capitulino
            info->disk = g_malloc0(sizeof(*info->disk));
208 791e7c82 Luiz Capitulino
            info->disk->transferred = blk_mig_bytes_transferred();
209 791e7c82 Luiz Capitulino
            info->disk->remaining = blk_mig_bytes_remaining();
210 791e7c82 Luiz Capitulino
            info->disk->total = blk_mig_bytes_total();
211 ff8d81d8 aliguori
        }
212 f36d55af Orit Wasserman
213 f36d55af Orit Wasserman
        get_xbzrle_cache_stats(info);
214 17549e84 Juan Quintela
        break;
215 17549e84 Juan Quintela
    case MIG_STATE_COMPLETED:
216 f36d55af Orit Wasserman
        get_xbzrle_cache_stats(info);
217 f36d55af Orit Wasserman
218 791e7c82 Luiz Capitulino
        info->has_status = true;
219 791e7c82 Luiz Capitulino
        info->status = g_strdup("completed");
220 7aa939af Juan Quintela
        info->total_time = s->total_time;
221 9c5a9fcf Juan Quintela
        info->has_downtime = true;
222 9c5a9fcf Juan Quintela
        info->downtime = s->downtime;
223 d5f8a570 Juan Quintela
224 d5f8a570 Juan Quintela
        info->has_ram = true;
225 d5f8a570 Juan Quintela
        info->ram = g_malloc0(sizeof(*info->ram));
226 d5f8a570 Juan Quintela
        info->ram->transferred = ram_bytes_transferred();
227 d5f8a570 Juan Quintela
        info->ram->remaining = 0;
228 d5f8a570 Juan Quintela
        info->ram->total = ram_bytes_total();
229 004d4c10 Orit Wasserman
        info->ram->duplicate = dup_mig_pages_transferred();
230 f1c72795 Peter Lieven
        info->ram->skipped = skipped_mig_pages_transferred();
231 004d4c10 Orit Wasserman
        info->ram->normal = norm_mig_pages_transferred();
232 004d4c10 Orit Wasserman
        info->ram->normal_bytes = norm_mig_bytes_transferred();
233 17549e84 Juan Quintela
        break;
234 17549e84 Juan Quintela
    case MIG_STATE_ERROR:
235 791e7c82 Luiz Capitulino
        info->has_status = true;
236 791e7c82 Luiz Capitulino
        info->status = g_strdup("failed");
237 17549e84 Juan Quintela
        break;
238 17549e84 Juan Quintela
    case MIG_STATE_CANCELLED:
239 791e7c82 Luiz Capitulino
        info->has_status = true;
240 791e7c82 Luiz Capitulino
        info->status = g_strdup("cancelled");
241 17549e84 Juan Quintela
        break;
242 5bb7910a aliguori
    }
243 791e7c82 Luiz Capitulino
244 791e7c82 Luiz Capitulino
    return info;
245 5bb7910a aliguori
}
246 5bb7910a aliguori
247 00458433 Orit Wasserman
void qmp_migrate_set_capabilities(MigrationCapabilityStatusList *params,
248 00458433 Orit Wasserman
                                  Error **errp)
249 00458433 Orit Wasserman
{
250 00458433 Orit Wasserman
    MigrationState *s = migrate_get_current();
251 00458433 Orit Wasserman
    MigrationCapabilityStatusList *cap;
252 00458433 Orit Wasserman
253 00458433 Orit Wasserman
    if (s->state == MIG_STATE_ACTIVE) {
254 00458433 Orit Wasserman
        error_set(errp, QERR_MIGRATION_ACTIVE);
255 00458433 Orit Wasserman
        return;
256 00458433 Orit Wasserman
    }
257 00458433 Orit Wasserman
258 00458433 Orit Wasserman
    for (cap = params; cap; cap = cap->next) {
259 00458433 Orit Wasserman
        s->enabled_capabilities[cap->value->capability] = cap->value->state;
260 00458433 Orit Wasserman
    }
261 00458433 Orit Wasserman
}
262 00458433 Orit Wasserman
263 065e2813 aliguori
/* shared migration helpers */
264 065e2813 aliguori
265 bb1fadc4 Paolo Bonzini
static void migrate_fd_cleanup(void *opaque)
266 065e2813 aliguori
{
267 bb1fadc4 Paolo Bonzini
    MigrationState *s = opaque;
268 bb1fadc4 Paolo Bonzini
269 bb1fadc4 Paolo Bonzini
    qemu_bh_delete(s->cleanup_bh);
270 bb1fadc4 Paolo Bonzini
    s->cleanup_bh = NULL;
271 bb1fadc4 Paolo Bonzini
272 065e2813 aliguori
    if (s->file) {
273 d0f2c4c6 malc
        DPRINTF("closing file\n");
274 404a7c05 Paolo Bonzini
        qemu_mutex_unlock_iothread();
275 404a7c05 Paolo Bonzini
        qemu_thread_join(&s->thread);
276 404a7c05 Paolo Bonzini
        qemu_mutex_lock_iothread();
277 404a7c05 Paolo Bonzini
278 6f190a06 Paolo Bonzini
        qemu_fclose(s->file);
279 6f190a06 Paolo Bonzini
        s->file = NULL;
280 065e2813 aliguori
    }
281 065e2813 aliguori
282 a3fa1d78 Paolo Bonzini
    assert(s->state != MIG_STATE_ACTIVE);
283 7a2c1721 Paolo Bonzini
284 a3fa1d78 Paolo Bonzini
    if (s->state != MIG_STATE_COMPLETED) {
285 7a2c1721 Paolo Bonzini
        qemu_savevm_state_cancel();
286 7a2c1721 Paolo Bonzini
    }
287 a3fa1d78 Paolo Bonzini
288 a3fa1d78 Paolo Bonzini
    notifier_list_notify(&migration_state_notifiers, s);
289 065e2813 aliguori
}
290 065e2813 aliguori
291 f4410a5d Paolo Bonzini
static void migrate_finish_set_state(MigrationState *s, int new_state)
292 f4410a5d Paolo Bonzini
{
293 f4410a5d Paolo Bonzini
    if (__sync_val_compare_and_swap(&s->state, MIG_STATE_ACTIVE,
294 f4410a5d Paolo Bonzini
                                    new_state) == new_state) {
295 f4410a5d Paolo Bonzini
        trace_migrate_set_state(new_state);
296 f4410a5d Paolo Bonzini
    }
297 f4410a5d Paolo Bonzini
}
298 f4410a5d Paolo Bonzini
299 8b6b99b3 Juan Quintela
void migrate_fd_error(MigrationState *s)
300 065e2813 aliguori
{
301 8b6b99b3 Juan Quintela
    DPRINTF("setting error state\n");
302 bb1fadc4 Paolo Bonzini
    assert(s->file == NULL);
303 bb1fadc4 Paolo Bonzini
    s->state = MIG_STATE_ERROR;
304 bb1fadc4 Paolo Bonzini
    trace_migrate_set_state(MIG_STATE_ERROR);
305 bb1fadc4 Paolo Bonzini
    notifier_list_notify(&migration_state_notifiers, s);
306 458cf28e Juan Quintela
}
307 458cf28e Juan Quintela
308 0edda1c4 Juan Quintela
static void migrate_fd_cancel(MigrationState *s)
309 065e2813 aliguori
{
310 d0f2c4c6 malc
    DPRINTF("cancelling migration\n");
311 065e2813 aliguori
312 f4410a5d Paolo Bonzini
    migrate_finish_set_state(s, MIG_STATE_CANCELLED);
313 065e2813 aliguori
}
314 065e2813 aliguori
315 99a0db9b Gerd Hoffmann
void add_migration_state_change_notifier(Notifier *notify)
316 99a0db9b Gerd Hoffmann
{
317 99a0db9b Gerd Hoffmann
    notifier_list_add(&migration_state_notifiers, notify);
318 99a0db9b Gerd Hoffmann
}
319 99a0db9b Gerd Hoffmann
320 99a0db9b Gerd Hoffmann
void remove_migration_state_change_notifier(Notifier *notify)
321 99a0db9b Gerd Hoffmann
{
322 31552529 Paolo Bonzini
    notifier_remove(notify);
323 99a0db9b Gerd Hoffmann
}
324 99a0db9b Gerd Hoffmann
325 afe2df69 Gerd Hoffmann
bool migration_is_active(MigrationState *s)
326 afe2df69 Gerd Hoffmann
{
327 afe2df69 Gerd Hoffmann
    return s->state == MIG_STATE_ACTIVE;
328 afe2df69 Gerd Hoffmann
}
329 afe2df69 Gerd Hoffmann
330 7073693b Juan Quintela
bool migration_has_finished(MigrationState *s)
331 99a0db9b Gerd Hoffmann
{
332 7073693b Juan Quintela
    return s->state == MIG_STATE_COMPLETED;
333 99a0db9b Gerd Hoffmann
}
334 0edda1c4 Juan Quintela
335 afe2df69 Gerd Hoffmann
bool migration_has_failed(MigrationState *s)
336 afe2df69 Gerd Hoffmann
{
337 afe2df69 Gerd Hoffmann
    return (s->state == MIG_STATE_CANCELLED ||
338 afe2df69 Gerd Hoffmann
            s->state == MIG_STATE_ERROR);
339 afe2df69 Gerd Hoffmann
}
340 afe2df69 Gerd Hoffmann
341 6607ae23 Isaku Yamahata
static MigrationState *migrate_init(const MigrationParams *params)
342 0edda1c4 Juan Quintela
{
343 17549e84 Juan Quintela
    MigrationState *s = migrate_get_current();
344 d0ae46c1 Juan Quintela
    int64_t bandwidth_limit = s->bandwidth_limit;
345 bbf6da32 Orit Wasserman
    bool enabled_capabilities[MIGRATION_CAPABILITY_MAX];
346 17ad9b35 Orit Wasserman
    int64_t xbzrle_cache_size = s->xbzrle_cache_size;
347 bbf6da32 Orit Wasserman
348 bbf6da32 Orit Wasserman
    memcpy(enabled_capabilities, s->enabled_capabilities,
349 bbf6da32 Orit Wasserman
           sizeof(enabled_capabilities));
350 0edda1c4 Juan Quintela
351 17549e84 Juan Quintela
    memset(s, 0, sizeof(*s));
352 6607ae23 Isaku Yamahata
    s->params = *params;
353 bbf6da32 Orit Wasserman
    memcpy(s->enabled_capabilities, enabled_capabilities,
354 bbf6da32 Orit Wasserman
           sizeof(enabled_capabilities));
355 17ad9b35 Orit Wasserman
    s->xbzrle_cache_size = xbzrle_cache_size;
356 1299c631 Juan Quintela
357 0edda1c4 Juan Quintela
    s->bandwidth_limit = bandwidth_limit;
358 d5934dde Juan Quintela
    s->state = MIG_STATE_SETUP;
359 c09e5bb1 Kazuya Saito
    trace_migrate_set_state(MIG_STATE_SETUP);
360 0edda1c4 Juan Quintela
361 c09e5bb1 Kazuya Saito
    s->total_time = qemu_get_clock_ms(rt_clock);
362 0edda1c4 Juan Quintela
    return s;
363 0edda1c4 Juan Quintela
}
364 cab30143 Juan Quintela
365 fa2756b7 Anthony Liguori
static GSList *migration_blockers;
366 fa2756b7 Anthony Liguori
367 fa2756b7 Anthony Liguori
void migrate_add_blocker(Error *reason)
368 fa2756b7 Anthony Liguori
{
369 fa2756b7 Anthony Liguori
    migration_blockers = g_slist_prepend(migration_blockers, reason);
370 fa2756b7 Anthony Liguori
}
371 fa2756b7 Anthony Liguori
372 fa2756b7 Anthony Liguori
void migrate_del_blocker(Error *reason)
373 fa2756b7 Anthony Liguori
{
374 fa2756b7 Anthony Liguori
    migration_blockers = g_slist_remove(migration_blockers, reason);
375 fa2756b7 Anthony Liguori
}
376 fa2756b7 Anthony Liguori
377 e1c37d0e Luiz Capitulino
void qmp_migrate(const char *uri, bool has_blk, bool blk,
378 e1c37d0e Luiz Capitulino
                 bool has_inc, bool inc, bool has_detach, bool detach,
379 e1c37d0e Luiz Capitulino
                 Error **errp)
380 cab30143 Juan Quintela
{
381 be7059cd Paolo Bonzini
    Error *local_err = NULL;
382 17549e84 Juan Quintela
    MigrationState *s = migrate_get_current();
383 6607ae23 Isaku Yamahata
    MigrationParams params;
384 cab30143 Juan Quintela
    const char *p;
385 cab30143 Juan Quintela
386 6607ae23 Isaku Yamahata
    params.blk = blk;
387 6607ae23 Isaku Yamahata
    params.shared = inc;
388 6607ae23 Isaku Yamahata
389 17549e84 Juan Quintela
    if (s->state == MIG_STATE_ACTIVE) {
390 e1c37d0e Luiz Capitulino
        error_set(errp, QERR_MIGRATION_ACTIVE);
391 e1c37d0e Luiz Capitulino
        return;
392 cab30143 Juan Quintela
    }
393 cab30143 Juan Quintela
394 e1c37d0e Luiz Capitulino
    if (qemu_savevm_state_blocked(errp)) {
395 e1c37d0e Luiz Capitulino
        return;
396 cab30143 Juan Quintela
    }
397 cab30143 Juan Quintela
398 fa2756b7 Anthony Liguori
    if (migration_blockers) {
399 e1c37d0e Luiz Capitulino
        *errp = error_copy(migration_blockers->data);
400 e1c37d0e Luiz Capitulino
        return;
401 fa2756b7 Anthony Liguori
    }
402 fa2756b7 Anthony Liguori
403 6607ae23 Isaku Yamahata
    s = migrate_init(&params);
404 cab30143 Juan Quintela
405 cab30143 Juan Quintela
    if (strstart(uri, "tcp:", &p)) {
406 f37afb5a Paolo Bonzini
        tcp_start_outgoing_migration(s, p, &local_err);
407 cab30143 Juan Quintela
#if !defined(WIN32)
408 cab30143 Juan Quintela
    } else if (strstart(uri, "exec:", &p)) {
409 f37afb5a Paolo Bonzini
        exec_start_outgoing_migration(s, p, &local_err);
410 cab30143 Juan Quintela
    } else if (strstart(uri, "unix:", &p)) {
411 f37afb5a Paolo Bonzini
        unix_start_outgoing_migration(s, p, &local_err);
412 cab30143 Juan Quintela
    } else if (strstart(uri, "fd:", &p)) {
413 f37afb5a Paolo Bonzini
        fd_start_outgoing_migration(s, p, &local_err);
414 cab30143 Juan Quintela
#endif
415 99a0db9b Gerd Hoffmann
    } else {
416 e1c37d0e Luiz Capitulino
        error_set(errp, QERR_INVALID_PARAMETER_VALUE, "uri", "a valid migration protocol");
417 e1c37d0e Luiz Capitulino
        return;
418 cab30143 Juan Quintela
    }
419 cab30143 Juan Quintela
420 f37afb5a Paolo Bonzini
    if (local_err) {
421 342ab8d1 Paolo Bonzini
        migrate_fd_error(s);
422 f37afb5a Paolo Bonzini
        error_propagate(errp, local_err);
423 e1c37d0e Luiz Capitulino
        return;
424 1299c631 Juan Quintela
    }
425 cab30143 Juan Quintela
}
426 cab30143 Juan Quintela
427 6cdedb07 Luiz Capitulino
void qmp_migrate_cancel(Error **errp)
428 cab30143 Juan Quintela
{
429 17549e84 Juan Quintela
    migrate_fd_cancel(migrate_get_current());
430 cab30143 Juan Quintela
}
431 cab30143 Juan Quintela
432 9e1ba4cc Orit Wasserman
void qmp_migrate_set_cache_size(int64_t value, Error **errp)
433 9e1ba4cc Orit Wasserman
{
434 9e1ba4cc Orit Wasserman
    MigrationState *s = migrate_get_current();
435 9e1ba4cc Orit Wasserman
436 9e1ba4cc Orit Wasserman
    /* Check for truncation */
437 9e1ba4cc Orit Wasserman
    if (value != (size_t)value) {
438 9e1ba4cc Orit Wasserman
        error_set(errp, QERR_INVALID_PARAMETER_VALUE, "cache size",
439 9e1ba4cc Orit Wasserman
                  "exceeding address space");
440 9e1ba4cc Orit Wasserman
        return;
441 9e1ba4cc Orit Wasserman
    }
442 9e1ba4cc Orit Wasserman
443 9e1ba4cc Orit Wasserman
    s->xbzrle_cache_size = xbzrle_cache_resize(value);
444 9e1ba4cc Orit Wasserman
}
445 9e1ba4cc Orit Wasserman
446 9e1ba4cc Orit Wasserman
int64_t qmp_query_migrate_cache_size(Error **errp)
447 9e1ba4cc Orit Wasserman
{
448 9e1ba4cc Orit Wasserman
    return migrate_xbzrle_cache_size();
449 9e1ba4cc Orit Wasserman
}
450 9e1ba4cc Orit Wasserman
451 3dc85383 Luiz Capitulino
void qmp_migrate_set_speed(int64_t value, Error **errp)
452 cab30143 Juan Quintela
{
453 cab30143 Juan Quintela
    MigrationState *s;
454 cab30143 Juan Quintela
455 3dc85383 Luiz Capitulino
    if (value < 0) {
456 3dc85383 Luiz Capitulino
        value = 0;
457 99a0db9b Gerd Hoffmann
    }
458 442773ce Paolo Bonzini
    if (value > SIZE_MAX) {
459 442773ce Paolo Bonzini
        value = SIZE_MAX;
460 442773ce Paolo Bonzini
    }
461 cab30143 Juan Quintela
462 17549e84 Juan Quintela
    s = migrate_get_current();
463 3dc85383 Luiz Capitulino
    s->bandwidth_limit = value;
464 442773ce Paolo Bonzini
    if (s->file) {
465 442773ce Paolo Bonzini
        qemu_file_set_rate_limit(s->file, s->bandwidth_limit / XFER_LIMIT_RATIO);
466 442773ce Paolo Bonzini
    }
467 cab30143 Juan Quintela
}
468 cab30143 Juan Quintela
469 4f0a993b Luiz Capitulino
void qmp_migrate_set_downtime(double value, Error **errp)
470 cab30143 Juan Quintela
{
471 4f0a993b Luiz Capitulino
    value *= 1e9;
472 4f0a993b Luiz Capitulino
    value = MAX(0, MIN(UINT64_MAX, value));
473 4f0a993b Luiz Capitulino
    max_downtime = (uint64_t)value;
474 99a0db9b Gerd Hoffmann
}
475 17ad9b35 Orit Wasserman
476 17ad9b35 Orit Wasserman
int migrate_use_xbzrle(void)
477 17ad9b35 Orit Wasserman
{
478 17ad9b35 Orit Wasserman
    MigrationState *s;
479 17ad9b35 Orit Wasserman
480 17ad9b35 Orit Wasserman
    s = migrate_get_current();
481 17ad9b35 Orit Wasserman
482 17ad9b35 Orit Wasserman
    return s->enabled_capabilities[MIGRATION_CAPABILITY_XBZRLE];
483 17ad9b35 Orit Wasserman
}
484 17ad9b35 Orit Wasserman
485 17ad9b35 Orit Wasserman
int64_t migrate_xbzrle_cache_size(void)
486 17ad9b35 Orit Wasserman
{
487 17ad9b35 Orit Wasserman
    MigrationState *s;
488 17ad9b35 Orit Wasserman
489 17ad9b35 Orit Wasserman
    s = migrate_get_current();
490 17ad9b35 Orit Wasserman
491 17ad9b35 Orit Wasserman
    return s->xbzrle_cache_size;
492 17ad9b35 Orit Wasserman
}
493 0d82d0e8 Juan Quintela
494 0d82d0e8 Juan Quintela
/* migration thread support */
495 0d82d0e8 Juan Quintela
496 5f496a1b Juan Quintela
static void *migration_thread(void *opaque)
497 0d82d0e8 Juan Quintela
{
498 9848a404 Juan Quintela
    MigrationState *s = opaque;
499 0d82d0e8 Juan Quintela
    int64_t initial_time = qemu_get_clock_ms(rt_clock);
500 be7172e2 Paolo Bonzini
    int64_t initial_bytes = 0;
501 0d82d0e8 Juan Quintela
    int64_t max_size = 0;
502 a3fa1d78 Paolo Bonzini
    int64_t start_time = initial_time;
503 a3fa1d78 Paolo Bonzini
    bool old_vm_running = false;
504 76f5933a Juan Quintela
505 76f5933a Juan Quintela
    DPRINTF("beginning savevm\n");
506 dba433c0 Paolo Bonzini
    qemu_savevm_state_begin(s->file, &s->params);
507 0d82d0e8 Juan Quintela
508 dba433c0 Paolo Bonzini
    while (s->state == MIG_STATE_ACTIVE) {
509 a3e879cd Juan Quintela
        int64_t current_time;
510 c369f40d Juan Quintela
        uint64_t pending_size;
511 0d82d0e8 Juan Quintela
512 a0ff044b Paolo Bonzini
        if (!qemu_file_rate_limit(s->file)) {
513 c369f40d Juan Quintela
            DPRINTF("iterate\n");
514 c369f40d Juan Quintela
            pending_size = qemu_savevm_state_pending(s->file, max_size);
515 c369f40d Juan Quintela
            DPRINTF("pending size %lu max %lu\n", pending_size, max_size);
516 b22ff1fb Juan Quintela
            if (pending_size && pending_size >= max_size) {
517 dba433c0 Paolo Bonzini
                qemu_savevm_state_iterate(s->file);
518 c369f40d Juan Quintela
            } else {
519 c369f40d Juan Quintela
                DPRINTF("done iterating\n");
520 32c835ba Paolo Bonzini
                qemu_mutex_lock_iothread();
521 c369f40d Juan Quintela
                start_time = qemu_get_clock_ms(rt_clock);
522 c369f40d Juan Quintela
                qemu_system_wakeup_request(QEMU_WAKEUP_REASON_OTHER);
523 a3fa1d78 Paolo Bonzini
                old_vm_running = runstate_is_running();
524 891518ab Paolo Bonzini
                vm_stop_force_state(RUN_STATE_FINISH_MIGRATE);
525 442773ce Paolo Bonzini
                qemu_file_set_rate_limit(s->file, INT_MAX);
526 dba433c0 Paolo Bonzini
                qemu_savevm_state_complete(s->file);
527 32c835ba Paolo Bonzini
                qemu_mutex_unlock_iothread();
528 059f896c Paolo Bonzini
                if (!qemu_file_get_error(s->file)) {
529 059f896c Paolo Bonzini
                    migrate_finish_set_state(s, MIG_STATE_COMPLETED);
530 059f896c Paolo Bonzini
                    break;
531 059f896c Paolo Bonzini
                }
532 c369f40d Juan Quintela
            }
533 c369f40d Juan Quintela
        }
534 f4410a5d Paolo Bonzini
535 fd45ee2c Paolo Bonzini
        if (qemu_file_get_error(s->file)) {
536 fd45ee2c Paolo Bonzini
            migrate_finish_set_state(s, MIG_STATE_ERROR);
537 fd45ee2c Paolo Bonzini
            break;
538 fd45ee2c Paolo Bonzini
        }
539 a3e879cd Juan Quintela
        current_time = qemu_get_clock_ms(rt_clock);
540 0d82d0e8 Juan Quintela
        if (current_time >= initial_time + BUFFER_DELAY) {
541 be7172e2 Paolo Bonzini
            uint64_t transferred_bytes = qemu_ftell(s->file) - initial_bytes;
542 77417f10 Michael Roth
            uint64_t time_spent = current_time - initial_time;
543 0d82d0e8 Juan Quintela
            double bandwidth = transferred_bytes / time_spent;
544 0d82d0e8 Juan Quintela
            max_size = bandwidth * migrate_max_downtime() / 1000000;
545 0d82d0e8 Juan Quintela
546 0d82d0e8 Juan Quintela
            DPRINTF("transferred %" PRIu64 " time_spent %" PRIu64
547 0d82d0e8 Juan Quintela
                    " bandwidth %g max_size %" PRId64 "\n",
548 0d82d0e8 Juan Quintela
                    transferred_bytes, time_spent, bandwidth, max_size);
549 90f8ae72 Juan Quintela
            /* if we haven't sent anything, we don't want to recalculate
550 90f8ae72 Juan Quintela
               10000 is a small enough number for our purposes */
551 90f8ae72 Juan Quintela
            if (s->dirty_bytes_rate && transferred_bytes > 10000) {
552 90f8ae72 Juan Quintela
                s->expected_downtime = s->dirty_bytes_rate / bandwidth;
553 90f8ae72 Juan Quintela
            }
554 0d82d0e8 Juan Quintela
555 1964a397 Paolo Bonzini
            qemu_file_reset_rate_limit(s->file);
556 0d82d0e8 Juan Quintela
            initial_time = current_time;
557 be7172e2 Paolo Bonzini
            initial_bytes = qemu_ftell(s->file);
558 0d82d0e8 Juan Quintela
        }
559 a0ff044b Paolo Bonzini
        if (qemu_file_rate_limit(s->file)) {
560 0d82d0e8 Juan Quintela
            /* usleep expects microseconds */
561 0d82d0e8 Juan Quintela
            g_usleep((initial_time + BUFFER_DELAY - current_time)*1000);
562 0d82d0e8 Juan Quintela
        }
563 a3fa1d78 Paolo Bonzini
    }
564 a3fa1d78 Paolo Bonzini
565 f4410a5d Paolo Bonzini
    qemu_mutex_lock_iothread();
566 a3fa1d78 Paolo Bonzini
    if (s->state == MIG_STATE_COMPLETED) {
567 a3fa1d78 Paolo Bonzini
        int64_t end_time = qemu_get_clock_ms(rt_clock);
568 a3fa1d78 Paolo Bonzini
        s->total_time = end_time - s->total_time;
569 a3fa1d78 Paolo Bonzini
        s->downtime = end_time - start_time;
570 a3fa1d78 Paolo Bonzini
        runstate_set(RUN_STATE_POSTMIGRATE);
571 a3fa1d78 Paolo Bonzini
    } else {
572 a3fa1d78 Paolo Bonzini
        if (old_vm_running) {
573 a3fa1d78 Paolo Bonzini
            vm_start();
574 dba433c0 Paolo Bonzini
        }
575 0d82d0e8 Juan Quintela
    }
576 bb1fadc4 Paolo Bonzini
    qemu_bh_schedule(s->cleanup_bh);
577 dba433c0 Paolo Bonzini
    qemu_mutex_unlock_iothread();
578 f4410a5d Paolo Bonzini
579 0d82d0e8 Juan Quintela
    return NULL;
580 0d82d0e8 Juan Quintela
}
581 0d82d0e8 Juan Quintela
582 9848a404 Juan Quintela
void migrate_fd_connect(MigrationState *s)
583 0d82d0e8 Juan Quintela
{
584 9848a404 Juan Quintela
    s->state = MIG_STATE_ACTIVE;
585 c09e5bb1 Kazuya Saito
    trace_migrate_set_state(MIG_STATE_ACTIVE);
586 c09e5bb1 Kazuya Saito
587 cc283e3b Juan Quintela
    /* This is a best 1st approximation. ns to ms */
588 cc283e3b Juan Quintela
    s->expected_downtime = max_downtime/1000000;
589 bb1fadc4 Paolo Bonzini
    s->cleanup_bh = qemu_bh_new(migrate_fd_cleanup, s);
590 0d82d0e8 Juan Quintela
591 442773ce Paolo Bonzini
    qemu_file_set_rate_limit(s->file,
592 442773ce Paolo Bonzini
                             s->bandwidth_limit / XFER_LIMIT_RATIO);
593 442773ce Paolo Bonzini
594 5f496a1b Juan Quintela
    qemu_thread_create(&s->thread, migration_thread, s,
595 bb1fadc4 Paolo Bonzini
                       QEMU_THREAD_JOINABLE);
596 0d3b26f5 Juan Quintela
    notifier_list_notify(&migration_state_notifiers, s);
597 0d82d0e8 Juan Quintela
}