Loading migration/ram.c +42 −10 Original line number Diff line number Diff line Loading @@ -437,6 +437,7 @@ struct MultiFDSendParams { uint8_t id; char *name; QemuThread thread; QIOChannel *c; QemuSemaphore sem; QemuMutex mutex; bool running; Loading Loading @@ -491,6 +492,8 @@ int multifd_save_cleanup(Error **errp) if (p->running) { qemu_thread_join(&p->thread); } socket_send_channel_destroy(p->c); p->c = NULL; qemu_mutex_destroy(&p->mutex); qemu_sem_destroy(&p->sem); g_free(p->name); Loading Loading @@ -524,6 +527,27 @@ static void *multifd_send_thread(void *opaque) return NULL; } static void multifd_new_send_channel_async(QIOTask *task, gpointer opaque) { MultiFDSendParams *p = opaque; QIOChannel *sioc = QIO_CHANNEL(qio_task_get_source(task)); Error *local_err = NULL; if (qio_task_propagate_error(task, &local_err)) { if (multifd_save_cleanup(&local_err) != 0) { migrate_set_error(migrate_get_current(), local_err); } } else { p->c = QIO_CHANNEL(sioc); qio_channel_set_delay(p->c, false); p->running = true; qemu_thread_create(&p->thread, p->name, multifd_send_thread, p, QEMU_THREAD_JOINABLE); atomic_inc(&multifd_send_state->count); } } int multifd_save_setup(void) { int thread_count; Loading @@ -544,11 +568,7 @@ int multifd_save_setup(void) p->quit = false; p->id = i; p->name = g_strdup_printf("multifdsend_%d", i); p->running = true; qemu_thread_create(&p->thread, p->name, multifd_send_thread, p, QEMU_THREAD_JOINABLE); atomic_inc(&multifd_send_state->count); socket_send_channel_create(multifd_new_send_channel_async, p); } return 0; } Loading @@ -557,6 +577,7 @@ struct MultiFDRecvParams { uint8_t id; char *name; QemuThread thread; QIOChannel *c; QemuSemaphore sem; QemuMutex mutex; bool running; Loading Loading @@ -609,6 +630,8 @@ int multifd_load_cleanup(Error **errp) if (p->running) { qemu_thread_join(&p->thread); } object_unref(OBJECT(p->c)); p->c = NULL; qemu_mutex_destroy(&p->mutex); qemu_sem_destroy(&p->sem); g_free(p->name); Loading Loading @@ -663,10 +686,6 @@ int multifd_load_setup(void) p->quit = false; p->id = i; p->name = g_strdup_printf("multifdrecv_%d", i); p->running = true; qemu_thread_create(&p->thread, p->name, multifd_recv_thread, p, QEMU_THREAD_JOINABLE); atomic_inc(&multifd_recv_state->count); } return 0; } Loading @@ -684,7 +703,20 @@ bool multifd_recv_all_channels_created(void) void multifd_recv_new_channel(QIOChannel *ioc) { /* nothing to do yet */ MultiFDRecvParams *p; /* we need to invent channels id's until we transmit */ /* we will remove this on a later patch */ static int i; p = &multifd_recv_state->params[i]; i++; p->c = ioc; object_ref(OBJECT(ioc)); p->running = true; qemu_thread_create(&p->thread, p->name, multifd_recv_thread, p, QEMU_THREAD_JOINABLE); atomic_inc(&multifd_recv_state->count); } /** Loading Loading
migration/ram.c +42 −10 Original line number Diff line number Diff line Loading @@ -437,6 +437,7 @@ struct MultiFDSendParams { uint8_t id; char *name; QemuThread thread; QIOChannel *c; QemuSemaphore sem; QemuMutex mutex; bool running; Loading Loading @@ -491,6 +492,8 @@ int multifd_save_cleanup(Error **errp) if (p->running) { qemu_thread_join(&p->thread); } socket_send_channel_destroy(p->c); p->c = NULL; qemu_mutex_destroy(&p->mutex); qemu_sem_destroy(&p->sem); g_free(p->name); Loading Loading @@ -524,6 +527,27 @@ static void *multifd_send_thread(void *opaque) return NULL; } static void multifd_new_send_channel_async(QIOTask *task, gpointer opaque) { MultiFDSendParams *p = opaque; QIOChannel *sioc = QIO_CHANNEL(qio_task_get_source(task)); Error *local_err = NULL; if (qio_task_propagate_error(task, &local_err)) { if (multifd_save_cleanup(&local_err) != 0) { migrate_set_error(migrate_get_current(), local_err); } } else { p->c = QIO_CHANNEL(sioc); qio_channel_set_delay(p->c, false); p->running = true; qemu_thread_create(&p->thread, p->name, multifd_send_thread, p, QEMU_THREAD_JOINABLE); atomic_inc(&multifd_send_state->count); } } int multifd_save_setup(void) { int thread_count; Loading @@ -544,11 +568,7 @@ int multifd_save_setup(void) p->quit = false; p->id = i; p->name = g_strdup_printf("multifdsend_%d", i); p->running = true; qemu_thread_create(&p->thread, p->name, multifd_send_thread, p, QEMU_THREAD_JOINABLE); atomic_inc(&multifd_send_state->count); socket_send_channel_create(multifd_new_send_channel_async, p); } return 0; } Loading @@ -557,6 +577,7 @@ struct MultiFDRecvParams { uint8_t id; char *name; QemuThread thread; QIOChannel *c; QemuSemaphore sem; QemuMutex mutex; bool running; Loading Loading @@ -609,6 +630,8 @@ int multifd_load_cleanup(Error **errp) if (p->running) { qemu_thread_join(&p->thread); } object_unref(OBJECT(p->c)); p->c = NULL; qemu_mutex_destroy(&p->mutex); qemu_sem_destroy(&p->sem); g_free(p->name); Loading Loading @@ -663,10 +686,6 @@ int multifd_load_setup(void) p->quit = false; p->id = i; p->name = g_strdup_printf("multifdrecv_%d", i); p->running = true; qemu_thread_create(&p->thread, p->name, multifd_recv_thread, p, QEMU_THREAD_JOINABLE); atomic_inc(&multifd_recv_state->count); } return 0; } Loading @@ -684,7 +703,20 @@ bool multifd_recv_all_channels_created(void) void multifd_recv_new_channel(QIOChannel *ioc) { /* nothing to do yet */ MultiFDRecvParams *p; /* we need to invent channels id's until we transmit */ /* we will remove this on a later patch */ static int i; p = &multifd_recv_state->params[i]; i++; p->c = ioc; object_ref(OBJECT(ioc)); p->running = true; qemu_thread_create(&p->thread, p->name, multifd_recv_thread, p, QEMU_THREAD_JOINABLE); atomic_inc(&multifd_recv_state->count); } /** Loading