]> git.proxmox.com Git - mirror_qemu.git/blame - include/migration/migration.h
Add a protective section footer
[mirror_qemu.git] / include / migration / migration.h
CommitLineData
5bb7910a
AL
1/*
2 * QEMU live migration
3 *
4 * Copyright IBM, Corp. 2008
5 *
6 * Authors:
7 * Anthony Liguori <aliguori@us.ibm.com>
8 *
9 * This work is licensed under the terms of the GNU GPL, version 2. See
10 * the COPYING file in the top-level directory.
11 *
12 */
13
14#ifndef QEMU_MIGRATION_H
15#define QEMU_MIGRATION_H
16
7b1b5d19 17#include "qapi/qmp/qdict.h"
376253ec 18#include "qemu-common.h"
9848a404 19#include "qemu/thread.h"
1de7afc9 20#include "qemu/notify.h"
7b1b5d19 21#include "qapi/error.h"
caf71f86 22#include "migration/vmstate.h"
bbf6da32 23#include "qapi-types.h"
43487c67 24#include "exec/cpu-common.h"
376253ec 25
b5503338
EH
26#define QEMU_VM_FILE_MAGIC 0x5145564d
27#define QEMU_VM_FILE_VERSION_COMPAT 0x00000002
28#define QEMU_VM_FILE_VERSION 0x00000003
29
30#define QEMU_VM_EOF 0x00
31#define QEMU_VM_SECTION_START 0x01
32#define QEMU_VM_SECTION_PART 0x02
33#define QEMU_VM_SECTION_END 0x03
34#define QEMU_VM_SECTION_FULL 0x04
35#define QEMU_VM_SUBSECTION 0x05
8118f095 36#define QEMU_VM_VMDESCRIPTION 0x06
f68945d4 37#define QEMU_VM_SECTION_FOOTER 0x7e
b5503338 38
6607ae23
IY
39struct MigrationParams {
40 bool blk;
41 bool shared;
42};
43
22f00a44 44typedef struct MigrationState MigrationState;
dc7acc61 45
1a8f46f8
DDAG
46typedef QLIST_HEAD(, LoadStateEntry) LoadStateEntry_Head;
47
bca7856a
DDAG
48/* State for the incoming migration */
49struct MigrationIncomingState {
50 QEMUFile *file;
1a8f46f8
DDAG
51
52 /* See savevm.c */
53 LoadStateEntry_Head loadvm_handlers;
bca7856a
DDAG
54};
55
56MigrationIncomingState *migration_incoming_get_current(void);
57MigrationIncomingState *migration_incoming_state_new(QEMUFile *f);
58void migration_incoming_state_destroy(void);
59
22f00a44 60struct MigrationState
065e2813 61{
065e2813 62 int64_t bandwidth_limit;
9848a404
JQ
63 size_t bytes_xfer;
64 size_t xfer_limit;
9848a404 65 QemuThread thread;
bb1fadc4 66 QEMUBH *cleanup_bh;
065e2813 67 QEMUFile *file;
43c60a81 68 int parameters[MIGRATION_PARAMETER_MAX];
f8bbc128 69
f8bbc128 70 int state;
6607ae23 71 MigrationParams params;
7e114f8c 72 double mbps;
d5f8a570 73 int64_t total_time;
9c5a9fcf 74 int64_t downtime;
2c52ddf1 75 int64_t expected_downtime;
8d017193 76 int64_t dirty_pages_rate;
90f8ae72 77 int64_t dirty_bytes_rate;
bbf6da32 78 bool enabled_capabilities[MIGRATION_CAPABILITY_MAX];
17ad9b35 79 int64_t xbzrle_cache_size;
ed4fbd10 80 int64_t setup_time;
58570ed8 81 int64_t dirty_sync_count;
065e2813
AL
82};
83
511c0231
JQ
84void process_incoming_migration(QEMUFile *f);
85
43eaae28 86void qemu_start_incoming_migration(const char *uri, Error **errp);
5bb7910a 87
a0a3fd60
GC
88uint64_t migrate_max_downtime(void);
89
43eaae28 90void exec_start_incoming_migration(const char *host_port, Error **errp);
065e2813 91
f37afb5a 92void exec_start_outgoing_migration(MigrationState *s, const char *host_port, Error **errp);
065e2813 93
43eaae28 94void tcp_start_incoming_migration(const char *host_port, Error **errp);
34c9dd8e 95
f37afb5a 96void tcp_start_outgoing_migration(MigrationState *s, const char *host_port, Error **errp);
34c9dd8e 97
43eaae28 98void unix_start_incoming_migration(const char *path, Error **errp);
4951f65b 99
f37afb5a 100void unix_start_outgoing_migration(MigrationState *s, const char *path, Error **errp);
4951f65b 101
43eaae28 102void fd_start_incoming_migration(const char *path, Error **errp);
5ac1fad3 103
f37afb5a 104void fd_start_outgoing_migration(MigrationState *s, const char *fdname, Error **errp);
5ac1fad3 105
2da776db
MH
106void rdma_start_outgoing_migration(void *opaque, const char *host_port, Error **errp);
107
108void rdma_start_incoming_migration(const char *host_port, Error **errp);
109
22f00a44 110void migrate_fd_error(MigrationState *s);
065e2813 111
22f00a44 112void migrate_fd_connect(MigrationState *s);
065e2813 113
11c76741 114int migrate_fd_close(MigrationState *s);
c87b015b 115
99a0db9b
GH
116void add_migration_state_change_notifier(Notifier *notify);
117void remove_migration_state_change_notifier(Notifier *notify);
02edd2e7 118bool migration_in_setup(MigrationState *);
7073693b 119bool migration_has_finished(MigrationState *);
afe2df69 120bool migration_has_failed(MigrationState *);
859bc756 121MigrationState *migrate_get_current(void);
99a0db9b 122
8706d2d5
LL
123void migrate_compress_threads_create(void);
124void migrate_compress_threads_join(void);
3fcb38c2
LL
125void migrate_decompress_threads_create(void);
126void migrate_decompress_threads_join(void);
adc56dda
BS
127uint64_t ram_bytes_remaining(void);
128uint64_t ram_bytes_transferred(void);
129uint64_t ram_bytes_total(void);
905f26f2 130void free_xbzrle_decoded_buf(void);
adc56dda 131
2b0ce079
MH
132void acct_update_position(QEMUFile *f, size_t size, bool zero);
133
004d4c10
OW
134uint64_t dup_mig_bytes_transferred(void);
135uint64_t dup_mig_pages_transferred(void);
f1c72795
PL
136uint64_t skipped_mig_bytes_transferred(void);
137uint64_t skipped_mig_pages_transferred(void);
004d4c10
OW
138uint64_t norm_mig_bytes_transferred(void);
139uint64_t norm_mig_pages_transferred(void);
f36d55af
OW
140uint64_t xbzrle_mig_bytes_transferred(void);
141uint64_t xbzrle_mig_pages_transferred(void);
142uint64_t xbzrle_mig_pages_overflow(void);
143uint64_t xbzrle_mig_pages_cache_miss(void);
8bc39233 144double xbzrle_mig_cache_miss_rate(void);
004d4c10 145
44c3b58c
MH
146void ram_handle_compressed(void *host, uint8_t ch, uint64_t size);
147
fa2756b7
AL
148/**
149 * @migrate_add_blocker - prevent migration from proceeding
150 *
151 * @reason - an error to be returned whenever migration is attempted
152 */
153void migrate_add_blocker(Error *reason);
154
155/**
156 * @migrate_del_blocker - remove a blocking error from migration
157 *
158 * @reason - the error blocking migration
159 */
160void migrate_del_blocker(Error *reason);
161
323004a3 162bool migrate_zero_blocks(void);
60d9222c 163
bde1e2ec
CV
164bool migrate_auto_converge(void);
165
302dfbeb
OW
166int xbzrle_encode_buffer(uint8_t *old_buf, uint8_t *new_buf, int slen,
167 uint8_t *dst, int dlen);
168int xbzrle_decode_buffer(uint8_t *src, int slen, uint8_t *dst, int dlen);
169
17ad9b35
OW
170int migrate_use_xbzrle(void);
171int64_t migrate_xbzrle_cache_size(void);
172
9e1ba4cc 173int64_t xbzrle_cache_resize(int64_t new_size);
43487c67 174
8706d2d5
LL
175bool migrate_use_compression(void);
176int migrate_compress_level(void);
177int migrate_compress_threads(void);
3fcb38c2 178int migrate_decompress_threads(void);
8706d2d5 179
43487c67
MH
180void ram_control_before_iterate(QEMUFile *f, uint64_t flags);
181void ram_control_after_iterate(QEMUFile *f, uint64_t flags);
182void ram_control_load_hook(QEMUFile *f, uint64_t flags);
183
184/* Whenever this is found in the data stream, the flags
185 * will be passed to ram_control_load_hook in the incoming-migration
186 * side. This lets before_ram_iterate/after_ram_iterate add
187 * transport-specific sections to the RAM migration data.
188 */
189#define RAM_SAVE_FLAG_HOOK 0x80
190
191#define RAM_SAVE_CONTROL_NOT_SUPP -1000
192#define RAM_SAVE_CONTROL_DELAYED -2000
193
194size_t ram_control_save_page(QEMUFile *f, ram_addr_t block_offset,
195 ram_addr_t offset, size_t size,
6e1dea46 196 uint64_t *bytes_sent);
43487c67 197
56e93d26 198void ram_mig_init(void);
37fb569c 199void savevm_skip_section_footers(void);
5bb7910a 200#endif