[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-block] [PATCH 04/17] migration: introduce postcopy-only pending
From: |
Vladimir Sementsov-Ogievskiy |
Subject: |
[Qemu-block] [PATCH 04/17] migration: introduce postcopy-only pending |
Date: |
Tue, 7 Feb 2017 18:05:27 +0300 |
There would be savevm states (dirty-bitmap) which can migrate only in
postcopy stage. The corresponding pending is introduced here.
Signed-off-by: Vladimir Sementsov-Ogievskiy <address@hidden>
Reviewed-by: Juan Quintela <address@hidden>
---
include/migration/vmstate.h | 17 +++++++++++++++--
include/sysemu/sysemu.h | 5 +++--
migration/block.c | 7 ++++---
migration/migration.c | 15 ++++++++-------
migration/ram.c | 9 +++++----
migration/savevm.c | 14 ++++++++------
migration/trace-events | 2 +-
7 files changed, 44 insertions(+), 25 deletions(-)
diff --git a/include/migration/vmstate.h b/include/migration/vmstate.h
index 1eadcf0..da62a73 100644
--- a/include/migration/vmstate.h
+++ b/include/migration/vmstate.h
@@ -58,8 +58,21 @@ typedef struct SaveVMHandlers {
/* This runs outside the iothread lock! */
int (*save_live_setup)(QEMUFile *f, void *opaque);
void (*save_live_pending)(QEMUFile *f, void *opaque, uint64_t max_size,
- uint64_t *non_postcopiable_pending,
- uint64_t *postcopiable_pending);
+ uint64_t *res_precopy_only,
+ uint64_t *res_compatible,
+ uint64_t *res_postcopy_only);
+ /* Note for save_live_pending:
+ * - res_precopy_only is for data which must be migrated in precopy phase
+ * or in stopped state, in other words - before target vm start
+ * - res_compatible is for data which may be migrated in any phase
+ * - res_postcopy_only is for data which must be migrated in postcopy phase
+ * or in stopped state, in other words - after source vm stop
+ *
+ * Sum of res_postcopy_only, res_compatible and res_postcopy_only is the
+ * whole amount of pending data.
+ */
+
+
LoadStateHandler *load_state;
} SaveVMHandlers;
diff --git a/include/sysemu/sysemu.h b/include/sysemu/sysemu.h
index 4d50694..5d59d35 100644
--- a/include/sysemu/sysemu.h
+++ b/include/sysemu/sysemu.h
@@ -111,8 +111,9 @@ void qemu_savevm_state_cleanup(void);
void qemu_savevm_state_complete_postcopy(QEMUFile *f);
void qemu_savevm_state_complete_precopy(QEMUFile *f, bool iterable_only);
void qemu_savevm_state_pending(QEMUFile *f, uint64_t max_size,
- uint64_t *res_non_postcopiable,
- uint64_t *res_postcopiable);
+ uint64_t *res_precopy_only,
+ uint64_t *res_compatible,
+ uint64_t *res_postcopy_only);
void qemu_savevm_command_send(QEMUFile *f, enum qemu_vm_cmd command,
uint16_t len, uint8_t *data);
void qemu_savevm_send_ping(QEMUFile *f, uint32_t value);
diff --git a/migration/block.c b/migration/block.c
index ebc10e6..83b0785 100644
--- a/migration/block.c
+++ b/migration/block.c
@@ -830,8 +830,9 @@ static int block_save_complete(QEMUFile *f, void *opaque)
}
static void block_save_pending(QEMUFile *f, void *opaque, uint64_t max_size,
- uint64_t *non_postcopiable_pending,
- uint64_t *postcopiable_pending)
+ uint64_t *res_precopy_only,
+ uint64_t *res_compatible,
+ uint64_t *res_postcopy_only)
{
/* Estimate pending number of bytes to send */
uint64_t pending;
@@ -852,7 +853,7 @@ static void block_save_pending(QEMUFile *f, void *opaque,
uint64_t max_size,
DPRINTF("Enter save live pending %" PRIu64 "\n", pending);
/* We don't do postcopy */
- *non_postcopiable_pending += pending;
+ *res_precopy_only += pending;
}
static int block_load(QEMUFile *f, void *opaque, int version_id)
diff --git a/migration/migration.c b/migration/migration.c
index 0a5fd38..2fb734e 100644
--- a/migration/migration.c
+++ b/migration/migration.c
@@ -1896,20 +1896,21 @@ static void *migration_thread(void *opaque)
uint64_t pending_size;
if (!qemu_file_rate_limit(s->to_dst_file)) {
- uint64_t pend_post, pend_nonpost;
+ uint64_t pend_pre, pend_compat, pend_post;
- qemu_savevm_state_pending(s->to_dst_file, max_size, &pend_nonpost,
- &pend_post);
- pending_size = pend_nonpost + pend_post;
+ qemu_savevm_state_pending(s->to_dst_file, max_size, &pend_pre,
+ &pend_compat, &pend_post);
+ pending_size = pend_pre + pend_compat + pend_post;
trace_migrate_pending(pending_size, max_size,
- pend_post, pend_nonpost);
+ pend_pre, pend_compat, pend_post);
if (pending_size && pending_size >= max_size) {
/* Still a significant amount to transfer */
if (migrate_postcopy() &&
s->state != MIGRATION_STATUS_POSTCOPY_ACTIVE &&
- pend_nonpost <= max_size &&
- atomic_read(&s->start_postcopy)) {
+ pend_pre <= max_size &&
+ (atomic_read(&s->start_postcopy) ||
+ (pend_pre + pend_compat <= max_size))) {
if (!postcopy_start(s, &old_vm_running)) {
current_active_state =
MIGRATION_STATUS_POSTCOPY_ACTIVE;
diff --git a/migration/ram.c b/migration/ram.c
index 5d0bbfd..3b60010 100644
--- a/migration/ram.c
+++ b/migration/ram.c
@@ -2074,8 +2074,9 @@ static int ram_save_complete(QEMUFile *f, void *opaque)
}
static void ram_save_pending(QEMUFile *f, void *opaque, uint64_t max_size,
- uint64_t *non_postcopiable_pending,
- uint64_t *postcopiable_pending)
+ uint64_t *res_precopy_only,
+ uint64_t *res_compatible,
+ uint64_t *res_postcopy_only)
{
uint64_t remaining_size;
@@ -2093,9 +2094,9 @@ static void ram_save_pending(QEMUFile *f, void *opaque,
uint64_t max_size,
if (migrate_postcopy_ram()) {
/* We can do postcopy, and all the data is postcopiable */
- *postcopiable_pending += remaining_size;
+ *res_compatible += remaining_size;
} else {
- *non_postcopiable_pending += remaining_size;
+ *res_precopy_only += remaining_size;
}
}
diff --git a/migration/savevm.c b/migration/savevm.c
index 965a58c..d1bab59 100644
--- a/migration/savevm.c
+++ b/migration/savevm.c
@@ -1209,13 +1209,15 @@ void qemu_savevm_state_complete_precopy(QEMUFile *f,
bool iterable_only)
* for units that can't do postcopy.
*/
void qemu_savevm_state_pending(QEMUFile *f, uint64_t max_size,
- uint64_t *res_non_postcopiable,
- uint64_t *res_postcopiable)
+ uint64_t *res_precopy_only,
+ uint64_t *res_compatible,
+ uint64_t *res_postcopy_only)
{
SaveStateEntry *se;
- *res_non_postcopiable = 0;
- *res_postcopiable = 0;
+ *res_precopy_only = 0;
+ *res_compatible = 0;
+ *res_postcopy_only = 0;
QTAILQ_FOREACH(se, &savevm_state.handlers, entry) {
@@ -1227,8 +1229,8 @@ void qemu_savevm_state_pending(QEMUFile *f, uint64_t
max_size,
continue;
}
}
- se->ops->save_live_pending(f, se->opaque, max_size,
- res_non_postcopiable, res_postcopiable);
+ se->ops->save_live_pending(f, se->opaque, max_size, res_precopy_only,
+ res_compatible, res_postcopy_only);
}
}
diff --git a/migration/trace-events b/migration/trace-events
index fa660e3..0212929 100644
--- a/migration/trace-events
+++ b/migration/trace-events
@@ -80,7 +80,7 @@ migrate_fd_cleanup(void) ""
migrate_fd_error(const char *error_desc) "error=%s"
migrate_fd_cancel(void) ""
migrate_handle_rp_req_pages(const char *rbname, size_t start, size_t len) "in
%s at %zx len %zx"
-migrate_pending(uint64_t size, uint64_t max, uint64_t post, uint64_t nonpost)
"pending size %" PRIu64 " max %" PRIu64 " (post=%" PRIu64 " nonpost=%" PRIu64
")"
+migrate_pending(uint64_t size, uint64_t max, uint64_t pre, uint64_t compat,
uint64_t post) "pending size %" PRIu64 " max %" PRIu64 " (pre = %" PRIu64 "
compat=%" PRIu64 " post=%" PRIu64 ")"
migrate_send_rp_message(int msg_type, uint16_t len) "%d: len %d"
migration_completion_file_err(void) ""
migration_completion_postcopy_end(void) ""
--
1.8.3.1
- [Qemu-block] [PATCH v5 00/17] Dirty bitmaps postcopy migration, Vladimir Sementsov-Ogievskiy, 2017/02/07
- [Qemu-block] [PATCH 01/17] migration: add has_postcopy savevm handler, Vladimir Sementsov-Ogievskiy, 2017/02/07
- [Qemu-block] [PATCH 07/17] qapi: add dirty-bitmaps migration capability, Vladimir Sementsov-Ogievskiy, 2017/02/07
- [Qemu-block] [PATCH 10/17] migration/qemu-file: add qemu_put_counted_string(), Vladimir Sementsov-Ogievskiy, 2017/02/07
- [Qemu-block] [PATCH 04/17] migration: introduce postcopy-only pending,
Vladimir Sementsov-Ogievskiy <=
- [Qemu-block] [PATCH 12/17] migration: add postcopy migration of dirty bitmaps, Vladimir Sementsov-Ogievskiy, 2017/02/07
- [Qemu-block] [PATCH 02/17] migration: fix ram_save_pending, Vladimir Sementsov-Ogievskiy, 2017/02/07
- [Qemu-block] [PATCH 13/17] iotests: add add_incoming_migration to VM class, Vladimir Sementsov-Ogievskiy, 2017/02/07
- [Qemu-block] [PATCH 06/17] block: add bdrv_dirty_bitmap_enable_successor(), Vladimir Sementsov-Ogievskiy, 2017/02/07
- [Qemu-block] [PATCH 11/17] migration: add is_active_iterate handler, Vladimir Sementsov-Ogievskiy, 2017/02/07
- [Qemu-block] [PATCH 16/17] iotests: add dirty bitmap migration test, Vladimir Sementsov-Ogievskiy, 2017/02/07
- [Qemu-block] [PATCH 05/17] block: add bdrv_next_dirty_bitmap(), Vladimir Sementsov-Ogievskiy, 2017/02/07
- [Qemu-block] [PATCH 15/17] iotests: add default node-name, Vladimir Sementsov-Ogievskiy, 2017/02/07
- [Qemu-block] [PATCH 14/17] qmp: add x-debug-block-dirty-bitmap-sha256, Vladimir Sementsov-Ogievskiy, 2017/02/07