aboutsummaryrefslogtreecommitdiff
path: root/migration/ram.c
diff options
context:
space:
mode:
authorJuan Quintela <quintela@redhat.com>2018-04-11 02:44:24 +0200
committerJuan Quintela <quintela@redhat.com>2018-06-27 13:28:11 +0200
commitd82628e4bde23aaf50273cc835c8ce28b43590bd (patch)
tree8a37bed39158bb91deec7511ff5e2736f6dd7d30 /migration/ram.c
parent408ea6ae4c8f94621dff64d69c7fa3f6e84ef2fb (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/ram.c')
-rw-r--r--migration/ram.c13
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);