{
MigrationIncomingState *mis = migration_incoming_get_current();
Error *local_err = NULL;
+ MigChannelType ch;
trace_migration_set_incoming_channel(
ioc, object_get_typename(OBJECT(ioc)));
migration_tls_channel_process_incoming(ioc, &local_err);
} else {
migration_ioc_register_yank(ioc);
- migration_ioc_process_incoming(ioc, &local_err);
- }
+ ch = migration_ioc_process_incoming(ioc, &local_err);
+ if (!ch) {
+ goto out;
+ }
+ if (migration_incoming_setup(ioc, ch, &local_err)) {
+ migration_incoming_process();
+ }
+ }
+out:
if (local_err) {
error_report_err(local_err);
migrate_set_state(&mis->state, mis->state, MIGRATION_STATUS_FAILED);
#include "io/channel.h"
/* Migration channel types */
-enum {
+typedef enum {
+ CH_NONE,
CH_MAIN,
CH_MULTIFD,
CH_POSTCOPY
-};
+} MigChannelType;
void migration_channel_process_incoming(QIOChannel *ioc);
return true;
}
-void migration_ioc_process_incoming(QIOChannel *ioc, Error **errp)
+MigChannelType migration_ioc_process_incoming(QIOChannel *ioc, Error **errp)
{
MigrationIncomingState *mis = migration_incoming_get_current();
- uint8_t channel;
+ MigChannelType channel = CH_NONE;
uint32_t channel_magic = 0;
int ret = 0;
ret = migration_channel_read_peek(ioc, (void *)&channel_magic,
sizeof(channel_magic), errp);
if (ret != 0) {
- return;
+ goto out;
}
channel_magic = be32_to_cpu(channel_magic);
channel = CH_MAIN;
} else {
error_setg(errp, "unknown channel magic: %u", channel_magic);
- return;
}
} else if (mis->from_src_file && migrate_multifd()) {
/*
channel = CH_MAIN;
} else {
error_setg(errp, "non-peekable channel used without multifd");
- return;
}
} else {
assert(migrate_postcopy_preempt());
channel = CH_POSTCOPY;
}
- if (migration_incoming_setup(ioc, channel, errp)) {
- migration_incoming_process();
- }
+out:
+ return channel;
}
/**
#include "postcopy-ram.h"
#include "system/runstate.h"
#include "migration/misc.h"
+#include "channel.h"
#define MIGRATION_THREAD_SNAPSHOT "mig/snapshot"
#define MIGRATION_THREAD_DIRTY_RATE "mig/dirtyrate"
void migrate_set_state(MigrationStatus *state, MigrationStatus old_state,
MigrationStatus new_state);
-void migration_ioc_process_incoming(QIOChannel *ioc, Error **errp);
+MigChannelType migration_ioc_process_incoming(QIOChannel *ioc, Error **errp);
void migration_incoming_process(void);
bool migration_incoming_setup(QIOChannel *ioc, uint8_t channel, Error **errp);
void migration_outgoing_setup(QIOChannel *ioc);