QEMU will abort when vhost-user process is restarted during migration and vhost_log_global_start/stop is called. The reason is clear that vhost_dev_set_log returns -1 because network connection is temporarily lost. To handle this situation, let's cancel migration here.
Signed-off-by: Ying Fang <fangyi...@huawei.com> --- hw/virtio/vhost.c | 15 +++++++++++++-- migration/migration.c | 2 +- migration/migration.h | 2 +- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/hw/virtio/vhost.c b/hw/virtio/vhost.c index ddc42f0..e2ade93 100644 --- a/hw/virtio/vhost.c +++ b/hw/virtio/vhost.c @@ -26,6 +26,7 @@ #include "hw/virtio/virtio-bus.h" #include "hw/virtio/virtio-access.h" #include "migration/blocker.h" +#include "migration/migration.h" #include "sysemu/dma.h" /* enabled until disconnected backend stabilizes */ @@ -882,20 +883,30 @@ static int vhost_migration_log(MemoryListener *listener, int enable) static void vhost_log_global_start(MemoryListener *listener) { int r; + MigrationState *s = NULL; r = vhost_migration_log(listener, true); if (r < 0) { - abort(); + error_report("Failed to start vhost dirty log"); + s = migrate_get_current(); + if (s->migration_thread_running) { + migrate_fd_cancel(s); + } } } static void vhost_log_global_stop(MemoryListener *listener) { int r; + MigrationState *s = NULL; r = vhost_migration_log(listener, false); if (r < 0) { - abort(); + error_report("Failed to stop vhost dirty log"); + s = migrate_get_current(); + if (s->migration_thread_running) { + migrate_fd_cancel(s); + } } } diff --git a/migration/migration.c b/migration/migration.c index 4de3b55..6d2b7df 100644 --- a/migration/migration.c +++ b/migration/migration.c @@ -1131,7 +1131,7 @@ void migrate_fd_error(MigrationState *s, const Error *error) block_cleanup_parameters(s); } -static void migrate_fd_cancel(MigrationState *s) +void migrate_fd_cancel(MigrationState *s) { int old_state ; QEMUFile *f = migrate_get_current()->to_dst_file; diff --git a/migration/migration.h b/migration/migration.h index 663415f..f0261e3 100644 --- a/migration/migration.h +++ b/migration/migration.h @@ -167,7 +167,7 @@ uint64_t migrate_max_downtime(void); void migrate_set_error(MigrationState *s, const Error *error); void migrate_fd_error(MigrationState *s, const Error *error); - +void migrate_fd_cancel(MigrationState *s); void migrate_fd_connect(MigrationState *s); MigrationState *migrate_init(void); -- 1.8.3.1