aliguori | 5bb7910 | 2008-10-13 03:12:02 +0000 | [diff] [blame] | 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 | |
Paolo Bonzini | 7b1b5d1 | 2012-12-17 18:19:43 +0100 | [diff] [blame] | 17 | #include "qapi/qmp/qdict.h" |
aliguori | 376253e | 2009-03-05 23:01:23 +0000 | [diff] [blame] | 18 | #include "qemu-common.h" |
Juan Quintela | 9848a40 | 2012-12-19 09:55:50 +0100 | [diff] [blame] | 19 | #include "qemu/thread.h" |
Paolo Bonzini | 1de7afc | 2012-12-17 18:20:00 +0100 | [diff] [blame] | 20 | #include "qemu/notify.h" |
Paolo Bonzini | 7b1b5d1 | 2012-12-17 18:19:43 +0100 | [diff] [blame] | 21 | #include "qapi/error.h" |
Paolo Bonzini | caf71f8 | 2012-12-17 18:19:50 +0100 | [diff] [blame] | 22 | #include "migration/vmstate.h" |
Orit Wasserman | bbf6da3 | 2012-08-06 21:42:47 +0300 | [diff] [blame] | 23 | #include "qapi-types.h" |
aliguori | 376253e | 2009-03-05 23:01:23 +0000 | [diff] [blame] | 24 | |
Isaku Yamahata | 6607ae2 | 2012-06-19 18:43:09 +0300 | [diff] [blame] | 25 | struct MigrationParams { |
| 26 | bool blk; |
| 27 | bool shared; |
| 28 | }; |
| 29 | |
Juan Quintela | 22f00a4 | 2010-05-11 15:56:35 +0200 | [diff] [blame] | 30 | typedef struct MigrationState MigrationState; |
Juan Quintela | dc7acc6 | 2010-05-11 15:46:39 +0200 | [diff] [blame] | 31 | |
Juan Quintela | 22f00a4 | 2010-05-11 15:56:35 +0200 | [diff] [blame] | 32 | struct MigrationState |
aliguori | 065e281 | 2008-11-11 16:46:33 +0000 | [diff] [blame] | 33 | { |
aliguori | 065e281 | 2008-11-11 16:46:33 +0000 | [diff] [blame] | 34 | int64_t bandwidth_limit; |
Juan Quintela | 9848a40 | 2012-12-19 09:55:50 +0100 | [diff] [blame] | 35 | size_t bytes_xfer; |
| 36 | size_t xfer_limit; |
Juan Quintela | 9848a40 | 2012-12-19 09:55:50 +0100 | [diff] [blame] | 37 | QemuThread thread; |
Paolo Bonzini | bb1fadc | 2013-02-22 17:36:21 +0100 | [diff] [blame] | 38 | QEMUBH *cleanup_bh; |
aliguori | 065e281 | 2008-11-11 16:46:33 +0000 | [diff] [blame] | 39 | QEMUFile *file; |
Paolo Bonzini | f8bbc12 | 2013-02-22 17:36:41 +0100 | [diff] [blame] | 40 | |
Paolo Bonzini | f8bbc12 | 2013-02-22 17:36:41 +0100 | [diff] [blame] | 41 | int state; |
Isaku Yamahata | 6607ae2 | 2012-06-19 18:43:09 +0300 | [diff] [blame] | 42 | MigrationParams params; |
Juan Quintela | d5f8a57 | 2012-05-21 22:01:07 +0200 | [diff] [blame] | 43 | int64_t total_time; |
Juan Quintela | 9c5a9fc | 2012-08-13 09:35:16 +0200 | [diff] [blame] | 44 | int64_t downtime; |
Juan Quintela | 2c52ddf | 2012-08-13 09:53:12 +0200 | [diff] [blame] | 45 | int64_t expected_downtime; |
Juan Quintela | 8d01719 | 2012-08-13 12:31:25 +0200 | [diff] [blame] | 46 | int64_t dirty_pages_rate; |
Juan Quintela | 90f8ae7 | 2013-02-01 13:22:37 +0100 | [diff] [blame] | 47 | int64_t dirty_bytes_rate; |
Orit Wasserman | bbf6da3 | 2012-08-06 21:42:47 +0300 | [diff] [blame] | 48 | bool enabled_capabilities[MIGRATION_CAPABILITY_MAX]; |
Orit Wasserman | 17ad9b3 | 2012-08-06 21:42:53 +0300 | [diff] [blame] | 49 | int64_t xbzrle_cache_size; |
aliguori | 065e281 | 2008-11-11 16:46:33 +0000 | [diff] [blame] | 50 | }; |
| 51 | |
Juan Quintela | 511c023 | 2010-06-09 14:10:55 +0200 | [diff] [blame] | 52 | void process_incoming_migration(QEMUFile *f); |
| 53 | |
Paolo Bonzini | 43eaae2 | 2012-10-02 18:21:18 +0200 | [diff] [blame] | 54 | void qemu_start_incoming_migration(const char *uri, Error **errp); |
aliguori | 5bb7910 | 2008-10-13 03:12:02 +0000 | [diff] [blame] | 55 | |
Glauber Costa | a0a3fd6 | 2009-05-28 15:22:57 -0400 | [diff] [blame] | 56 | uint64_t migrate_max_downtime(void); |
| 57 | |
Luiz Capitulino | c86a668 | 2009-12-10 17:16:05 -0200 | [diff] [blame] | 58 | void do_info_migrate_print(Monitor *mon, const QObject *data); |
| 59 | |
| 60 | void do_info_migrate(Monitor *mon, QObject **ret_data); |
aliguori | 5bb7910 | 2008-10-13 03:12:02 +0000 | [diff] [blame] | 61 | |
Paolo Bonzini | 43eaae2 | 2012-10-02 18:21:18 +0200 | [diff] [blame] | 62 | void exec_start_incoming_migration(const char *host_port, Error **errp); |
aliguori | 065e281 | 2008-11-11 16:46:33 +0000 | [diff] [blame] | 63 | |
Paolo Bonzini | f37afb5 | 2012-10-02 10:02:46 +0200 | [diff] [blame] | 64 | void exec_start_outgoing_migration(MigrationState *s, const char *host_port, Error **errp); |
aliguori | 065e281 | 2008-11-11 16:46:33 +0000 | [diff] [blame] | 65 | |
Paolo Bonzini | 43eaae2 | 2012-10-02 18:21:18 +0200 | [diff] [blame] | 66 | void tcp_start_incoming_migration(const char *host_port, Error **errp); |
aliguori | 34c9dd8 | 2008-10-13 03:14:31 +0000 | [diff] [blame] | 67 | |
Paolo Bonzini | f37afb5 | 2012-10-02 10:02:46 +0200 | [diff] [blame] | 68 | void tcp_start_outgoing_migration(MigrationState *s, const char *host_port, Error **errp); |
aliguori | 34c9dd8 | 2008-10-13 03:14:31 +0000 | [diff] [blame] | 69 | |
Paolo Bonzini | 43eaae2 | 2012-10-02 18:21:18 +0200 | [diff] [blame] | 70 | void unix_start_incoming_migration(const char *path, Error **errp); |
Chris Lalancette | 4951f65 | 2009-08-05 17:24:29 +0200 | [diff] [blame] | 71 | |
Paolo Bonzini | f37afb5 | 2012-10-02 10:02:46 +0200 | [diff] [blame] | 72 | void unix_start_outgoing_migration(MigrationState *s, const char *path, Error **errp); |
Chris Lalancette | 4951f65 | 2009-08-05 17:24:29 +0200 | [diff] [blame] | 73 | |
Paolo Bonzini | 43eaae2 | 2012-10-02 18:21:18 +0200 | [diff] [blame] | 74 | void fd_start_incoming_migration(const char *path, Error **errp); |
Paolo Bonzini | 5ac1fad | 2009-08-18 15:56:25 +0200 | [diff] [blame] | 75 | |
Paolo Bonzini | f37afb5 | 2012-10-02 10:02:46 +0200 | [diff] [blame] | 76 | void fd_start_outgoing_migration(MigrationState *s, const char *fdname, Error **errp); |
Paolo Bonzini | 5ac1fad | 2009-08-18 15:56:25 +0200 | [diff] [blame] | 77 | |
Juan Quintela | 22f00a4 | 2010-05-11 15:56:35 +0200 | [diff] [blame] | 78 | void migrate_fd_error(MigrationState *s); |
aliguori | 065e281 | 2008-11-11 16:46:33 +0000 | [diff] [blame] | 79 | |
Juan Quintela | 22f00a4 | 2010-05-11 15:56:35 +0200 | [diff] [blame] | 80 | void migrate_fd_connect(MigrationState *s); |
aliguori | 065e281 | 2008-11-11 16:46:33 +0000 | [diff] [blame] | 81 | |
Juan Quintela | 11c7674 | 2012-07-20 13:19:36 +0200 | [diff] [blame] | 82 | int migrate_fd_close(MigrationState *s); |
Juan Quintela | c87b015 | 2012-07-20 13:10:54 +0200 | [diff] [blame] | 83 | |
Gerd Hoffmann | 99a0db9 | 2010-12-13 17:30:12 +0100 | [diff] [blame] | 84 | void add_migration_state_change_notifier(Notifier *notify); |
| 85 | void remove_migration_state_change_notifier(Notifier *notify); |
Gerd Hoffmann | afe2df6 | 2011-10-25 13:50:11 +0200 | [diff] [blame] | 86 | bool migration_is_active(MigrationState *); |
Juan Quintela | 7073693 | 2011-02-23 00:43:59 +0100 | [diff] [blame] | 87 | bool migration_has_finished(MigrationState *); |
Gerd Hoffmann | afe2df6 | 2011-10-25 13:50:11 +0200 | [diff] [blame] | 88 | bool migration_has_failed(MigrationState *); |
Juan Quintela | 859bc75 | 2012-08-13 09:42:49 +0200 | [diff] [blame] | 89 | MigrationState *migrate_get_current(void); |
Gerd Hoffmann | 99a0db9 | 2010-12-13 17:30:12 +0100 | [diff] [blame] | 90 | |
Blue Swirl | adc56dd | 2011-04-03 08:23:19 +0000 | [diff] [blame] | 91 | uint64_t ram_bytes_remaining(void); |
| 92 | uint64_t ram_bytes_transferred(void); |
| 93 | uint64_t ram_bytes_total(void); |
| 94 | |
Juan Quintela | 7908c78 | 2012-06-26 18:46:10 +0200 | [diff] [blame] | 95 | extern SaveVMHandlers savevm_ram_handlers; |
Blue Swirl | adc56dd | 2011-04-03 08:23:19 +0000 | [diff] [blame] | 96 | |
Orit Wasserman | 004d4c1 | 2012-08-06 21:42:56 +0300 | [diff] [blame] | 97 | uint64_t dup_mig_bytes_transferred(void); |
| 98 | uint64_t dup_mig_pages_transferred(void); |
Peter Lieven | f1c7279 | 2013-03-26 10:58:37 +0100 | [diff] [blame] | 99 | uint64_t skipped_mig_bytes_transferred(void); |
| 100 | uint64_t skipped_mig_pages_transferred(void); |
Orit Wasserman | 004d4c1 | 2012-08-06 21:42:56 +0300 | [diff] [blame] | 101 | uint64_t norm_mig_bytes_transferred(void); |
| 102 | uint64_t norm_mig_pages_transferred(void); |
Orit Wasserman | f36d55a | 2012-08-06 21:42:57 +0300 | [diff] [blame] | 103 | uint64_t xbzrle_mig_bytes_transferred(void); |
| 104 | uint64_t xbzrle_mig_pages_transferred(void); |
| 105 | uint64_t xbzrle_mig_pages_overflow(void); |
| 106 | uint64_t xbzrle_mig_pages_cache_miss(void); |
Orit Wasserman | 004d4c1 | 2012-08-06 21:42:56 +0300 | [diff] [blame] | 107 | |
Anthony Liguori | fa2756b | 2011-11-14 15:09:43 -0600 | [diff] [blame] | 108 | /** |
| 109 | * @migrate_add_blocker - prevent migration from proceeding |
| 110 | * |
| 111 | * @reason - an error to be returned whenever migration is attempted |
| 112 | */ |
| 113 | void migrate_add_blocker(Error *reason); |
| 114 | |
| 115 | /** |
| 116 | * @migrate_del_blocker - remove a blocking error from migration |
| 117 | * |
| 118 | * @reason - the error blocking migration |
| 119 | */ |
| 120 | void migrate_del_blocker(Error *reason); |
| 121 | |
Orit Wasserman | 302dfbe | 2012-08-06 21:42:52 +0300 | [diff] [blame] | 122 | int xbzrle_encode_buffer(uint8_t *old_buf, uint8_t *new_buf, int slen, |
| 123 | uint8_t *dst, int dlen); |
| 124 | int xbzrle_decode_buffer(uint8_t *src, int slen, uint8_t *dst, int dlen); |
| 125 | |
Orit Wasserman | 17ad9b3 | 2012-08-06 21:42:53 +0300 | [diff] [blame] | 126 | int migrate_use_xbzrle(void); |
| 127 | int64_t migrate_xbzrle_cache_size(void); |
| 128 | |
Orit Wasserman | 9e1ba4c | 2012-08-06 21:42:54 +0300 | [diff] [blame] | 129 | int64_t xbzrle_cache_resize(int64_t new_size); |
aliguori | 5bb7910 | 2008-10-13 03:12:02 +0000 | [diff] [blame] | 130 | #endif |