From 5c94c30e1bb87021880e5e34d9dec1e98a62c15c Mon Sep 17 00:00:00 2001 From: Bananymous Date: Thu, 21 May 2026 02:16:41 +0300 Subject: [PATCH] Kernel: Use spinlocks instead of mutexes for RWLock All the operations are super fast, just checking or changing few integers, there is no need for a yielding mutex :^) --- kernel/include/kernel/Lock/RWLock.h | 24 +++++++++++++++--------- kernel/kernel/Storage/DiskCache.cpp | 1 + 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/kernel/include/kernel/Lock/RWLock.h b/kernel/include/kernel/Lock/RWLock.h index 46ab8550..b829bf7c 100644 --- a/kernel/include/kernel/Lock/RWLock.h +++ b/kernel/include/kernel/Lock/RWLock.h @@ -1,7 +1,7 @@ #pragma once -#include -#include +#include +#include namespace Kernel { @@ -15,15 +15,18 @@ namespace Kernel void rd_lock() { - LockGuard _(m_mutex); + SpinLockGuard _(m_lock); while (m_writers_waiting > 0 || m_writer != -1) - m_thread_blocker.block_indefinite(&m_mutex); + { + SpinLockGuardAsMutex smutex(_); + m_thread_blocker.block_indefinite(&smutex); + } m_readers_active++; } void rd_unlock() { - LockGuard _(m_mutex); + SpinLockGuard _(m_lock); if (--m_readers_active == 0) m_thread_blocker.unblock(); } @@ -36,11 +39,14 @@ namespace Kernel return; } - LockGuard _(m_mutex); + SpinLockGuard _(m_lock); m_writers_waiting++; while (m_readers_active > 0 || m_writer != -1) - m_thread_blocker.block_indefinite(&m_mutex); + { + SpinLockGuardAsMutex smutex(_); + m_thread_blocker.block_indefinite(&smutex); + } m_writers_waiting--; m_writer = Thread::current_tid(); @@ -51,13 +57,13 @@ namespace Kernel { if (--m_writer_depth != 0) return; - LockGuard _(m_mutex); + SpinLockGuard _(m_lock); m_writer = -1; m_thread_blocker.unblock(); } private: - Mutex m_mutex; + SpinLock m_lock; ThreadBlocker m_thread_blocker; uint32_t m_readers_active { 0 }; uint32_t m_writers_waiting { 0 }; diff --git a/kernel/kernel/Storage/DiskCache.cpp b/kernel/kernel/Storage/DiskCache.cpp index c4c6d2fa..547b5444 100644 --- a/kernel/kernel/Storage/DiskCache.cpp +++ b/kernel/kernel/Storage/DiskCache.cpp @@ -1,5 +1,6 @@ #include #include +#include #include #include #include