Skip to content

Commit

Permalink
migration: Stop postcopy fault thread before notifying
Browse files Browse the repository at this point in the history
POSTCOPY_NOTIFY_INBOUND_END handlers will remove userfault fds
from the postcopy_remote_fds array which could be still in
use by the fault thread. Let's stop the thread before
notification to avoid possible accessing wrong memory.

Fixes: 4634357 ("vhost+postcopy: Wire up POSTCOPY_END notify")
Cc: [email protected]
Signed-off-by: Ilya Maximets <[email protected]>
Message-Id: <[email protected]>
Reviewed-by: Dr. David Alan Gilbert <[email protected]>
Reviewed-by: Maxime Coquelin <[email protected]>
Signed-off-by: Dr. David Alan Gilbert <[email protected]>
  • Loading branch information
igsilya authored and dagrh committed Oct 11, 2018
1 parent 5571dc8 commit 55d0fe8
Showing 1 changed file with 6 additions and 5 deletions.
11 changes: 6 additions & 5 deletions migration/postcopy-ram.c
Original file line number Diff line number Diff line change
Expand Up @@ -533,6 +533,12 @@ int postcopy_ram_incoming_cleanup(MigrationIncomingState *mis)
if (mis->have_fault_thread) {
Error *local_err = NULL;

/* Let the fault thread quit */
atomic_set(&mis->fault_thread_quit, 1);
postcopy_fault_thread_notify(mis);
trace_postcopy_ram_incoming_cleanup_join();
qemu_thread_join(&mis->fault_thread);

if (postcopy_notify(POSTCOPY_NOTIFY_INBOUND_END, &local_err)) {
error_report_err(local_err);
return -1;
Expand All @@ -541,11 +547,6 @@ int postcopy_ram_incoming_cleanup(MigrationIncomingState *mis)
if (qemu_ram_foreach_migratable_block(cleanup_range, mis)) {
return -1;
}
/* Let the fault thread quit */
atomic_set(&mis->fault_thread_quit, 1);
postcopy_fault_thread_notify(mis);
trace_postcopy_ram_incoming_cleanup_join();
qemu_thread_join(&mis->fault_thread);

trace_postcopy_ram_incoming_cleanup_closeuf();
close(mis->userfault_fd);
Expand Down

0 comments on commit 55d0fe8

Please sign in to comment.