mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-06 17:23:56 -06:00
migration: fix migrate_cancel leads live_migration thread hung forever
When we 'migrate_cancel' a multifd migration, live_migration thread may hung forever at some points, because of multifd_send_thread has already exit for socket error: 1. multifd_send_pages may hung at qemu_sem_wait(&multifd_send_state-> channels_ready) 2. multifd_send_sync_main my hung at qemu_sem_wait(&multifd_send_state-> sem_sync) Signed-off-by: Ivan Ren <ivanren@tencent.com> Message-Id: <1561468699-9819-3-git-send-email-ivanren@tencent.com> Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com> Reviewed-by: Juan Quintela <quintela@redhat.com> Signed-off-by: Juan Quintela <quintela@redhat.com> --- Remove spurious not needed bits
This commit is contained in:
parent
713f762a31
commit
a3ec6b7d23
1 changed files with 14 additions and 2 deletions
|
@ -1097,7 +1097,8 @@ static void *multifd_send_thread(void *opaque)
|
||||||
{
|
{
|
||||||
MultiFDSendParams *p = opaque;
|
MultiFDSendParams *p = opaque;
|
||||||
Error *local_err = NULL;
|
Error *local_err = NULL;
|
||||||
int ret;
|
int ret = 0;
|
||||||
|
uint32_t flags = 0;
|
||||||
|
|
||||||
trace_multifd_send_thread_start(p->id);
|
trace_multifd_send_thread_start(p->id);
|
||||||
rcu_register_thread();
|
rcu_register_thread();
|
||||||
|
@ -1115,7 +1116,7 @@ static void *multifd_send_thread(void *opaque)
|
||||||
if (p->pending_job) {
|
if (p->pending_job) {
|
||||||
uint32_t used = p->pages->used;
|
uint32_t used = p->pages->used;
|
||||||
uint64_t packet_num = p->packet_num;
|
uint64_t packet_num = p->packet_num;
|
||||||
uint32_t flags = p->flags;
|
flags = p->flags;
|
||||||
|
|
||||||
p->next_packet_size = used * qemu_target_page_size();
|
p->next_packet_size = used * qemu_target_page_size();
|
||||||
multifd_send_fill_packet(p);
|
multifd_send_fill_packet(p);
|
||||||
|
@ -1164,6 +1165,17 @@ out:
|
||||||
multifd_send_terminate_threads(local_err);
|
multifd_send_terminate_threads(local_err);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Error happen, I will exit, but I can't just leave, tell
|
||||||
|
* who pay attention to me.
|
||||||
|
*/
|
||||||
|
if (ret != 0) {
|
||||||
|
if (flags & MULTIFD_FLAG_SYNC) {
|
||||||
|
qemu_sem_post(&multifd_send_state->sem_sync);
|
||||||
|
}
|
||||||
|
qemu_sem_post(&multifd_send_state->channels_ready);
|
||||||
|
}
|
||||||
|
|
||||||
qemu_mutex_lock(&p->mutex);
|
qemu_mutex_lock(&p->mutex);
|
||||||
p->running = false;
|
p->running = false;
|
||||||
qemu_mutex_unlock(&p->mutex);
|
qemu_mutex_unlock(&p->mutex);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue