[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v2 07/43] Migration commands
From: |
Dr. David Alan Gilbert (git) |
Subject: |
[Qemu-devel] [PATCH v2 07/43] Migration commands |
Date: |
Mon, 11 Aug 2014 15:29:23 +0100 |
From: "Dr. David Alan Gilbert" <address@hidden>
Create QEMU_VM_COMMAND section type for sending commands from
source to destination. These commands are not intended to convey
guest state but to control the migration process.
For use in postcopy.
Signed-off-by: Dr. David Alan Gilbert <address@hidden>
---
include/migration/migration.h | 1 +
include/sysemu/sysemu.h | 7 +++++
savevm.c | 62 +++++++++++++++++++++++++++++++++++++++++++
3 files changed, 70 insertions(+)
diff --git a/include/migration/migration.h b/include/migration/migration.h
index 8a36255..e23947a 100644
--- a/include/migration/migration.h
+++ b/include/migration/migration.h
@@ -33,6 +33,7 @@
#define QEMU_VM_SECTION_END 0x03
#define QEMU_VM_SECTION_FULL 0x04
#define QEMU_VM_SUBSECTION 0x05
+#define QEMU_VM_COMMAND 0x06
struct MigrationParams {
bool blk;
diff --git a/include/sysemu/sysemu.h b/include/sysemu/sysemu.h
index d8539fd..66821eb 100644
--- a/include/sysemu/sysemu.h
+++ b/include/sysemu/sysemu.h
@@ -81,6 +81,13 @@ void do_info_snapshots(Monitor *mon, const QDict *qdict);
void qemu_announce_self(void);
+/* Subcommands for QEMU_VM_COMMAND */
+enum qemu_vm_cmd {
+ QEMU_VM_CMD_INVALID = 0, /* Must be 0 */
+
+ QEMU_VM_CMD_AFTERLASTVALID
+};
+
bool qemu_savevm_state_blocked(Error **errp);
void qemu_savevm_state_begin(QEMUFile *f,
const MigrationParams *params);
diff --git a/savevm.c b/savevm.c
index a0c3b40..8a1f5f1 100644
--- a/savevm.c
+++ b/savevm.c
@@ -592,6 +592,25 @@ static void vmstate_save(QEMUFile *f, SaveStateEntry *se)
vmstate_save_state(f, se->vmsd, se->opaque);
}
+
+/* Send a 'QEMU_VM_COMMAND' type element with the command
+ * and associated data.
+ */
+void qemu_savevm_command_send(QEMUFile *f,
+ enum qemu_vm_cmd command,
+ uint16_t len,
+ uint8_t *data)
+{
+ uint32_t tmp = (uint16_t)command;
+ qemu_put_byte(f, QEMU_VM_COMMAND);
+ qemu_put_be16(f, tmp);
+ qemu_put_be16(f, len);
+ if (len) {
+ qemu_put_buffer(f, data, len);
+ }
+ qemu_fflush(f);
+}
+
bool qemu_savevm_state_blocked(Error **errp)
{
SaveStateEntry *se;
@@ -881,6 +900,43 @@ static SaveStateEntry *find_se(const char *idstr, int
instance_id)
return NULL;
}
+static int loadvm_process_command_simple_lencheck(const char *name,
+ unsigned int actual,
+ unsigned int expected)
+{
+ if (actual != expected) {
+ error_report("%s received with bad length - expecting %d, got %d",
+ name, expected, actual);
+ return -1;
+ }
+
+ return 0;
+}
+
+/*
+ * Process an incoming 'QEMU_VM_COMMAND'
+ * negative return on error (will issue error message)
+ */
+static int loadvm_process_command(QEMUFile *f)
+{
+ uint16_t com;
+ uint16_t len;
+ uint32_t tmp32;
+
+ com = qemu_get_be16(f);
+ len = qemu_get_be16(f);
+
+ /* fprintf(stderr,"loadvm_process_command: com=0x%x len=%d\n", com,len); */
+ switch (com) {
+
+ default:
+ error_report("VM_COMMAND 0x%x unknown (len 0x%x)", com, len);
+ return -1;
+ }
+
+ return 0;
+}
+
typedef struct LoadStateEntry {
QLIST_ENTRY(LoadStateEntry) entry;
SaveStateEntry *se;
@@ -987,6 +1043,12 @@ int qemu_loadvm_state(QEMUFile *f)
goto out;
}
break;
+ case QEMU_VM_COMMAND:
+ ret = loadvm_process_command(f);
+ if (ret < 0) {
+ goto out;
+ }
+ break;
default:
fprintf(stderr, "Unknown savevm section type %d\n", section_type);
ret = -EINVAL;
--
1.9.3
- [Qemu-devel] [PATCH v2 00/43] Postcopy implementation, Dr. David Alan Gilbert (git), 2014/08/11
- [Qemu-devel] [PATCH v2 01/43] qemu_ram_foreach_block: pass up error value, and down the ramblock name, Dr. David Alan Gilbert (git), 2014/08/11
- [Qemu-devel] [PATCH v2 02/43] improve DPRINTF macros, add to savevm, Dr. David Alan Gilbert (git), 2014/08/11
- [Qemu-devel] [PATCH v2 03/43] Add qemu_get_counted_string to read a string prefixed by a count byte, Dr. David Alan Gilbert (git), 2014/08/11
- [Qemu-devel] [PATCH v2 04/43] Create MigrationIncomingState, Dr. David Alan Gilbert (git), 2014/08/11
- [Qemu-devel] [PATCH v2 05/43] Return path: Open a return path on QEMUFile for sockets, Dr. David Alan Gilbert (git), 2014/08/11
- [Qemu-devel] [PATCH v2 07/43] Migration commands,
Dr. David Alan Gilbert (git) <=
- [Qemu-devel] [PATCH v2 06/43] Return path: socket_writev_buffer: Block even on non-blocking fd's, Dr. David Alan Gilbert (git), 2014/08/11
- [Qemu-devel] [PATCH v2 08/43] Return path: Control commands, Dr. David Alan Gilbert (git), 2014/08/11
- [Qemu-devel] [PATCH v2 09/43] Return path: Send responses from destination to source, Dr. David Alan Gilbert (git), 2014/08/11
- [Qemu-devel] [PATCH v2 10/43] Return path: Source handling of return path, Dr. David Alan Gilbert (git), 2014/08/11
- [Qemu-devel] [PATCH v2 11/43] qemu_loadvm errors and debug, Dr. David Alan Gilbert (git), 2014/08/11
- [Qemu-devel] [PATCH v2 12/43] ram_debug_dump_bitmap: Dump a migration bitmap as text, Dr. David Alan Gilbert (git), 2014/08/11
- [Qemu-devel] [PATCH v2 13/43] Rework loadvm path for subloops, Dr. David Alan Gilbert (git), 2014/08/11
- [Qemu-devel] [PATCH v2 14/43] Add migration-capability boolean for postcopy-ram., Dr. David Alan Gilbert (git), 2014/08/11