We are going to implement fds-passing migration feature. When it's enabled (by setting migration parameter), TAP device (and later other devices of-course) is passed through migration channel (which should be a unix socket to pass fds) to a new QEMU.
So we need to know during TAP initialization, should we open TAP device, or wait for incoming fds. But we can't check for migration parameter at TAP creation time, as use may set migration parameter later (especially when TAP is added by command line parameter). To solve this, we have prepared TAP initialization code so that opening the device may be postponed to later point. And this later point is obviously the early beginning of qmp_migrate_incoming(): here we already know all migration parameters and capabilities, but we are not in downtime, so we can continue initialization of TAP device. This commit introduces MIG_EVENT_PRE_INCOMING, to be used by TAP code in following commit. Signed-off-by: Vladimir Sementsov-Ogievskiy <vsement...@yandex-team.ru> --- include/migration/misc.h | 1 + migration/migration.c | 8 +++++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/include/migration/misc.h b/include/migration/misc.h index a261f99d89..5765fcc204 100644 --- a/include/migration/misc.h +++ b/include/migration/misc.h @@ -63,6 +63,7 @@ typedef enum MigrationEventType { MIG_EVENT_PRECOPY_SETUP, MIG_EVENT_PRECOPY_DONE, MIG_EVENT_PRECOPY_FAILED, + MIG_EVENT_PRE_INCOMING, MIG_EVENT_MAX } MigrationEventType; diff --git a/migration/migration.c b/migration/migration.c index 10c216d25d..88daa13960 100644 --- a/migration/migration.c +++ b/migration/migration.c @@ -1696,7 +1696,8 @@ int migration_call_notifiers(MigrationState *s, MigrationEventType type, e.type = type; ret = notifier_with_return_list_notify(&migration_state_notifiers[mode], &e, errp); - assert(!ret || type == MIG_EVENT_PRECOPY_SETUP); + assert(!ret || type == MIG_EVENT_PRECOPY_SETUP || + type == MIG_EVENT_PRE_INCOMING); return ret; } @@ -1936,6 +1937,11 @@ void qmp_migrate_incoming(const char *uri, bool has_channels, return; } + if (migration_call_notifiers(migrate_get_current(), MIG_EVENT_PRE_INCOMING, + errp)) { + return; + } + if (!yank_register_instance(MIGRATION_YANK_INSTANCE, errp)) { return; } -- 2.48.1