@@ -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;
Signed-off-by: Juan Quintela <quintela@redhat.com> --- migration/ram.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+)