Statistics
| Branch: | Revision:

root / migration.c @ 2da776db

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