From: "Maciej S. Szmigiero" <[email protected]> multifd_send() function is currently not thread safe, make it thread safe by holding a lock during its execution.
This way it will be possible to safely call it concurrently from multiple threads. Signed-off-by: Maciej S. Szmigiero <[email protected]> --- migration/multifd.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/migration/multifd.c b/migration/multifd.c index 9578a985449b..4575495c8816 100644 --- a/migration/multifd.c +++ b/migration/multifd.c @@ -50,6 +50,10 @@ typedef struct { struct { MultiFDSendParams *params; + + /* multifd_send() body is not thread safe, needs serialization */ + QemuMutex multifd_send_mutex; + /* * Global number of generated multifd packets. * @@ -331,6 +335,7 @@ static void multifd_send_kick_main(MultiFDSendParams *p) */ bool multifd_send(MultiFDSendData **send_data) { + QEMU_LOCK_GUARD(&multifd_send_state->multifd_send_mutex); int i; static int next_channel; MultiFDSendParams *p = NULL; /* make happy gcc */ @@ -508,6 +513,7 @@ static void multifd_send_cleanup_state(void) socket_cleanup_outgoing_migration(); qemu_sem_destroy(&multifd_send_state->channels_created); qemu_sem_destroy(&multifd_send_state->channels_ready); + qemu_mutex_destroy(&multifd_send_state->multifd_send_mutex); g_free(multifd_send_state->params); multifd_send_state->params = NULL; g_free(multifd_send_state); @@ -853,6 +859,7 @@ bool multifd_send_setup(void) thread_count = migrate_multifd_channels(); multifd_send_state = g_malloc0(sizeof(*multifd_send_state)); multifd_send_state->params = g_new0(MultiFDSendParams, thread_count); + qemu_mutex_init(&multifd_send_state->multifd_send_mutex); qemu_sem_init(&multifd_send_state->channels_created, 0); qemu_sem_init(&multifd_send_state->channels_ready, 0); qatomic_set(&multifd_send_state->exiting, 0);
