diff options
author | Juan Quintela <quintela@redhat.com> | 2018-04-11 02:44:24 +0200 |
---|---|---|
committer | Juan Quintela <quintela@redhat.com> | 2018-06-27 13:28:11 +0200 |
commit | d82628e4bde23aaf50273cc835c8ce28b43590bd (patch) | |
tree | 8a37bed39158bb91deec7511ff5e2736f6dd7d30 /migration | |
parent | 408ea6ae4c8f94621dff64d69c7fa3f6e84ef2fb (diff) |
migration: Multifd channels always wait on the sem
Either for quit, sync or packet, we first wake them.
Signed-off-by: Juan Quintela <quintela@redhat.com>
Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
Diffstat (limited to 'migration')
-rw-r--r-- | migration/ram.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/migration/ram.c b/migration/ram.c index 5c040e3ae5..45d6c43bfe 100644 --- a/migration/ram.c +++ b/migration/ram.c @@ -875,6 +875,7 @@ static void *multifd_send_thread(void *opaque) p->num_packets = 1; while (true) { + qemu_sem_wait(&p->sem); qemu_mutex_lock(&p->mutex); multifd_send_fill_packet(p); if (p->quit) { @@ -882,7 +883,9 @@ static void *multifd_send_thread(void *opaque) break; } qemu_mutex_unlock(&p->mutex); - qemu_sem_wait(&p->sem); + /* this is impossible */ + error_setg(&local_err, "multifd_send_thread: Unknown command"); + break; } out: @@ -1026,6 +1029,7 @@ static void *multifd_recv_thread(void *opaque) trace_multifd_recv_thread_start(p->id); while (true) { + qemu_sem_wait(&p->sem); qemu_mutex_lock(&p->mutex); if (false) { /* ToDo: Packet reception goes here */ @@ -1040,9 +1044,14 @@ static void *multifd_recv_thread(void *opaque) break; } qemu_mutex_unlock(&p->mutex); - qemu_sem_wait(&p->sem); + /* this is impossible */ + error_setg(&local_err, "multifd_recv_thread: Unknown command"); + break; } + if (local_err) { + multifd_recv_terminate_threads(local_err); + } qemu_mutex_lock(&p->mutex); p->running = false; qemu_mutex_unlock(&p->mutex); |