migration: Create multifd channels
In both sides. We still don't transmit anything through them. Signed-off-by: Juan Quintela <quintela@redhat.com> Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
This commit is contained in:
parent
3854956ad7
commit
60df2d4ae5
|
@ -437,6 +437,7 @@ struct MultiFDSendParams {
|
||||||
uint8_t id;
|
uint8_t id;
|
||||||
char *name;
|
char *name;
|
||||||
QemuThread thread;
|
QemuThread thread;
|
||||||
|
QIOChannel *c;
|
||||||
QemuSemaphore sem;
|
QemuSemaphore sem;
|
||||||
QemuMutex mutex;
|
QemuMutex mutex;
|
||||||
bool running;
|
bool running;
|
||||||
|
@ -491,6 +492,8 @@ int multifd_save_cleanup(Error **errp)
|
||||||
if (p->running) {
|
if (p->running) {
|
||||||
qemu_thread_join(&p->thread);
|
qemu_thread_join(&p->thread);
|
||||||
}
|
}
|
||||||
|
socket_send_channel_destroy(p->c);
|
||||||
|
p->c = NULL;
|
||||||
qemu_mutex_destroy(&p->mutex);
|
qemu_mutex_destroy(&p->mutex);
|
||||||
qemu_sem_destroy(&p->sem);
|
qemu_sem_destroy(&p->sem);
|
||||||
g_free(p->name);
|
g_free(p->name);
|
||||||
|
@ -524,6 +527,27 @@ static void *multifd_send_thread(void *opaque)
|
||||||
return NULL;
|
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 multifd_save_setup(void)
|
||||||
{
|
{
|
||||||
int thread_count;
|
int thread_count;
|
||||||
|
@ -544,11 +568,7 @@ int multifd_save_setup(void)
|
||||||
p->quit = false;
|
p->quit = false;
|
||||||
p->id = i;
|
p->id = i;
|
||||||
p->name = g_strdup_printf("multifdsend_%d", i);
|
p->name = g_strdup_printf("multifdsend_%d", i);
|
||||||
p->running = true;
|
socket_send_channel_create(multifd_new_send_channel_async, p);
|
||||||
qemu_thread_create(&p->thread, p->name, multifd_send_thread, p,
|
|
||||||
QEMU_THREAD_JOINABLE);
|
|
||||||
|
|
||||||
atomic_inc(&multifd_send_state->count);
|
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -557,6 +577,7 @@ struct MultiFDRecvParams {
|
||||||
uint8_t id;
|
uint8_t id;
|
||||||
char *name;
|
char *name;
|
||||||
QemuThread thread;
|
QemuThread thread;
|
||||||
|
QIOChannel *c;
|
||||||
QemuSemaphore sem;
|
QemuSemaphore sem;
|
||||||
QemuMutex mutex;
|
QemuMutex mutex;
|
||||||
bool running;
|
bool running;
|
||||||
|
@ -609,6 +630,8 @@ int multifd_load_cleanup(Error **errp)
|
||||||
if (p->running) {
|
if (p->running) {
|
||||||
qemu_thread_join(&p->thread);
|
qemu_thread_join(&p->thread);
|
||||||
}
|
}
|
||||||
|
object_unref(OBJECT(p->c));
|
||||||
|
p->c = NULL;
|
||||||
qemu_mutex_destroy(&p->mutex);
|
qemu_mutex_destroy(&p->mutex);
|
||||||
qemu_sem_destroy(&p->sem);
|
qemu_sem_destroy(&p->sem);
|
||||||
g_free(p->name);
|
g_free(p->name);
|
||||||
|
@ -663,10 +686,6 @@ int multifd_load_setup(void)
|
||||||
p->quit = false;
|
p->quit = false;
|
||||||
p->id = i;
|
p->id = i;
|
||||||
p->name = g_strdup_printf("multifdrecv_%d", 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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -684,7 +703,20 @@ bool multifd_recv_all_channels_created(void)
|
||||||
|
|
||||||
void multifd_recv_new_channel(QIOChannel *ioc)
|
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…
Reference in a new issue