[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v8 13/24] migration: new cmd MIG_CMD_POSTCOPY_RESUME
From: |
Peter Xu |
Subject: |
[Qemu-devel] [PATCH v8 13/24] migration: new cmd MIG_CMD_POSTCOPY_RESUME |
Date: |
Wed, 2 May 2018 18:47:29 +0800 |
Introducing this new command to be sent when the source VM is ready to
resume the paused migration. What the destination does here is
basically release the fault thread to continue service page faults.
Reviewed-by: Dr. David Alan Gilbert <address@hidden>
Signed-off-by: Peter Xu <address@hidden>
---
migration/savevm.h | 1 +
migration/savevm.c | 35 +++++++++++++++++++++++++++++++++++
migration/trace-events | 2 ++
3 files changed, 38 insertions(+)
diff --git a/migration/savevm.h b/migration/savevm.h
index b8cee00d41..b24ff073ad 100644
--- a/migration/savevm.h
+++ b/migration/savevm.h
@@ -47,6 +47,7 @@ int qemu_savevm_send_packaged(QEMUFile *f, const uint8_t
*buf, size_t len);
void qemu_savevm_send_postcopy_advise(QEMUFile *f);
void qemu_savevm_send_postcopy_listen(QEMUFile *f);
void qemu_savevm_send_postcopy_run(QEMUFile *f);
+void qemu_savevm_send_postcopy_resume(QEMUFile *f);
void qemu_savevm_send_recv_bitmap(QEMUFile *f, char *block_name);
void qemu_savevm_send_postcopy_ram_discard(QEMUFile *f, const char *name,
diff --git a/migration/savevm.c b/migration/savevm.c
index 7176b350d5..a7e793eef7 100644
--- a/migration/savevm.c
+++ b/migration/savevm.c
@@ -80,6 +80,7 @@ enum qemu_vm_cmd {
MIG_CMD_POSTCOPY_RAM_DISCARD, /* A list of pages to discard that
were previously sent during
precopy but are dirty. */
+ MIG_CMD_POSTCOPY_RESUME, /* resume postcopy on dest */
MIG_CMD_PACKAGED, /* Send a wrapped stream within this stream */
MIG_CMD_RECV_BITMAP, /* Request for recved bitmap on dst */
MIG_CMD_MAX
@@ -98,6 +99,7 @@ static struct mig_cmd_args {
[MIG_CMD_POSTCOPY_RUN] = { .len = 0, .name = "POSTCOPY_RUN" },
[MIG_CMD_POSTCOPY_RAM_DISCARD] = {
.len = -1, .name = "POSTCOPY_RAM_DISCARD" },
+ [MIG_CMD_POSTCOPY_RESUME] = { .len = 0, .name = "POSTCOPY_RESUME" },
[MIG_CMD_PACKAGED] = { .len = 4, .name = "PACKAGED" },
[MIG_CMD_RECV_BITMAP] = { .len = -1, .name = "RECV_BITMAP" },
[MIG_CMD_MAX] = { .len = -1, .name = "MAX" },
@@ -958,6 +960,12 @@ void qemu_savevm_send_postcopy_run(QEMUFile *f)
qemu_savevm_command_send(f, MIG_CMD_POSTCOPY_RUN, 0, NULL);
}
+void qemu_savevm_send_postcopy_resume(QEMUFile *f)
+{
+ trace_savevm_send_postcopy_resume();
+ qemu_savevm_command_send(f, MIG_CMD_POSTCOPY_RESUME, 0, NULL);
+}
+
void qemu_savevm_send_recv_bitmap(QEMUFile *f, char *block_name)
{
size_t len;
@@ -1768,6 +1776,30 @@ static int
loadvm_postcopy_handle_run(MigrationIncomingState *mis)
return LOADVM_QUIT;
}
+static int loadvm_postcopy_handle_resume(MigrationIncomingState *mis)
+{
+ if (mis->state != MIGRATION_STATUS_POSTCOPY_RECOVER) {
+ error_report("%s: illegal resume received", __func__);
+ /* Don't fail the load, only for this. */
+ return 0;
+ }
+
+ /*
+ * This means source VM is ready to resume the postcopy migration.
+ * It's time to switch state and release the fault thread to
+ * continue service page faults.
+ */
+ migrate_set_state(&mis->state, MIGRATION_STATUS_POSTCOPY_RECOVER,
+ MIGRATION_STATUS_POSTCOPY_ACTIVE);
+ qemu_sem_post(&mis->postcopy_pause_sem_fault);
+
+ trace_loadvm_postcopy_handle_resume();
+
+ /* TODO: Tell source that "we are ready" */
+
+ return 0;
+}
+
/**
* Immediately following this command is a blob of data containing an embedded
* chunk of migration stream; read it and load it.
@@ -1933,6 +1965,9 @@ static int loadvm_process_command(QEMUFile *f)
case MIG_CMD_POSTCOPY_RAM_DISCARD:
return loadvm_postcopy_ram_handle_discard(mis, len);
+ case MIG_CMD_POSTCOPY_RESUME:
+ return loadvm_postcopy_handle_resume(mis);
+
case MIG_CMD_RECV_BITMAP:
return loadvm_handle_recv_bitmap(mis, len);
}
diff --git a/migration/trace-events b/migration/trace-events
index 72e57089f3..29cc10f299 100644
--- a/migration/trace-events
+++ b/migration/trace-events
@@ -18,6 +18,7 @@ loadvm_postcopy_handle_listen(void) ""
loadvm_postcopy_handle_run(void) ""
loadvm_postcopy_handle_run_cpu_sync(void) ""
loadvm_postcopy_handle_run_vmstart(void) ""
+loadvm_postcopy_handle_resume(void) ""
loadvm_postcopy_ram_handle_discard(void) ""
loadvm_postcopy_ram_handle_discard_end(void) ""
loadvm_postcopy_ram_handle_discard_header(const char *ramid, uint16_t len)
"%s: %ud"
@@ -35,6 +36,7 @@ savevm_send_open_return_path(void) ""
savevm_send_ping(uint32_t val) "0x%x"
savevm_send_postcopy_listen(void) ""
savevm_send_postcopy_run(void) ""
+savevm_send_postcopy_resume(void) ""
savevm_send_recv_bitmap(char *name) "%s"
savevm_state_setup(void) ""
savevm_state_header(void) ""
--
2.14.3
- [Qemu-devel] [PATCH v8 03/24] migration: implement "postcopy-pause" src logic, (continued)
- [Qemu-devel] [PATCH v8 03/24] migration: implement "postcopy-pause" src logic, Peter Xu, 2018/05/02
- [Qemu-devel] [PATCH v8 04/24] migration: allow dst vm pause on postcopy, Peter Xu, 2018/05/02
- [Qemu-devel] [PATCH v8 05/24] migration: allow src return path to pause, Peter Xu, 2018/05/02
- [Qemu-devel] [PATCH v8 06/24] migration: allow fault thread to pause, Peter Xu, 2018/05/02
- [Qemu-devel] [PATCH v8 08/24] migration: rebuild channel on source, Peter Xu, 2018/05/02
- [Qemu-devel] [PATCH v8 07/24] qmp: hmp: add migrate "resume" option, Peter Xu, 2018/05/02
- [Qemu-devel] [PATCH v8 09/24] migration: new state "postcopy-recover", Peter Xu, 2018/05/02
- [Qemu-devel] [PATCH v8 10/24] migration: wakeup dst ram-load-thread for recover, Peter Xu, 2018/05/02
- [Qemu-devel] [PATCH v8 11/24] migration: new cmd MIG_CMD_RECV_BITMAP, Peter Xu, 2018/05/02
- [Qemu-devel] [PATCH v8 12/24] migration: new message MIG_RP_MSG_RECV_BITMAP, Peter Xu, 2018/05/02
- [Qemu-devel] [PATCH v8 13/24] migration: new cmd MIG_CMD_POSTCOPY_RESUME,
Peter Xu <=
- [Qemu-devel] [PATCH v8 14/24] migration: new message MIG_RP_MSG_RESUME_ACK, Peter Xu, 2018/05/02
- [Qemu-devel] [PATCH v8 15/24] migration: introduce SaveVMHandlers.resume_prepare, Peter Xu, 2018/05/02
- [Qemu-devel] [PATCH v8 16/24] migration: synchronize dirty bitmap for resume, Peter Xu, 2018/05/02
- [Qemu-devel] [PATCH v8 17/24] migration: setup ramstate for resume, Peter Xu, 2018/05/02
- [Qemu-devel] [PATCH v8 18/24] migration: final handshake for the resume, Peter Xu, 2018/05/02
- [Qemu-devel] [PATCH v8 19/24] migration: init dst in migration_object_init too, Peter Xu, 2018/05/02
- [Qemu-devel] [PATCH v8 20/24] qmp/migration: new command migrate-recover, Peter Xu, 2018/05/02
- [Qemu-devel] [PATCH v8 21/24] hmp/migration: add migrate_recover command, Peter Xu, 2018/05/02
- [Qemu-devel] [PATCH v8 22/24] migration: introduce lock for to_dst_file, Peter Xu, 2018/05/02