From: Sarit Zubakov Date: Sun, 19 Mar 2017 19:48:16 +0000 (+0000) Subject: msg/async/rdma: Fix crash when running traffic X-Git-Tag: v12.0.2~300^2~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=67797db5beabaeef8518763eee1fe9ffa2a96546;p=ceph-ci.git msg/async/rdma: Fix crash when running traffic Root cause- called lock mutex twice by same thread. Solution- Added function erase_qpn_lockless() and update to call new function. issue:1007313 Change-Id: Iacc6b217331381219e269682d3fae4061a1922f9 Signed-off-by: Sarit Zubakov --- diff --git a/src/msg/async/rdma/RDMAStack.cc b/src/msg/async/rdma/RDMAStack.cc index e946afad014..86b6c1b4a71 100644 --- a/src/msg/async/rdma/RDMAStack.cc +++ b/src/msg/async/rdma/RDMAStack.cc @@ -119,7 +119,7 @@ void RDMADispatcher::handle_async_event() } else { ldout(cct, 1) << __func__ << " it's not forwardly stopped by us, reenable=" << conn << dendl; conn->fault(); - erase_qpn(qpn); + erase_qpn_lockless(qpn); } } else { ldout(cct, 1) << __func__ << " ibv_get_async_event: dev=" << global_infiniband->get_device()->ctxt @@ -295,9 +295,8 @@ RDMAConnectedSocketImpl* RDMADispatcher::get_conn_lockless(uint32_t qp) return it->second.second; } -void RDMADispatcher::erase_qpn(uint32_t qpn) +void RDMADispatcher::erase_qpn_lockless(uint32_t qpn) { - Mutex::Locker l(lock); auto it = qp_conns.find(qpn); if (it == qp_conns.end()) return ; @@ -307,6 +306,12 @@ void RDMADispatcher::erase_qpn(uint32_t qpn) --num_qp_conn; } +void RDMADispatcher::erase_qpn(uint32_t qpn) +{ + Mutex::Locker l(lock); + erase_qpn_lockless(qpn); +} + void RDMADispatcher::handle_pre_fork() { done = true; diff --git a/src/msg/async/rdma/RDMAStack.h b/src/msg/async/rdma/RDMAStack.h index 9e5d288bd3b..e8a0b56ac8d 100644 --- a/src/msg/async/rdma/RDMAStack.h +++ b/src/msg/async/rdma/RDMAStack.h @@ -130,6 +130,7 @@ class RDMADispatcher : public CephContext::ForkWatcher { } RDMAStack* get_stack() { return stack; } RDMAConnectedSocketImpl* get_conn_lockless(uint32_t qp); + void erase_qpn_lockless(uint32_t qpn); void erase_qpn(uint32_t qpn); Infiniband::CompletionQueue* get_tx_cq() const { return tx_cq; } Infiniband::CompletionQueue* get_rx_cq() const { return rx_cq; }