[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH COLO-Frame v11 17/39] COLO: Load VMState into qsb be
From: |
zhanghailiang |
Subject: |
[Qemu-devel] [PATCH COLO-Frame v11 17/39] COLO: Load VMState into qsb before restore it |
Date: |
Tue, 24 Nov 2015 17:25:27 +0800 |
We should not destroy the state of SVM (Secondary VM) until we receive the whole
state from the PVM (Primary VM), in case the primary fails in the middle of
sending
the state, so, here we cache the device state in Secondary before restore it.
Besides, we should call qemu_system_reset() before load VM state,
which can ensure the data is intact.
Signed-off-by: zhanghailiang <address@hidden>
Signed-off-by: Li Zhijian <address@hidden>
Signed-off-by: Gonglei <address@hidden>
Reviewed-by: Dr. David Alan Gilbert <address@hidden>
---
migration/colo.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 50 insertions(+), 2 deletions(-)
diff --git a/migration/colo.c b/migration/colo.c
index 6e933fa..5ac8ff2 100644
--- a/migration/colo.c
+++ b/migration/colo.c
@@ -285,6 +285,9 @@ static int colo_wait_handle_cmd(QEMUFile *f, int
*checkpoint_request)
void *colo_process_incoming_thread(void *opaque)
{
MigrationIncomingState *mis = opaque;
+ QEMUFile *fb = NULL;
+ QEMUSizedBuffer *buffer = NULL; /* Cache incoming device state */
+ uint64_t total_size;
int ret = 0;
uint64_t value;
@@ -310,6 +313,12 @@ void *colo_process_incoming_thread(void *opaque)
goto out;
}
+ buffer = qsb_create(NULL, COLO_BUFFER_BASE_SIZE);
+ if (buffer == NULL) {
+ error_report("Failed to allocate colo buffer!");
+ goto out;
+ }
+
ret = colo_ctl_put(mis->to_src_file, COLO_COMMAND_CHECKPOINT_READY, 0);
if (ret < 0) {
goto out;
@@ -338,19 +347,53 @@ void *colo_process_incoming_thread(void *opaque)
goto out;
}
- /* TODO: read migration data into colo buffer */
+ /* read the VM state total size first */
+ ret = colo_ctl_get(mis->from_src_file,
+ COLO_COMMAND_VMSTATE_SIZE, &value);
+ if (ret < 0) {
+ error_report("%s: Failed to get vmstate size", __func__);
+ goto out;
+ }
+
+ /* read vm device state into colo buffer */
+ total_size = qsb_fill_buffer(buffer, mis->from_src_file, value);
+ if (total_size != value) {
+ error_report("Got %lu VMState data, less than expected %lu",
+ total_size, value);
+ ret = -EINVAL;
+ goto out;
+ }
ret = colo_ctl_put(mis->to_src_file, COLO_COMMAND_VMSTATE_RECEIVED, 0);
if (ret < 0) {
goto out;
}
- /* TODO: load vm state */
+ /* open colo buffer for read */
+ fb = qemu_bufopen("r", buffer);
+ if (!fb) {
+ error_report("can't open colo buffer for read");
+ goto out;
+ }
+
+ qemu_mutex_lock_iothread();
+ qemu_system_reset(VMRESET_SILENT);
+ if (qemu_loadvm_state(fb) < 0) {
+ error_report("COLO: loadvm failed");
+ qemu_mutex_unlock_iothread();
+ goto out;
+ }
+ qemu_mutex_unlock_iothread();
+
+ /* TODO: flush vm state */
ret = colo_ctl_put(mis->to_src_file, COLO_COMMAND_VMSTATE_LOADED, 0);
if (ret < 0) {
goto out;
}
+
+ qemu_fclose(fb);
+ fb = NULL;
}
out:
@@ -359,6 +402,11 @@ out:
strerror(-ret));
}
+ if (fb) {
+ qemu_fclose(fb);
+ }
+ qsb_free(buffer);
+
qemu_mutex_lock_iothread();
colo_release_ram_cache();
qemu_mutex_unlock_iothread();
--
1.8.3.1
- [Qemu-devel] [PATCH COLO-Frame v11 13/39] COLO: Save PVM state to secondary side when do checkpoint, (continued)
- [Qemu-devel] [PATCH COLO-Frame v11 13/39] COLO: Save PVM state to secondary side when do checkpoint, zhanghailiang, 2015/11/24
- [Qemu-devel] [PATCH COLO-Frame v11 07/39] migration: Integrate COLO checkpoint process into loadvm, zhanghailiang, 2015/11/24
- [Qemu-devel] [PATCH COLO-Frame v11 18/39] COLO: Flush PVM's cached RAM into SVM's memory, zhanghailiang, 2015/11/24
- [Qemu-devel] [PATCH COLO-Frame v11 15/39] COLO: Load PVM's dirty pages into SVM's RAM cache temporarily, zhanghailiang, 2015/11/24
- [Qemu-devel] [PATCH COLO-Frame v11 16/39] ram/COLO: Record the dirty pages that SVM received, zhanghailiang, 2015/11/24
- [Qemu-devel] [PATCH COLO-Frame v11 21/39] COLO failover: Introduce a new command to trigger a failover, zhanghailiang, 2015/11/24
- [Qemu-devel] [PATCH COLO-Frame v11 24/39] COLO: Implement failover work for Secondary VM, zhanghailiang, 2015/11/24
- [Qemu-devel] [PATCH COLO-Frame v11 17/39] COLO: Load VMState into qsb before restore it,
zhanghailiang <=
- [Qemu-devel] [PATCH COLO-Frame v11 22/39] COLO failover: Introduce state to record failover process, zhanghailiang, 2015/11/24
- [Qemu-devel] [PATCH COLO-Frame v11 27/39] COLO failover: Shutdown related socket fd when do failover, zhanghailiang, 2015/11/24
- [Qemu-devel] [PATCH COLO-Frame v11 33/39] COLO: Split qemu_savevm_state_begin out of checkpoint process, zhanghailiang, 2015/11/24
- [Qemu-devel] [PATCH COLO-Frame v11 29/39] COLO: Process shutdown command for VM in COLO state, zhanghailiang, 2015/11/24
- [Qemu-devel] [PATCH COLO-Frame v11 37/39] filter-buffer: Introduce a helper function to release packets, zhanghailiang, 2015/11/24
- [Qemu-devel] [PATCH COLO-Frame v11 31/39] savevm: Split load vm state function qemu_loadvm_state, zhanghailiang, 2015/11/24
- [Qemu-devel] [PATCH COLO-Frame v11 39/39] COLO: Add block replication into colo process, zhanghailiang, 2015/11/24
- [Qemu-devel] [PATCH COLO-Frame v11 36/39] filter-buffer: Introduce a helper function to enable/disable default filter, zhanghailiang, 2015/11/24
- [Qemu-devel] [PATCH COLO-Frame v11 35/39] filter-buffer: Accept zero interval, zhanghailiang, 2015/11/24