]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
msg/async/rdma: use type safe chunk_base
authorKefu Chai <kchai@redhat.com>
Fri, 14 Apr 2017 05:37:25 +0000 (13:37 +0800)
committerKefu Chai <kchai@redhat.com>
Fri, 14 Apr 2017 10:30:41 +0000 (18:30 +0800)
also silence the clang static analyzer warning of

Result of 'malloc' is converted to a pointer of type 'char', which is
incompatible with sizeof operand type 'class
Infiniband::MemoryManager::Chunk'

in Infiniband::MemoryManager::Cluster::fill()

Signed-off-by: Kefu Chai <kchai@redhat.com>
src/msg/async/rdma/Infiniband.cc
src/msg/async/rdma/Infiniband.h

index 1edb4ca71d674c1c797358020314542263912cc1..cda9d2bd206d120b1c40737f1c1be5e543127c3d 100644 (file)
@@ -443,11 +443,9 @@ Infiniband::MemoryManager::Cluster::Cluster(MemoryManager& m, uint32_t s)
 
 Infiniband::MemoryManager::Cluster::~Cluster()
 {
-  char *p = chunk_base;
-  for (uint32_t i = 0; i < num_chunk; i++){
-    Chunk *chunk = reinterpret_cast<Chunk*>(p);
+  const auto chunk_end = chunk_base + num_chunk;
+  for (auto chunk = chunk_base; chunk != chunk_end; chunk++) {
     chunk->~Chunk();
-    p += sizeof(Chunk);
   }
 
   ::free(chunk_base);
@@ -469,17 +467,16 @@ int Infiniband::MemoryManager::Cluster::fill(uint32_t num)
   }
   end = base + bytes;
   assert(base);
-  chunk_base = (char*)::malloc(sizeof(Chunk) * num);
+  chunk_base = static_cast<Chunk*>(::malloc(sizeof(Chunk) * num));
   memset(chunk_base, 0, sizeof(Chunk) * num);
   free_chunks.reserve(num);
-  char *ptr = chunk_base;
+  Chunk* chunk = chunk_base;
   for (uint32_t offset = 0; offset < bytes; offset += buffer_size){
-    Chunk *chunk = reinterpret_cast<Chunk*>(ptr);
     ibv_mr* m = ibv_reg_mr(manager.pd->pd, base+offset, buffer_size, IBV_ACCESS_REMOTE_WRITE | IBV_ACCESS_LOCAL_WRITE);
     assert(m);
     new(chunk) Chunk(m, buffer_size, base+offset);
     free_chunks.push_back(chunk);
-    ptr += sizeof(Chunk);
+    chunk++;
   }
   return 0;
 }
index 53850eda1185d7197b6bf8ab27c7a4fc5c54dd39..58cf13e1938a5b228f8dbd68f349b3f2ff0a2d1c 100644 (file)
@@ -102,7 +102,7 @@ class Infiniband {
       int get_buffers(std::vector<Chunk*> &chunks, size_t bytes);
       Chunk *get_chunk_by_buffer(const char *c) {
         uint32_t idx = (c - base) / buffer_size;
-        Chunk *chunk = reinterpret_cast<Chunk*>(chunk_base + sizeof(Chunk) * idx);
+        Chunk *chunk = chunk_base + idx;
         return chunk;
       }
       bool is_my_buffer(const char *c) const {
@@ -116,7 +116,7 @@ class Infiniband {
       std::vector<Chunk*> free_chunks;
       char *base = nullptr;
       char *end = nullptr;
-      char* chunk_base;
+      Chunk* chunk_base = nullptr;
     };
 
     MemoryManager(Device *d, ProtectionDomain *p, bool hugepage);