Signed-off-by: Juan Quintela <quint...@redhat.com> --- migration/ram.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+)
diff --git a/migration/ram.c b/migration/ram.c index df9646ed2e..264d2e462a 100644 --- a/migration/ram.c +++ b/migration/ram.c @@ -698,6 +698,7 @@ static void multifd_send_page(RAMBlock *block, ram_addr_t offset, } struct MultiFDRecvParams { + /* not changed */ uint8_t id; char *name; QemuThread thread; @@ -705,8 +706,13 @@ struct MultiFDRecvParams { QemuSemaphore sem; QemuMutex mutex; bool running; + /* protected by param mutex */ bool quit; bool sync; + /* how many patckets has recv this channel */ + uint32_t packets_recv; + multifd_pages_t *pages; + bool done; }; typedef struct MultiFDRecvParams MultiFDRecvParams; @@ -716,6 +722,7 @@ struct { int count; /* syncs main thread and channels */ QemuSemaphore sem_main; + multifd_pages_t *pages; } *multifd_recv_state; static void terminate_multifd_recv_threads(Error *errp) @@ -764,10 +771,14 @@ int multifd_load_cleanup(Error **errp) qemu_sem_destroy(&p->sem); g_free(p->name); p->name = NULL; + multifd_pages_clear(p->pages); + p->pages = NULL; } qemu_sem_destroy(&multifd_recv_state->sem_main); g_free(multifd_recv_state->params); multifd_recv_state->params = NULL; + multifd_pages_clear(multifd_recv_state->pages); + multifd_recv_state->pages = NULL; g_free(multifd_recv_state); multifd_recv_state = NULL; @@ -834,6 +845,9 @@ int multifd_load_setup(void) multifd_recv_state->params = g_new0(MultiFDRecvParams, thread_count); atomic_set(&multifd_recv_state->count, 0); qemu_sem_init(&multifd_recv_state->sem_main, 0); + multifd_pages_init(&multifd_recv_state->pages, + migrate_multifd_page_count()); + for (i = 0; i < thread_count; i++) { MultiFDRecvParams *p = &multifd_recv_state->params[i]; @@ -842,6 +856,7 @@ int multifd_load_setup(void) p->quit = false; p->id = i; p->name = g_strdup_printf("multifdrecv_%d", i); + multifd_pages_init(&p->pages, migrate_multifd_page_count()); } return 0; -- 2.14.3