From: Changcheng Liu Date: Mon, 26 Aug 2019 08:57:28 +0000 (+0800) Subject: msg/async/rdma: change rdma_event_channel to be non blocked X-Git-Tag: v15.1.0~1481^2~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=5e3e134a726292bc9d74778b3181136d0a42aba2;p=ceph.git msg/async/rdma: change rdma_event_channel to be non blocked rdma_event_channel is blocked by default, if there's no event in the event channel, rdma_get_cm_event could be blocked forever. This is not "asynchronous" messenger. Signed-off-by: Changcheng Liu --- diff --git a/src/msg/async/rdma/RDMAIWARPServerSocketImpl.cc b/src/msg/async/rdma/RDMAIWARPServerSocketImpl.cc index 2b8291d35d3..317e9f2874f 100644 --- a/src/msg/async/rdma/RDMAIWARPServerSocketImpl.cc +++ b/src/msg/async/rdma/RDMAIWARPServerSocketImpl.cc @@ -37,6 +37,10 @@ int RDMAIWARPServerSocketImpl::listen(entity_addr_t &sa, goto err; } server_setup_socket = cm_channel->fd; + rc = net.set_nonblock(server_setup_socket); + if (rc < 0) { + goto err; + } ldout(cct, 20) << __func__ << " fd of cm_channel is " << server_setup_socket << dendl; return 0; @@ -69,6 +73,13 @@ int RDMAIWARPServerSocketImpl::accept(ConnectedSocket *sock, const SocketOptions struct rdma_cm_id *event_cm_id = cm_event->id; struct rdma_event_channel *event_channel = rdma_create_event_channel(); + if (net.set_nonblock(event_channel->fd) < 0) { + lderr(cct) << __func__ << " failed to switch event channel to non-block, close event channel " << dendl; + rdma_destroy_event_channel(event_channel); + rdma_ack_cm_event(cm_event); + return -errno; + } + rdma_migrate_id(event_cm_id, event_channel); struct rdma_cm_id *new_cm_id = event_cm_id;