mirror of
https://gitlab.com/qemu-project/qemu
synced 2024-09-06 01:43:39 +00:00
migration: poll the cm event for destination qemu
The destination qemu only poll the comp_channel->fd in qemu_rdma_wait_comp_channel. But when source qemu disconnnect the rdma connection, the destination qemu should be notified. Signed-off-by: Lidong Chen <lidongchen@tencent.com> Reviewed-by: Juan Quintela <quintela@redhat.com> Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com> Signed-off-by: Juan Quintela <quintela@redhat.com>
This commit is contained in:
parent
c50055ae7c
commit
923709896b
|
@ -390,6 +390,7 @@ static void process_incoming_migration_co(void *opaque)
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
assert(mis->from_src_file);
|
assert(mis->from_src_file);
|
||||||
|
mis->migration_incoming_co = qemu_coroutine_self();
|
||||||
mis->largest_page_size = qemu_ram_pagesize_largest();
|
mis->largest_page_size = qemu_ram_pagesize_largest();
|
||||||
postcopy_state_set(POSTCOPY_INCOMING_NONE);
|
postcopy_state_set(POSTCOPY_INCOMING_NONE);
|
||||||
migrate_set_state(&mis->state, MIGRATION_STATUS_NONE,
|
migrate_set_state(&mis->state, MIGRATION_STATUS_NONE,
|
||||||
|
@ -419,7 +420,6 @@ static void process_incoming_migration_co(void *opaque)
|
||||||
|
|
||||||
/* we get COLO info, and know if we are in COLO mode */
|
/* we get COLO info, and know if we are in COLO mode */
|
||||||
if (!ret && migration_incoming_enable_colo()) {
|
if (!ret && migration_incoming_enable_colo()) {
|
||||||
mis->migration_incoming_co = qemu_coroutine_self();
|
|
||||||
qemu_thread_create(&mis->colo_incoming_thread, "COLO incoming",
|
qemu_thread_create(&mis->colo_incoming_thread, "COLO incoming",
|
||||||
colo_process_incoming_thread, mis, QEMU_THREAD_JOINABLE);
|
colo_process_incoming_thread, mis, QEMU_THREAD_JOINABLE);
|
||||||
mis->have_colo_incoming_thread = true;
|
mis->have_colo_incoming_thread = true;
|
||||||
|
@ -443,6 +443,7 @@ static void process_incoming_migration_co(void *opaque)
|
||||||
}
|
}
|
||||||
mis->bh = qemu_bh_new(process_incoming_migration_bh, mis);
|
mis->bh = qemu_bh_new(process_incoming_migration_bh, mis);
|
||||||
qemu_bh_schedule(mis->bh);
|
qemu_bh_schedule(mis->bh);
|
||||||
|
mis->migration_incoming_co = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void migration_incoming_setup(QEMUFile *f)
|
static void migration_incoming_setup(QEMUFile *f)
|
||||||
|
|
|
@ -3226,6 +3226,35 @@ err:
|
||||||
|
|
||||||
static void rdma_accept_incoming_migration(void *opaque);
|
static void rdma_accept_incoming_migration(void *opaque);
|
||||||
|
|
||||||
|
static void rdma_cm_poll_handler(void *opaque)
|
||||||
|
{
|
||||||
|
RDMAContext *rdma = opaque;
|
||||||
|
int ret;
|
||||||
|
struct rdma_cm_event *cm_event;
|
||||||
|
MigrationIncomingState *mis = migration_incoming_get_current();
|
||||||
|
|
||||||
|
ret = rdma_get_cm_event(rdma->channel, &cm_event);
|
||||||
|
if (ret) {
|
||||||
|
error_report("get_cm_event failed %d", errno);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
rdma_ack_cm_event(cm_event);
|
||||||
|
|
||||||
|
if (cm_event->event == RDMA_CM_EVENT_DISCONNECTED ||
|
||||||
|
cm_event->event == RDMA_CM_EVENT_DEVICE_REMOVAL) {
|
||||||
|
error_report("receive cm event, cm event is %d", cm_event->event);
|
||||||
|
rdma->error_state = -EPIPE;
|
||||||
|
if (rdma->return_path) {
|
||||||
|
rdma->return_path->error_state = -EPIPE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mis->migration_incoming_co) {
|
||||||
|
qemu_coroutine_enter(mis->migration_incoming_co);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static int qemu_rdma_accept(RDMAContext *rdma)
|
static int qemu_rdma_accept(RDMAContext *rdma)
|
||||||
{
|
{
|
||||||
RDMACapabilities cap;
|
RDMACapabilities cap;
|
||||||
|
@ -3326,7 +3355,8 @@ static int qemu_rdma_accept(RDMAContext *rdma)
|
||||||
NULL,
|
NULL,
|
||||||
(void *)(intptr_t)rdma->return_path);
|
(void *)(intptr_t)rdma->return_path);
|
||||||
} else {
|
} else {
|
||||||
qemu_set_fd_handler(rdma->channel->fd, NULL, NULL, NULL);
|
qemu_set_fd_handler(rdma->channel->fd, rdma_cm_poll_handler,
|
||||||
|
NULL, rdma);
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = rdma_accept(rdma->cm_id, &conn_param);
|
ret = rdma_accept(rdma->cm_id, &conn_param);
|
||||||
|
|
Loading…
Reference in a new issue