From 91e22d8bd955ae76f5a2374b466bc195edf8822b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Tue, 28 Sep 2021 08:48:22 +0300 Subject: MDEV-26467: Actually use spinloop on block_lock --- storage/innobase/include/srw_lock.h | 2 +- storage/innobase/sync/srw_lock.cc | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/storage/innobase/include/srw_lock.h b/storage/innobase/include/srw_lock.h index 308f3c0a68e..3d0d82b81df 100644 --- a/storage/innobase/include/srw_lock.h +++ b/storage/innobase/include/srw_lock.h @@ -151,7 +151,7 @@ public: void wr_unlock(); #else /** mutex for synchronization; held by U or X lock holders */ - srw_mutex writer; + srw_mutex_impl writer; /** S or U holders, and WRITER flag for X holder or waiter */ std::atomic readers; /** indicates an X request; readers=WRITER indicates granted X lock */ diff --git a/storage/innobase/sync/srw_lock.cc b/storage/innobase/sync/srw_lock.cc index 3f1a56f2e6b..d8ab4b70b4d 100644 --- a/storage/innobase/sync/srw_lock.cc +++ b/storage/innobase/sync/srw_lock.cc @@ -383,7 +383,23 @@ void ssux_lock_impl::wr_wait(uint32_t lk) DBUG_ASSERT(writer.is_locked()); DBUG_ASSERT(lk); DBUG_ASSERT(lk < WRITER); + + if (spinloop) + { + const unsigned delay= srw_pause_delay(); + + for (auto spin= srv_n_spin_wait_rounds; spin; spin--) + { + srw_pause(delay); + lk= readers.load(std::memory_order_acquire); + if (lk == WRITER) + return; + DBUG_ASSERT(lk > WRITER); + } + } + lk|= WRITER; + do { DBUG_ASSERT(lk > WRITER); -- cgit v1.2.1