From: Kefu Chai Date: Fri, 14 Apr 2017 05:37:25 +0000 (+0800) Subject: msg/async/rdma: use type safe chunk_base X-Git-Tag: v12.0.3~326^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=28d43be0561e22b990cbb97564810f230fdc93f8;p=ceph.git msg/async/rdma: use type safe chunk_base 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 --- diff --git a/src/msg/async/rdma/Infiniband.cc b/src/msg/async/rdma/Infiniband.cc index 1edb4ca71d67..cda9d2bd206d 100644 --- a/src/msg/async/rdma/Infiniband.cc +++ b/src/msg/async/rdma/Infiniband.cc @@ -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(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(::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(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; } diff --git a/src/msg/async/rdma/Infiniband.h b/src/msg/async/rdma/Infiniband.h index 53850eda1185..58cf13e1938a 100644 --- a/src/msg/async/rdma/Infiniband.h +++ b/src/msg/async/rdma/Infiniband.h @@ -102,7 +102,7 @@ class Infiniband { int get_buffers(std::vector &chunks, size_t bytes); Chunk *get_chunk_by_buffer(const char *c) { uint32_t idx = (c - base) / buffer_size; - Chunk *chunk = reinterpret_cast(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 free_chunks; char *base = nullptr; char *end = nullptr; - char* chunk_base; + Chunk* chunk_base = nullptr; }; MemoryManager(Device *d, ProtectionDomain *p, bool hugepage);