When ft_mode is on, migrate_fd_put_ready() would open ft_transaction file and turn on event_tap. To end or cancel ft_transaction, ft_mode and event_tap is turned off. Signed-off-by: Yoshiaki Tamura <tamura.yoshiaki@xxxxxxxxxxxxx> --- migration.c | 36 +++++++++++++++++++++++++++++++++--- 1 files changed, 33 insertions(+), 3 deletions(-) diff --git a/migration.c b/migration.c index 3cc47fc..c81fdb4 100644 --- a/migration.c +++ b/migration.c @@ -494,8 +494,32 @@ void migrate_fd_put_ready(void *opaque) } else { state = MIG_STATE_COMPLETED; } - migrate_fd_cleanup(s); - s->state = state; + + if (ft_mode && state == MIG_STATE_COMPLETED) { + /* close buffered_file and open ft_transaction. + * Note: file discriptor won't get closed, + * but reused by ft_transaction. */ + socket_set_block(s->fd); + socket_set_nodelay(s->fd); + qemu_fclose(s->file); + s->file = qemu_fopen_ops_ft_tranx(s, + migrate_fd_put_buffer, + migrate_fd_put_vector, + migrate_fd_get_buffer, + NULL, + migrate_fd_close, + 1); + + /* events are tapped from now. */ + event_tap_on(); + + if (old_vm_running) { + vm_start(); + } + } else { + migrate_fd_cleanup(s); + s->state = state; + } } } @@ -515,8 +539,14 @@ void migrate_fd_cancel(MigrationState *mig_state) DPRINTF("cancelling migration\n"); s->state = MIG_STATE_CANCELLED; - qemu_savevm_state_cancel(s->mon, s->file); + if (ft_mode == FT_TRANSACTION) { + qemu_transaction_cancel(s->file); + ft_mode = FT_OFF; + event_tap_off(); + } + + qemu_savevm_state_cancel(s->mon, s->file); migrate_fd_cleanup(s); } -- 1.7.0.31.g1df487 -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html