On Fri, Apr 28, 2023 at 10:49:26PM +0300, Vladimir Sementsov-Ogievskiy wrote: > +int coroutine_fn colo_incoming_co(void) > +{ > + MigrationIncomingState *mis = migration_incoming_get_current(); > + Error *local_err = NULL; > + QemuThread th; > + > + assert(!qemu_mutex_iothread_locked());
Is this assert reverted? I assume it wants to guarantee BQL held rather than not.. > + > + if (!migration_incoming_colo_enabled()) { > + return 0; > + } > + > + /* Make sure all file formats throw away their mutable metadata */ > + bdrv_activate_all(&local_err); > + if (local_err) { > + error_report_err(local_err); > + return -EINVAL; > + } > + > + qemu_thread_create(&th, "COLO incoming", colo_process_incoming_thread, > + mis, QEMU_THREAD_JOINABLE); > + > + mis->colo_incoming_co = qemu_coroutine_self(); > + qemu_coroutine_yield(); > + mis->colo_incoming_co = NULL; > + > + qemu_mutex_unlock_iothread(); > + /* Wait checkpoint incoming thread exit before free resource */ > + qemu_thread_join(&th); > + qemu_mutex_lock_iothread(); > + > + /* We hold the global iothread lock, so it is safe here */ > + colo_release_ram_cache(); > + > + return 0; > +} -- Peter Xu