From: Changcheng Liu Date: Mon, 1 Jul 2019 05:18:44 +0000 (+0800) Subject: msg/async/rdma: simplify chunk::read implementation X-Git-Tag: v15.1.0~1781^2~25 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=947520c336f12109e345f9c5bab42917407dca82;p=ceph-ci.git msg/async/rdma: simplify chunk::read implementation 1. offload chunk::read without managing bound. 2. reset chunk::offset & chunk::bound before releasing to pool. Signed-off-by: Changcheng Liu --- diff --git a/src/msg/async/rdma/Infiniband.cc b/src/msg/async/rdma/Infiniband.cc index f22034eb0d7..0d2fdebb4d3 100644 --- a/src/msg/async/rdma/Infiniband.cc +++ b/src/msg/async/rdma/Infiniband.cc @@ -541,16 +541,10 @@ uint32_t Infiniband::MemoryManager::Chunk::get_bound() uint32_t Infiniband::MemoryManager::Chunk::read(char* buf, uint32_t len) { uint32_t left = get_size(); - if (left >= len) { - memcpy(buf, buffer+offset, len); - offset += len; - return len; - } else { - memcpy(buf, buffer+offset, left); - offset = 0; - bound = 0; - return left; - } + uint32_t read_len = left <= len ? left : len; + memcpy(buf, buffer + offset, read_len); + offset += read_len; + return read_len; } uint32_t Infiniband::MemoryManager::Chunk::write(char* buf, uint32_t len) diff --git a/src/msg/async/rdma/RDMAConnectedSocketImpl.cc b/src/msg/async/rdma/RDMAConnectedSocketImpl.cc index 13b61654c4e..e8c7d4745b5 100644 --- a/src/msg/async/rdma/RDMAConnectedSocketImpl.cc +++ b/src/msg/async/rdma/RDMAConnectedSocketImpl.cc @@ -299,6 +299,7 @@ ssize_t RDMAConnectedSocketImpl::read(char* buf, size_t len) chunk->prepare_read(response->byte_len); worker->perf_logger->inc(l_msgr_rdma_rx_bytes, response->byte_len); if (response->byte_len == 0) { + chunk->clear(); dispatcher->perf_logger->inc(l_msgr_rdma_rx_fin); if (connected) { error = ECONNRESET; @@ -315,6 +316,7 @@ ssize_t RDMAConnectedSocketImpl::read(char* buf, size_t len) ldout(cct, 25) << __func__ << " buffers add a chunk: " << chunk->get_offset() << ":" << chunk->get_bound() << dendl; } else { read += chunk->read(buf+read, response->byte_len); + chunk->clear(); dispatcher->post_chunk_to_pool(chunk); update_post_backlog(); } @@ -347,6 +349,7 @@ ssize_t RDMAConnectedSocketImpl::read_buffers(char* buf, size_t len) read += tmp; ldout(cct, 25) << __func__ << " this iter read: " << tmp << " bytes." << " offset: " << (*c)->get_offset() << " ,bound: " << (*c)->get_bound() << ". Chunk:" << *c << dendl; if ((*c)->get_size() == 0) { + (*c)->clear(); dispatcher->post_chunk_to_pool(*c); update_post_backlog(); ldout(cct, 25) << __func__ << " one chunk over." << dendl;