@@ -41,6 +41,14 @@ struct MigrationParams {
typedef struct MigrationState MigrationState;
+/* State for the incoming migration */
+struct MigrationIncomingState {
+ QEMUFile *file;
+};
+
+MigrationIncomingState *migration_incoming_state_init(QEMUFile *f);
+void migration_incoming_state_destroy(MigrationIncomingState *mis);
+
struct MigrationState
{
int64_t bandwidth_limit;
@@ -116,6 +116,8 @@ struct QEMUFile {
unsigned int iovcnt;
int last_error;
+
+ MigrationIncomingState *mis;
};
struct QEMUSizedBuffer {
@@ -14,6 +14,7 @@ typedef struct Visitor Visitor;
struct Monitor;
typedef struct Monitor Monitor;
+typedef struct MigrationIncomingState MigrationIncomingState;
typedef struct MigrationParams MigrationParams;
typedef struct Property Property;
@@ -44,6 +45,7 @@ typedef struct PixelFormat PixelFormat;
typedef struct QemuConsole QemuConsole;
typedef struct CharDriverState CharDriverState;
typedef struct MACAddr MACAddr;
+typedef struct MigrationIncomingState MigrationIncomingState;
typedef struct NetClientState NetClientState;
typedef struct I2CBus I2CBus;
typedef struct ISABus ISABus;
@@ -100,15 +100,37 @@ void qemu_start_incoming_migration(const char *uri, Error **errp)
}
}
+MigrationIncomingState *migration_incoming_state_init(QEMUFile* f)
+{
+ MigrationIncomingState *mis = g_malloc0(sizeof(MigrationIncomingState));
+ mis->file = f;
+
+ return mis;
+}
+
+void migration_incoming_state_destroy(MigrationIncomingState *mis)
+{
+ g_free(mis);
+}
+
static void process_incoming_migration_co(void *opaque)
{
QEMUFile *f = opaque;
Error *local_err = NULL;
+ MigrationIncomingState *mis;
int ret;
+ mis = migration_incoming_state_init(f);
+ f->mis = mis;
+
ret = qemu_loadvm_state(f);
+
+ f->mis = NULL;
qemu_fclose(f);
free_xbzrle_decoded_buf();
+ migration_incoming_state_destroy(mis);
+ mis = NULL;
+
if (ret < 0) {
error_report("load of migration failed: %s", strerror(-ret));
exit(EXIT_FAILURE);
@@ -1244,9 +1244,11 @@ int load_vmstate(const char *name)
}
qemu_system_reset(VMRESET_SILENT);
+ f->mis = migration_incoming_state_init(f);
ret = qemu_loadvm_state(f);
qemu_fclose(f);
+ migration_incoming_state_destroy(f->mis);
if (ret < 0) {
error_report("Error %d while loading VM state", ret);
return ret;