From de471d003bc07b248c229864b31b4b2116683fcc Mon Sep 17 00:00:00 2001 From: Changcheng Liu Date: Thu, 20 Jun 2019 14:29:52 +0800 Subject: [PATCH] msg/async/rdma: simplify Cluster::get_buffers implementation Keep same logic: 1. If parameter block_size is zero, then allocate all the free chunks to parameter std::vector &chunks. i.e. chunk_buffer_number = free_chunks.size() 2. If paramter block_size is not zero, then allocate the requested or all the free chunks to paramter std::vector &chunks. Signed-off-by: Changcheng Liu --- src/msg/async/rdma/Infiniband.cc | 25 ++++++------------------- 1 file changed, 6 insertions(+), 19 deletions(-) diff --git a/src/msg/async/rdma/Infiniband.cc b/src/msg/async/rdma/Infiniband.cc index dc82f1915f9..3bb207d971a 100644 --- a/src/msg/async/rdma/Infiniband.cc +++ b/src/msg/async/rdma/Infiniband.cc @@ -616,27 +616,14 @@ void Infiniband::MemoryManager::Cluster::take_back(std::vector &ck) } } -int Infiniband::MemoryManager::Cluster::get_buffers(std::vector &chunks, size_t bytes) +int Infiniband::MemoryManager::Cluster::get_buffers(std::vector &chunks, size_t block_size) { - uint32_t num = bytes / buffer_size + 1; - if (bytes % buffer_size == 0) - --num; - int r = num; std::lock_guard l{lock}; - if (free_chunks.empty()) - return 0; - if (!bytes) { - r = free_chunks.size(); - for (auto c : free_chunks) - chunks.push_back(c); - free_chunks.clear(); - return r; - } - if (free_chunks.size() < num) { - num = free_chunks.size(); - r = num; - } - for (uint32_t i = 0; i < num; ++i) { + uint32_t chunk_buffer_number = (block_size + buffer_size - 1) / buffer_size; + chunk_buffer_number = free_chunks.size() < chunk_buffer_number ? free_chunks.size(): chunk_buffer_number; + uint32_t r = 0; + + for (r = 0; r < chunk_buffer_number; ++r) { chunks.push_back(free_chunks.back()); free_chunks.pop_back(); } -- 2.39.5