Statistics
| Branch: | Revision:

root / migration.c @ b09ea7d5

History | View | Annotate | Download (7.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 5bb7910a aliguori
 */
13 5bb7910a aliguori
14 5bb7910a aliguori
#include "qemu-common.h"
15 5bb7910a aliguori
#include "migration.h"
16 376253ec aliguori
#include "monitor.h"
17 065e2813 aliguori
#include "buffered_file.h"
18 065e2813 aliguori
#include "sysemu.h"
19 065e2813 aliguori
#include "block.h"
20 065e2813 aliguori
#include "qemu_socket.h"
21 065e2813 aliguori
22 065e2813 aliguori
//#define DEBUG_MIGRATION
23 065e2813 aliguori
24 065e2813 aliguori
#ifdef DEBUG_MIGRATION
25 065e2813 aliguori
#define dprintf(fmt, ...) \
26 065e2813 aliguori
    do { printf("migration: " fmt, ## __VA_ARGS__); } while (0)
27 065e2813 aliguori
#else
28 065e2813 aliguori
#define dprintf(fmt, ...) \
29 065e2813 aliguori
    do { } while (0)
30 065e2813 aliguori
#endif
31 5bb7910a aliguori
32 5bb7910a aliguori
/* Migration speed throttling */
33 5bb7910a aliguori
static uint32_t max_throttle = (32 << 20);
34 5bb7910a aliguori
35 5bb7910a aliguori
static MigrationState *current_migration;
36 5bb7910a aliguori
37 5bb7910a aliguori
void qemu_start_incoming_migration(const char *uri)
38 5bb7910a aliguori
{
39 34c9dd8e aliguori
    const char *p;
40 34c9dd8e aliguori
41 34c9dd8e aliguori
    if (strstart(uri, "tcp:", &p))
42 34c9dd8e aliguori
        tcp_start_incoming_migration(p);
43 065e2813 aliguori
#if !defined(WIN32)
44 065e2813 aliguori
    else if (strstart(uri, "exec:", &p))
45 065e2813 aliguori
        exec_start_incoming_migration(p);
46 065e2813 aliguori
#endif
47 34c9dd8e aliguori
    else
48 34c9dd8e aliguori
        fprintf(stderr, "unknown migration protocol: %s\n", uri);
49 5bb7910a aliguori
}
50 5bb7910a aliguori
51 376253ec aliguori
void do_migrate(Monitor *mon, int detach, const char *uri)
52 5bb7910a aliguori
{
53 34c9dd8e aliguori
    MigrationState *s = NULL;
54 34c9dd8e aliguori
    const char *p;
55 34c9dd8e aliguori
56 34c9dd8e aliguori
    if (strstart(uri, "tcp:", &p))
57 ff8d81d8 aliguori
        s = tcp_start_outgoing_migration(p, max_throttle, detach);
58 065e2813 aliguori
#if !defined(WIN32)
59 065e2813 aliguori
    else if (strstart(uri, "exec:", &p))
60 065e2813 aliguori
        s = exec_start_outgoing_migration(p, max_throttle, detach);
61 065e2813 aliguori
#endif
62 34c9dd8e aliguori
    else
63 376253ec aliguori
        monitor_printf(mon, "unknown migration protocol: %s\n", uri);
64 34c9dd8e aliguori
65 34c9dd8e aliguori
    if (s == NULL)
66 376253ec aliguori
        monitor_printf(mon, "migration failed\n");
67 34c9dd8e aliguori
    else {
68 ff8d81d8 aliguori
        if (current_migration)
69 ff8d81d8 aliguori
            current_migration->release(current_migration);
70 34c9dd8e aliguori
71 ff8d81d8 aliguori
        current_migration = s;
72 34c9dd8e aliguori
    }
73 5bb7910a aliguori
}
74 5bb7910a aliguori
75 376253ec aliguori
void do_migrate_cancel(Monitor *mon)
76 5bb7910a aliguori
{
77 5bb7910a aliguori
    MigrationState *s = current_migration;
78 5bb7910a aliguori
79 5bb7910a aliguori
    if (s)
80 ff8d81d8 aliguori
        s->cancel(s);
81 5bb7910a aliguori
}
82 5bb7910a aliguori
83 376253ec aliguori
void do_migrate_set_speed(Monitor *mon, const char *value)
84 5bb7910a aliguori
{
85 5bb7910a aliguori
    double d;
86 5bb7910a aliguori
    char *ptr;
87 daa91de2 Glauber Costa
    FdMigrationState *s;
88 5bb7910a aliguori
89 5bb7910a aliguori
    d = strtod(value, &ptr);
90 5bb7910a aliguori
    switch (*ptr) {
91 5bb7910a aliguori
    case 'G': case 'g':
92 ff8d81d8 aliguori
        d *= 1024;
93 5bb7910a aliguori
    case 'M': case 'm':
94 ff8d81d8 aliguori
        d *= 1024;
95 5bb7910a aliguori
    case 'K': case 'k':
96 ff8d81d8 aliguori
        d *= 1024;
97 5bb7910a aliguori
    default:
98 ff8d81d8 aliguori
        break;
99 5bb7910a aliguori
    }
100 5bb7910a aliguori
101 5bb7910a aliguori
    max_throttle = (uint32_t)d;
102 daa91de2 Glauber Costa
    s = migrate_to_fms(current_migration);
103 daa91de2 Glauber Costa
104 daa91de2 Glauber Costa
    if (s) {
105 daa91de2 Glauber Costa
        qemu_file_set_rate_limit(s->file, max_throttle);
106 daa91de2 Glauber Costa
    }
107 daa91de2 Glauber Costa
    
108 5bb7910a aliguori
}
109 5bb7910a aliguori
110 a0a3fd60 Glauber Costa
/* amount of nanoseconds we are willing to wait for migration to be down.
111 a0a3fd60 Glauber Costa
 * the choice of nanoseconds is because it is the maximum resolution that
112 a0a3fd60 Glauber Costa
 * get_clock() can achieve. It is an internal measure. All user-visible
113 a0a3fd60 Glauber Costa
 * units must be in seconds */
114 a0a3fd60 Glauber Costa
static uint64_t max_downtime = 30000000;
115 a0a3fd60 Glauber Costa
116 a0a3fd60 Glauber Costa
uint64_t migrate_max_downtime(void)
117 a0a3fd60 Glauber Costa
{
118 a0a3fd60 Glauber Costa
    return max_downtime;
119 a0a3fd60 Glauber Costa
}
120 a0a3fd60 Glauber Costa
121 2ea42952 Glauber Costa
void do_migrate_set_downtime(Monitor *mon, const char *value)
122 2ea42952 Glauber Costa
{
123 2ea42952 Glauber Costa
    char *ptr;
124 2ea42952 Glauber Costa
    double d;
125 2ea42952 Glauber Costa
126 2ea42952 Glauber Costa
    d = strtod(value, &ptr);
127 2ea42952 Glauber Costa
    if (!strcmp(ptr,"ms")) {
128 2ea42952 Glauber Costa
        d *= 1000000;
129 2ea42952 Glauber Costa
    } else if (!strcmp(ptr,"us")) {
130 2ea42952 Glauber Costa
        d *= 1000;
131 2ea42952 Glauber Costa
    } else if (!strcmp(ptr,"ns")) {
132 2ea42952 Glauber Costa
    } else {
133 2ea42952 Glauber Costa
        /* all else considered to be seconds */
134 2ea42952 Glauber Costa
        d *= 1000000000;
135 2ea42952 Glauber Costa
    }
136 2ea42952 Glauber Costa
137 2ea42952 Glauber Costa
    max_downtime = (uint64_t)d;
138 2ea42952 Glauber Costa
}
139 2ea42952 Glauber Costa
140 376253ec aliguori
void do_info_migrate(Monitor *mon)
141 5bb7910a aliguori
{
142 5bb7910a aliguori
    MigrationState *s = current_migration;
143 376253ec aliguori
144 5bb7910a aliguori
    if (s) {
145 376253ec aliguori
        monitor_printf(mon, "Migration status: ");
146 ff8d81d8 aliguori
        switch (s->get_status(s)) {
147 ff8d81d8 aliguori
        case MIG_STATE_ACTIVE:
148 376253ec aliguori
            monitor_printf(mon, "active\n");
149 9f9e28cd Glauber Costa
            monitor_printf(mon, "transferred ram: %" PRIu64 " kbytes\n", ram_bytes_transferred() >> 10);
150 9f9e28cd Glauber Costa
            monitor_printf(mon, "remaining ram: %" PRIu64 " kbytes\n", ram_bytes_remaining() >> 10);
151 9f9e28cd Glauber Costa
            monitor_printf(mon, "total ram: %" PRIu64 " kbytes\n", ram_bytes_total() >> 10);
152 ff8d81d8 aliguori
            break;
153 ff8d81d8 aliguori
        case MIG_STATE_COMPLETED:
154 376253ec aliguori
            monitor_printf(mon, "completed\n");
155 ff8d81d8 aliguori
            break;
156 ff8d81d8 aliguori
        case MIG_STATE_ERROR:
157 376253ec aliguori
            monitor_printf(mon, "failed\n");
158 ff8d81d8 aliguori
            break;
159 ff8d81d8 aliguori
        case MIG_STATE_CANCELLED:
160 376253ec aliguori
            monitor_printf(mon, "cancelled\n");
161 ff8d81d8 aliguori
            break;
162 ff8d81d8 aliguori
        }
163 5bb7910a aliguori
    }
164 5bb7910a aliguori
}
165 5bb7910a aliguori
166 065e2813 aliguori
/* shared migration helpers */
167 065e2813 aliguori
168 731b0364 aliguori
void migrate_fd_monitor_suspend(FdMigrationState *s)
169 731b0364 aliguori
{
170 731b0364 aliguori
    s->mon_resume = cur_mon;
171 cde76ee1 aliguori
    if (monitor_suspend(cur_mon) == 0)
172 cde76ee1 aliguori
        dprintf("suspending monitor\n");
173 cde76ee1 aliguori
    else
174 cde76ee1 aliguori
        monitor_printf(cur_mon, "terminal does not allow synchronous "
175 cde76ee1 aliguori
                       "migration, continuing detached\n");
176 731b0364 aliguori
}
177 731b0364 aliguori
178 065e2813 aliguori
void migrate_fd_error(FdMigrationState *s)
179 065e2813 aliguori
{
180 065e2813 aliguori
    dprintf("setting error state\n");
181 065e2813 aliguori
    s->state = MIG_STATE_ERROR;
182 065e2813 aliguori
    migrate_fd_cleanup(s);
183 065e2813 aliguori
}
184 065e2813 aliguori
185 065e2813 aliguori
void migrate_fd_cleanup(FdMigrationState *s)
186 065e2813 aliguori
{
187 065e2813 aliguori
    qemu_set_fd_handler2(s->fd, NULL, NULL, NULL, NULL);
188 065e2813 aliguori
189 065e2813 aliguori
    if (s->file) {
190 065e2813 aliguori
        dprintf("closing file\n");
191 065e2813 aliguori
        qemu_fclose(s->file);
192 065e2813 aliguori
    }
193 065e2813 aliguori
194 065e2813 aliguori
    if (s->fd != -1)
195 065e2813 aliguori
        close(s->fd);
196 065e2813 aliguori
197 065e2813 aliguori
    /* Don't resume monitor until we've flushed all of the buffers */
198 731b0364 aliguori
    if (s->mon_resume)
199 731b0364 aliguori
        monitor_resume(s->mon_resume);
200 065e2813 aliguori
201 065e2813 aliguori
    s->fd = -1;
202 065e2813 aliguori
}
203 065e2813 aliguori
204 065e2813 aliguori
void migrate_fd_put_notify(void *opaque)
205 065e2813 aliguori
{
206 065e2813 aliguori
    FdMigrationState *s = opaque;
207 065e2813 aliguori
208 065e2813 aliguori
    qemu_set_fd_handler2(s->fd, NULL, NULL, NULL, NULL);
209 065e2813 aliguori
    qemu_file_put_notify(s->file);
210 065e2813 aliguori
}
211 065e2813 aliguori
212 065e2813 aliguori
ssize_t migrate_fd_put_buffer(void *opaque, const void *data, size_t size)
213 065e2813 aliguori
{
214 065e2813 aliguori
    FdMigrationState *s = opaque;
215 065e2813 aliguori
    ssize_t ret;
216 065e2813 aliguori
217 065e2813 aliguori
    do {
218 065e2813 aliguori
        ret = s->write(s, data, size);
219 95b134ea Uri Lublin
    } while (ret == -1 && ((s->get_error(s)) == EINTR));
220 065e2813 aliguori
221 065e2813 aliguori
    if (ret == -1)
222 065e2813 aliguori
        ret = -(s->get_error(s));
223 065e2813 aliguori
224 065e2813 aliguori
    if (ret == -EAGAIN)
225 065e2813 aliguori
        qemu_set_fd_handler2(s->fd, NULL, NULL, migrate_fd_put_notify, s);
226 065e2813 aliguori
227 065e2813 aliguori
    return ret;
228 065e2813 aliguori
}
229 065e2813 aliguori
230 065e2813 aliguori
void migrate_fd_connect(FdMigrationState *s)
231 065e2813 aliguori
{
232 065e2813 aliguori
    int ret;
233 065e2813 aliguori
234 065e2813 aliguori
    s->file = qemu_fopen_ops_buffered(s,
235 065e2813 aliguori
                                      s->bandwidth_limit,
236 065e2813 aliguori
                                      migrate_fd_put_buffer,
237 065e2813 aliguori
                                      migrate_fd_put_ready,
238 065e2813 aliguori
                                      migrate_fd_wait_for_unfreeze,
239 065e2813 aliguori
                                      migrate_fd_close);
240 065e2813 aliguori
241 065e2813 aliguori
    dprintf("beginning savevm\n");
242 065e2813 aliguori
    ret = qemu_savevm_state_begin(s->file);
243 065e2813 aliguori
    if (ret < 0) {
244 065e2813 aliguori
        dprintf("failed, %d\n", ret);
245 065e2813 aliguori
        migrate_fd_error(s);
246 065e2813 aliguori
        return;
247 065e2813 aliguori
    }
248 065e2813 aliguori
249 065e2813 aliguori
    migrate_fd_put_ready(s);
250 065e2813 aliguori
}
251 065e2813 aliguori
252 065e2813 aliguori
void migrate_fd_put_ready(void *opaque)
253 065e2813 aliguori
{
254 065e2813 aliguori
    FdMigrationState *s = opaque;
255 065e2813 aliguori
256 065e2813 aliguori
    if (s->state != MIG_STATE_ACTIVE) {
257 065e2813 aliguori
        dprintf("put_ready returning because of non-active state\n");
258 065e2813 aliguori
        return;
259 065e2813 aliguori
    }
260 065e2813 aliguori
261 065e2813 aliguori
    dprintf("iterate\n");
262 065e2813 aliguori
    if (qemu_savevm_state_iterate(s->file) == 1) {
263 b161d123 aliguori
        int state;
264 065e2813 aliguori
        dprintf("done iterating\n");
265 065e2813 aliguori
        vm_stop(0);
266 065e2813 aliguori
267 065e2813 aliguori
        bdrv_flush_all();
268 b161d123 aliguori
        if ((qemu_savevm_state_complete(s->file)) < 0) {
269 b161d123 aliguori
            vm_start();
270 b161d123 aliguori
            state = MIG_STATE_ERROR;
271 b161d123 aliguori
        } else {
272 b161d123 aliguori
            state = MIG_STATE_COMPLETED;
273 b161d123 aliguori
        }
274 065e2813 aliguori
        migrate_fd_cleanup(s);
275 b161d123 aliguori
        s->state = state;
276 065e2813 aliguori
    }
277 065e2813 aliguori
}
278 065e2813 aliguori
279 065e2813 aliguori
int migrate_fd_get_status(MigrationState *mig_state)
280 065e2813 aliguori
{
281 065e2813 aliguori
    FdMigrationState *s = migrate_to_fms(mig_state);
282 065e2813 aliguori
    return s->state;
283 065e2813 aliguori
}
284 065e2813 aliguori
285 065e2813 aliguori
void migrate_fd_cancel(MigrationState *mig_state)
286 065e2813 aliguori
{
287 065e2813 aliguori
    FdMigrationState *s = migrate_to_fms(mig_state);
288 065e2813 aliguori
289 065e2813 aliguori
    if (s->state != MIG_STATE_ACTIVE)
290 065e2813 aliguori
        return;
291 065e2813 aliguori
292 065e2813 aliguori
    dprintf("cancelling migration\n");
293 065e2813 aliguori
294 065e2813 aliguori
    s->state = MIG_STATE_CANCELLED;
295 065e2813 aliguori
296 065e2813 aliguori
    migrate_fd_cleanup(s);
297 065e2813 aliguori
}
298 065e2813 aliguori
299 065e2813 aliguori
void migrate_fd_release(MigrationState *mig_state)
300 065e2813 aliguori
{
301 065e2813 aliguori
    FdMigrationState *s = migrate_to_fms(mig_state);
302 065e2813 aliguori
303 065e2813 aliguori
    dprintf("releasing state\n");
304 065e2813 aliguori
   
305 065e2813 aliguori
    if (s->state == MIG_STATE_ACTIVE) {
306 065e2813 aliguori
        s->state = MIG_STATE_CANCELLED;
307 065e2813 aliguori
        migrate_fd_cleanup(s);
308 065e2813 aliguori
    }
309 065e2813 aliguori
    free(s);
310 065e2813 aliguori
}
311 065e2813 aliguori
312 065e2813 aliguori
void migrate_fd_wait_for_unfreeze(void *opaque)
313 065e2813 aliguori
{
314 065e2813 aliguori
    FdMigrationState *s = opaque;
315 065e2813 aliguori
    int ret;
316 065e2813 aliguori
317 065e2813 aliguori
    dprintf("wait for unfreeze\n");
318 065e2813 aliguori
    if (s->state != MIG_STATE_ACTIVE)
319 065e2813 aliguori
        return;
320 065e2813 aliguori
321 065e2813 aliguori
    do {
322 065e2813 aliguori
        fd_set wfds;
323 065e2813 aliguori
324 065e2813 aliguori
        FD_ZERO(&wfds);
325 065e2813 aliguori
        FD_SET(s->fd, &wfds);
326 065e2813 aliguori
327 065e2813 aliguori
        ret = select(s->fd + 1, NULL, &wfds, NULL, NULL);
328 065e2813 aliguori
    } while (ret == -1 && (s->get_error(s)) == EINTR);
329 065e2813 aliguori
}
330 065e2813 aliguori
331 065e2813 aliguori
int migrate_fd_close(void *opaque)
332 065e2813 aliguori
{
333 065e2813 aliguori
    FdMigrationState *s = opaque;
334 e19252d3 Uri Lublin
335 e19252d3 Uri Lublin
    qemu_set_fd_handler2(s->fd, NULL, NULL, NULL, NULL);
336 065e2813 aliguori
    return s->close(s);
337 065e2813 aliguori
}