From cd348918f99820ab05918cfb981666f81cf53016 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Wed, 17 Aug 2022 19:21:07 +0200 Subject: [PATCH] Kernel/x86: Move Processor::{leave,clear}_critical() out of line I don't think this code needs to be ALWAYS_INLINE, and moving it out of line will make backtraces nicer. --- Kernel/Arch/x86/Processor.h | 32 +++------------------------- Kernel/Arch/x86/common/Processor.cpp | 31 +++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 29 deletions(-) diff --git a/Kernel/Arch/x86/Processor.h b/Kernel/Arch/x86/Processor.h index 86e0c2182c..6cb8dffd69 100644 --- a/Kernel/Arch/x86/Processor.h +++ b/Kernel/Arch/x86/Processor.h @@ -349,37 +349,11 @@ public: } private: - ALWAYS_INLINE void do_leave_critical() - { - VERIFY(m_in_critical > 0); - if (m_in_critical == 1) { - if (m_in_irq == 0) { - deferred_call_execute_pending(); - VERIFY(m_in_critical == 1); - } - m_in_critical = 0; - if (m_in_irq == 0) - check_invoke_scheduler(); - } else { - m_in_critical = m_in_critical - 1; - } - } + void do_leave_critical(); public: - ALWAYS_INLINE static void leave_critical() - { - current().do_leave_critical(); - } - - ALWAYS_INLINE static u32 clear_critical() - { - auto prev_critical = in_critical(); - write_gs_ptr(__builtin_offsetof(Processor, m_in_critical), 0); - auto& proc = current(); - if (proc.m_in_irq == 0) - proc.check_invoke_scheduler(); - return prev_critical; - } + static void leave_critical(); + static u32 clear_critical(); ALWAYS_INLINE static void restore_critical(u32 prev_critical) { diff --git a/Kernel/Arch/x86/common/Processor.cpp b/Kernel/Arch/x86/common/Processor.cpp index e76fc36840..57dcc13bdf 100644 --- a/Kernel/Arch/x86/common/Processor.cpp +++ b/Kernel/Arch/x86/common/Processor.cpp @@ -1665,4 +1665,35 @@ u64 Processor::time_spent_idle() const return m_idle_thread->time_in_user() + m_idle_thread->time_in_kernel(); } +void Processor::leave_critical() +{ + current().do_leave_critical(); +} + +void Processor::do_leave_critical() +{ + VERIFY(m_in_critical > 0); + if (m_in_critical == 1) { + if (m_in_irq == 0) { + deferred_call_execute_pending(); + VERIFY(m_in_critical == 1); + } + m_in_critical = 0; + if (m_in_irq == 0) + check_invoke_scheduler(); + } else { + m_in_critical = m_in_critical - 1; + } +} + +u32 Processor::clear_critical() +{ + auto prev_critical = in_critical(); + write_gs_ptr(__builtin_offsetof(Processor, m_in_critical), 0); + auto& proc = current(); + if (proc.m_in_irq == 0) + proc.check_invoke_scheduler(); + return prev_critical; +} + }