From: Xiaowei Chen Date: Mon, 16 Nov 2015 02:40:29 +0000 (-0500) Subject: osd: change mutex to spinlock to optimize thread context switch. X-Git-Tag: v10.0.1~36^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=b3a129041a7ca29d99218fbd31218d800cb83906;p=ceph.git osd: change mutex to spinlock to optimize thread context switch. Signed-off-by: Xiaowei Chen --- diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index afe6ef50d0b6..1c69f4025f64 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -5601,9 +5601,9 @@ void OSD::ms_fast_preprocess(Message *m) MOSDMap *mm = static_cast(m); Session *s = static_cast(m->get_connection()->get_priv()); if (s) { - s->received_map_lock.Lock(); + s->received_map_lock.lock(); s->received_map_epoch = mm->get_last(); - s->received_map_lock.Unlock(); + s->received_map_lock.unlock(); s->put(); } } @@ -5817,9 +5817,9 @@ bool OSD::dispatch_op_fast(OpRequestRef& op, OSDMapRef& osdmap) Session *s = static_cast(op->get_req()-> get_connection()->get_priv()); if (s) { - s->received_map_lock.Lock(); + s->received_map_lock.lock(); epoch_t received_epoch = s->received_map_epoch; - s->received_map_lock.Unlock(); + s->received_map_lock.unlock(); if (received_epoch < msg_epoch) { osdmap_subscribe(msg_epoch, false); } @@ -8043,17 +8043,24 @@ public: void finish(ThreadPool::TPHandle& tp) { OSD::Session *session = static_cast( con->get_priv()); + epoch_t last_sent_epoch; if (session) { - session->sent_epoch_lock.Lock(); + session->sent_epoch_lock.lock(); + last_sent_epoch = session->last_sent_epoch; + session->sent_epoch_lock.unlock(); } osd->service.share_map( name, con.get(), map_epoch, osdmap, - session ? &session->last_sent_epoch : NULL); + session ? &last_sent_epoch : NULL); if (session) { - session->sent_epoch_lock.Unlock(); + session->sent_epoch_lock.lock(); + if (session->last_sent_epoch < last_sent_epoch) { + session->last_sent_epoch = last_sent_epoch; + } + session->sent_epoch_lock.unlock(); session->put(); } } @@ -8092,14 +8099,16 @@ void OSD::handle_op(OpRequestRef& op, OSDMapRef& osdmap) send_map_on_destruct share_map(this, m, osdmap, m->get_map_epoch()); Session *client_session = static_cast(m->get_connection()->get_priv()); + epoch_t last_sent_epoch; if (client_session) { - client_session->sent_epoch_lock.Lock(); + client_session->sent_epoch_lock.lock(); + last_sent_epoch = client_session->last_sent_epoch; + client_session->sent_epoch_lock.unlock(); } share_map.should_send = service.should_share_map( m->get_source(), m->get_connection().get(), m->get_map_epoch(), - osdmap, &client_session->last_sent_epoch); + osdmap, client_session ? &last_sent_epoch : NULL); if (client_session) { - client_session->sent_epoch_lock.Unlock(); client_session->put(); } @@ -8196,15 +8205,17 @@ void OSD::handle_replica_op(OpRequestRef& op, OSDMapRef& osdmap) bool should_share_map = false; Session *peer_session = static_cast(m->get_connection()->get_priv()); + epoch_t last_sent_epoch; if (peer_session) { - peer_session->sent_epoch_lock.Lock(); + peer_session->sent_epoch_lock.lock(); + last_sent_epoch = peer_session->last_sent_epoch; + peer_session->sent_epoch_lock.unlock(); } should_share_map = service.should_share_map( m->get_source(), m->get_connection().get(), m->map_epoch, osdmap, - peer_session ? &peer_session->last_sent_epoch : NULL); + peer_session ? &last_sent_epoch : NULL); if (peer_session) { - peer_session->sent_epoch_lock.Unlock(); peer_session->put(); } @@ -8398,17 +8409,24 @@ void OSD::dequeue_op( if (op->send_map_update) { Message *m = op->get_req(); Session *session = static_cast(m->get_connection()->get_priv()); + epoch_t last_sent_epoch; if (session) { - session->sent_epoch_lock.Lock(); + session->sent_epoch_lock.lock(); + last_sent_epoch = session->last_sent_epoch; + session->sent_epoch_lock.unlock(); } service.share_map( m->get_source(), m->get_connection().get(), op->sent_epoch, osdmap, - session ? &session->last_sent_epoch : NULL); + session ? &last_sent_epoch : NULL); if (session) { - session->sent_epoch_lock.Unlock(); + session->sent_epoch_lock.lock(); + if (session->last_sent_epoch < last_sent_epoch) { + session->last_sent_epoch = last_sent_epoch; + } + session->sent_epoch_lock.unlock(); session->put(); } } diff --git a/src/osd/OSD.h b/src/osd/OSD.h index 44a492c83aa6..b8f2f4001ad1 100644 --- a/src/osd/OSD.h +++ b/src/osd/OSD.h @@ -54,6 +54,7 @@ using namespace std; #include "common/sharedptr_registry.hpp" #include "common/PrioritizedQueue.h" #include "messages/MOSDOp.h" +#include "include/Spinlock.h" #define CEPH_OSD_PROTOCOL 10 /* cluster internal */ @@ -1286,17 +1287,16 @@ public: OSDMapRef osdmap; /// Map as of which waiting_for_pg is current map > waiting_for_pg; - Mutex sent_epoch_lock; + Spinlock sent_epoch_lock; epoch_t last_sent_epoch; - Mutex received_map_lock; + Spinlock received_map_lock; epoch_t received_map_epoch; // largest epoch seen in MOSDMap from here Session(CephContext *cct) : RefCountedObject(cct), auid(-1), con(0), - session_dispatch_lock("Session::session_dispatch_lock"), - sent_epoch_lock("Session::sent_epoch_lock"), last_sent_epoch(0), - received_map_lock("Session::received_map_lock"), received_map_epoch(0) + session_dispatch_lock("Session::session_dispatch_lock"), + last_sent_epoch(0), received_map_epoch(0) {}