]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
msg/async/rdma: simplify Cluster::get_buffers implementation
authorChangcheng Liu <changcheng.liu@aliyun.com>
Thu, 20 Jun 2019 06:29:52 +0000 (14:29 +0800)
committerChangcheng Liu <changcheng.liu@aliyun.com>
Fri, 23 Aug 2019 02:45:22 +0000 (10:45 +0800)
Keep same logic:
1. If parameter block_size is zero, then allocate all the free chunks
to parameter std::vector<Chunk*> &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<Chunk*> &chunks.

Signed-off-by: Changcheng Liu <changcheng.liu@aliyun.com>
src/msg/async/rdma/Infiniband.cc

index dc82f1915f9b0511c084d27ed66a3f3f6ac5ee6f..3bb207d971acf0f298f06b9dff8968eb24d2d3ef 100644 (file)
@@ -616,27 +616,14 @@ void Infiniband::MemoryManager::Cluster::take_back(std::vector<Chunk*> &ck)
   }
 }
 
-int Infiniband::MemoryManager::Cluster::get_buffers(std::vector<Chunk*> &chunks, size_t bytes)
+int Infiniband::MemoryManager::Cluster::get_buffers(std::vector<Chunk*> &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();
   }