Reorganize and fix monitor resume after migration
PATCH 1/1 Reorganize and fix monitor resume after migration
From: Jan Kiszka <[email protected]>
If migration failed in migrate_fd_put_buffer, the monitor may have been resumed not only in the error path of that function but also once again in migrate_fd_put_ready which is called unconditionally by migrate_fd_connect.
Fix this by establishing a cleaner policy: the monitor shall be resumed when the migration file is closed, either via callback (migrate_fd_close) or in migrate_fd_cleanup if no file is open (i.e. no callback invoked).
--- migration.c | 19 +++++++++---------- 1 files changed, 9 insertions(+), 10 deletions(-)
migration.c +9 -10
@@ -292,18 +292,17 @@ int migrate_fd_cleanup(FdMigrationState *s) ret =-1 ; } s->file =NULL ; + }else { +if (s->mon) { +monitor_resume (s->mon); + } } -if (s->fd !=-1 ) +if (s->fd !=-1 ) {close (s->fd); - -/* Don't resume monitor until we've flushed all of the buffers */ -if (s->mon) { -monitor_resume (s->mon); + s->fd =-1 ; } - s->fd =-1 ; -return ret; }
@@ -330,9 +329,6 @@ ssize_t migrate_fd_put_buffer(void *opaque, const void *data, size_t size)if (ret == -EAGAIN ) {qemu_set_fd_handler2 (s->fd,NULL ,NULL , migrate_fd_put_notify, s); }else if (ret <0 ) { -if (s->mon) { -monitor_resume (s->mon); - } s->state =MIG_STATE_ERROR ;notifier_list_notify (&migration_state_notifiers,NULL ); }
@@ -458,6 +454,9 @@ int migrate_fd_close(void *opaque) {FdMigrationState *s = opaque; +if (s->mon) { +monitor_resume (s->mon); + }qemu_set_fd_handler2 (s->fd,NULL ,NULL ,NULL ,NULL );return s->close (s); }
Signature · 1 line
1.7.3.4
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Quoted 7 lines · Jan Kiszka
From: Jan Kiszka <[email protected]>
If migration failed in
migrate_fd_put_buffer, the monitor may have been resumed not only in the error path of that function but also once again inmigrate_fd_put_readywhich is called unconditionally bymigrate_fd_connect.
Quoted 6 lines
Fix this by establishing a cleaner policy: the monitor shall be resumed when the migration file is closed, either via callback (
migrate_fd_close) or inmigrate_fd_cleanupif no file is open (i.e. no callback invoked).Signed-off-by Jan Kiszka <[email protected]>
This is a good candidate for 0.12, 0.14 and 0.15... ;)
Thank you !
/mjt
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.10 (GNU/Linux)
iJwEAQECAAYFAk47m5UACgkQUlPFrXTwyDgUKAP/ZsVlWiCKmcMhRSItuR6rIT/K k/JY4FwARVpBdv6zVFPsLX4UgsPbC6QfUsYjgZtWhSaiboyi7rRAj75OEipYjBqu IWgBXmXwt6ATxsxC7ffrUtO15QXABmaQyYjBGI+EzJZdKPuzjEfm5wFgHr0+epDn 4svPOur4pC6ttDT3Ldc=
=sHNU
-----END PGP SIGNATURE-----
Anthony Liguori
AppliedQuoted 7 lines · Jan Kiszka
From: Jan Kiszka<[email protected]>
If migration failed in
migrate_fd_put_buffer, the monitor may have been resumed not only in the error path of that function but also once again inmigrate_fd_put_readywhich is called unconditionally bymigrate_fd_connect.
Quoted 6 lines
Fix this by establishing a cleaner policy: the monitor shall be resumed when the migration file is closed, either via callback (
migrate_fd_close) or inmigrate_fd_cleanupif no file is open (i.e. no callback invoked).Signed-off-by Jan Kiszka<[email protected]>
Applied. Thanks.
Regards,
Anthony Liguori
Quoted 53 lines
--- migration.c | 19 +++++++++---------- 1 files changed, 9 insertions(+), 10 deletions(-)migration.c +9
-10@@ -292,18 +292,17 @@ int migrate_fd_cleanup(FdMigrationState *s) ret =-1 ; } s->file =NULL ; + }else { +if (s->mon) { +monitor_resume (s->mon); + } } -if (s->fd !=-1 ) +if (s->fd !=-1 ) {close (s->fd); - -/* Don't resume monitor until we've flushed all of the buffers */ -if (s->mon) { -monitor_resume (s->mon); + s->fd =-1 ; } - s->fd =-1 ; -return ret; }@@ -330,9 +329,6 @@ ssize_t migrate_fd_put_buffer(void *opaque, const void *data, size_t size)if (ret == -EAGAIN ) {qemu_set_fd_handler2 (s->fd,NULL ,NULL , migrate_fd_put_notify, s); }else if (ret<0 ) { -if (s->mon) { -monitor_resume (s->mon); - } s->state =MIG_STATE_ERROR ;notifier_list_notify (&migration_state_notifiers,NULL ); }@@ -458,6 +454,9 @@ int migrate_fd_close(void *opaque) {FdMigrationState *s = opaque; +if (s->mon) { +monitor_resume (s->mon); + }qemu_set_fd_handler2 (s->fd,NULL ,NULL ,NULL ,NULL );return s->close (s); }