summaryrefslogtreecommitdiff
path: root/Kernel
diff options
context:
space:
mode:
authorAndreas Kling <kling@serenityos.org>2022-08-19 13:54:14 +0200
committerAndreas Kling <kling@serenityos.org>2022-08-19 14:05:57 +0200
commit806ade1367d84c37075d9edb1d95a266de71cc51 (patch)
treeb23e991cc540c888b9538e8687d4fee73b6f1594 /Kernel
parent5ada38f9c3c525938ef9032b4d551d050661e2e9 (diff)
downloadserenity-806ade1367d84c37075d9edb1d95a266de71cc51.zip
Kernel: Don't lock scheduler while updating thread scheduling times
We can use simple atomic variables with relaxed ordering for this, and avoid locking altogether.
Diffstat (limited to 'Kernel')
-rw-r--r--Kernel/Thread.cpp3
-rw-r--r--Kernel/Thread.h8
2 files changed, 5 insertions, 6 deletions
diff --git a/Kernel/Thread.cpp b/Kernel/Thread.cpp
index 0198c65fce..f787e55881 100644
--- a/Kernel/Thread.cpp
+++ b/Kernel/Thread.cpp
@@ -667,8 +667,7 @@ void Thread::update_time_scheduled(u64 current_scheduler_time, bool is_kernel, b
Scheduler::add_time_scheduled(delta, is_kernel);
auto& total_time = is_kernel ? m_total_time_scheduled_kernel : m_total_time_scheduled_user;
- SpinlockLocker scheduler_lock(g_scheduler_lock);
- total_time += delta;
+ total_time.fetch_add(delta, AK::memory_order_relaxed);
}
}
if (no_longer_running)
diff --git a/Kernel/Thread.h b/Kernel/Thread.h
index c34630020c..09a6f2f6b4 100644
--- a/Kernel/Thread.h
+++ b/Kernel/Thread.h
@@ -1062,8 +1062,8 @@ public:
static constexpr u32 default_kernel_stack_size = 65536;
static constexpr u32 default_userspace_stack_size = 1 * MiB;
- u64 time_in_user() const { return m_total_time_scheduled_user; }
- u64 time_in_kernel() const { return m_total_time_scheduled_kernel; }
+ u64 time_in_user() const { return m_total_time_scheduled_user.load(AK::MemoryOrder::memory_order_relaxed); }
+ u64 time_in_kernel() const { return m_total_time_scheduled_kernel.load(AK::MemoryOrder::memory_order_relaxed); }
enum class PreviousMode : u8 {
KernelMode = 0,
@@ -1238,8 +1238,8 @@ private:
Atomic<u32> m_cpu { 0 };
u32 m_cpu_affinity { THREAD_AFFINITY_DEFAULT };
Optional<u64> m_last_time_scheduled;
- u64 m_total_time_scheduled_user { 0 };
- u64 m_total_time_scheduled_kernel { 0 };
+ Atomic<u64> m_total_time_scheduled_user { 0 };
+ Atomic<u64> m_total_time_scheduled_kernel { 0 };
u32 m_ticks_left { 0 };
u32 m_times_scheduled { 0 };
u32 m_ticks_in_user { 0 };