migration: fix concurrent call of multifd_save_cleanup
PATCH 1/1 migration: fix concurrent call of multifd_save_cleanup
Concurrent call of multifd_save_cleanup() is unsafe, it will lead to null pointer dereference. 'multifd_save_cleanup()' should not be called in multifd_new_send_channel_async(), move it to ram_save_cleanup() like other features do.
Signed-off-by Liang Li <[email protected]>
--- migration/migration.c | 5 ----- migration/ram.c | 7 +++---- migration/ram.h | 2 +- 3 files changed, 4 insertions(+), 10 deletions(-)
migration/migration.c +0 -5
@@ -1372,7 +1372,6 @@ static void migrate_fd_cleanup(void *opaque)qemu_savevm_state_cleanup ();if (s->to_dst_file) { -Error *local_err =NULL ;QEMUFile *tmp;trace_migrate_fd_cleanup ();
@@ -1382,10 +1381,6 @@ static void migrate_fd_cleanup(void *opaque) s->migration_thread_running = false; }qemu_mutex_lock_iothread (); - -if (multifd_save_cleanup (&local_err) !=0 ) { -error_report_err (local_err); - }qemu_mutex_lock (&s->qemu_file_lock); tmp = s->to_dst_file; s->to_dst_file =NULL ;
migration/ram.c +3 -4
@@ -917,7 +917,7 @@ static void multifd_send_terminate_threads(Error *err) } } -int multifd_save_cleanup (Error **errp) +int multifd_save_cleanup (void ) {int i;int ret =0 ;
@@ -1071,9 +1071,7 @@ static void multifd_new_send_channel_async(QIOTask *task, gpointer opaque)Error *local_err =NULL ;if (qio_task_propagate_error (task, &local_err)) { -if (multifd_save_cleanup (&local_err) !=0 ) { -migrate_set_error (migrate_get_current (), local_err); - } +migrate_set_error (migrate_get_current (), local_err); }else { p->c =QIO_CHANNEL (sioc);qio_channel_set_delay (p->c, false);
@@ -2542,6 +2540,7 @@ static void ram_save_cleanup(void *opaque)xbzrle_cleanup ();compress_threads_save_cleanup (); +multifd_save_cleanup ();ram_state_cleanup (rsp); }
migration/ram.h +1 -1
@@ -43,7 +43,7 @@ uint64_t ram_bytes_remaining(void);uint64_t ram_bytes_total (void );int multifd_save_setup (void ); -int multifd_save_cleanup (Error **errp); +int multifd_save_cleanup (void );int multifd_load_setup (void );int multifd_load_cleanup (Error **errp);bool multifd_recv_all_channels_created (void );
Signature · 1 line
1.8.3.1