[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 26/41] migration: new cmd MIG_CMD_POSTCOPY_RESUME
From: |
Juan Quintela |
Subject: |
[Qemu-devel] [PULL 26/41] migration: new cmd MIG_CMD_POSTCOPY_RESUME |
Date: |
Wed, 9 May 2018 13:23:51 +0200 |
From: Peter Xu <address@hidden>
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>
Message-Id: <address@hidden>
Signed-off-by: Juan Quintela <address@hidden>
---
migration/savevm.c | 35 +++++++++++++++++++++++++++++++++++
migration/savevm.h | 1 +
migration/trace-events | 2 ++
3 files changed, 38 insertions(+)
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/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/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.17.0
- [Qemu-devel] [PULL 18/41] migration: allow src return path to pause, (continued)
- [Qemu-devel] [PULL 18/41] migration: allow src return path to pause, Juan Quintela, 2018/05/09
- [Qemu-devel] [PULL 14/41] migration: let incoming side use thread context, Juan Quintela, 2018/05/09
- [Qemu-devel] [PULL 19/41] migration: allow fault thread to pause, Juan Quintela, 2018/05/09
- [Qemu-devel] [PULL 20/41] qmp: hmp: add migrate "resume" option, Juan Quintela, 2018/05/09
- [Qemu-devel] [PULL 23/41] migration: wakeup dst ram-load-thread for recover, Juan Quintela, 2018/05/09
- [Qemu-devel] [PULL 21/41] migration: rebuild channel on source, Juan Quintela, 2018/05/09
- [Qemu-devel] [PULL 24/41] migration: new cmd MIG_CMD_RECV_BITMAP, Juan Quintela, 2018/05/09
- [Qemu-devel] [PULL 22/41] migration: new state "postcopy-recover", Juan Quintela, 2018/05/09
- [Qemu-devel] [PULL 26/41] migration: new cmd MIG_CMD_POSTCOPY_RESUME,
Juan Quintela <=
- [Qemu-devel] [PULL 25/41] migration: new message MIG_RP_MSG_RECV_BITMAP, Juan Quintela, 2018/05/09
- [Qemu-devel] [PULL 28/41] migration: introduce SaveVMHandlers.resume_prepare, Juan Quintela, 2018/05/09
- [Qemu-devel] [PULL 29/41] migration: synchronize dirty bitmap for resume, Juan Quintela, 2018/05/09
- [Qemu-devel] [PULL 30/41] migration: setup ramstate for resume, Juan Quintela, 2018/05/09
- [Qemu-devel] [PULL 27/41] migration: new message MIG_RP_MSG_RESUME_ACK, Juan Quintela, 2018/05/09
- [Qemu-devel] [PULL 32/41] migration: init dst in migration_object_init too, Juan Quintela, 2018/05/09
- [Qemu-devel] [PULL 31/41] migration: final handshake for the resume, Juan Quintela, 2018/05/09
- [Qemu-devel] [PULL 34/41] hmp/migration: add migrate_recover command, Juan Quintela, 2018/05/09
- [Qemu-devel] [PULL 35/41] migration: introduce lock for to_dst_file, Juan Quintela, 2018/05/09
- [Qemu-devel] [PULL 33/41] qmp/migration: new command migrate-recover, Juan Quintela, 2018/05/09