From a84d893af862a40bd2c093a4b1d0eb6e7f1640da Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Fri, 19 Aug 2022 12:14:46 +0200 Subject: [PATCH] Kernel/x86: Re-enable interrupts ASAP when handling page faults As soon as we've saved CR2 (the faulting address), we can re-enable interrupt processing. This should make the kernel more responsive under heavy fault loads. --- Kernel/Arch/x86/common/Interrupts.cpp | 6 +++++- Kernel/Memory/AnonymousVMObject.cpp | 1 - Kernel/Memory/MemoryManager.cpp | 2 -- Kernel/Memory/Region.cpp | 3 --- 4 files changed, 5 insertions(+), 7 deletions(-) diff --git a/Kernel/Arch/x86/common/Interrupts.cpp b/Kernel/Arch/x86/common/Interrupts.cpp index 6e75c219c4..5a128532b7 100644 --- a/Kernel/Arch/x86/common/Interrupts.cpp +++ b/Kernel/Arch/x86/common/Interrupts.cpp @@ -254,8 +254,12 @@ void page_fault_handler(TrapFrame* trap) { clac(); - auto& regs = *trap->regs; + // NOTE: Once we've extracted the faulting address from CR2, + // we can re-enable interrupts. auto fault_address = read_cr2(); + sti(); + + auto& regs = *trap->regs; if constexpr (PAGE_FAULT_DEBUG) { u32 fault_page_directory = read_cr3(); diff --git a/Kernel/Memory/AnonymousVMObject.cpp b/Kernel/Memory/AnonymousVMObject.cpp index 2ee446e81f..cfff86ff52 100644 --- a/Kernel/Memory/AnonymousVMObject.cpp +++ b/Kernel/Memory/AnonymousVMObject.cpp @@ -317,7 +317,6 @@ size_t AnonymousVMObject::cow_pages() const PageFaultResponse AnonymousVMObject::handle_cow_fault(size_t page_index, VirtualAddress vaddr) { - VERIFY_INTERRUPTS_DISABLED(); SpinlockLocker lock(m_lock); if (is_volatile()) { diff --git a/Kernel/Memory/MemoryManager.cpp b/Kernel/Memory/MemoryManager.cpp index b623c7ee94..d15a143c91 100644 --- a/Kernel/Memory/MemoryManager.cpp +++ b/Kernel/Memory/MemoryManager.cpp @@ -715,8 +715,6 @@ Region* MemoryManager::find_region_from_vaddr(VirtualAddress vaddr) PageFaultResponse MemoryManager::handle_page_fault(PageFault const& fault) { - VERIFY_INTERRUPTS_DISABLED(); - auto faulted_in_range = [&fault](auto const* start, auto const* end) { return fault.vaddr() >= VirtualAddress { start } && fault.vaddr() < VirtualAddress { end }; }; diff --git a/Kernel/Memory/Region.cpp b/Kernel/Memory/Region.cpp index 4e6e3ce68b..c69004b451 100644 --- a/Kernel/Memory/Region.cpp +++ b/Kernel/Memory/Region.cpp @@ -402,7 +402,6 @@ PageFaultResponse Region::handle_fault(PageFault const& fault) PageFaultResponse Region::handle_zero_fault(size_t page_index_in_region) { - VERIFY_INTERRUPTS_DISABLED(); VERIFY(vmobject().is_anonymous()); SpinlockLocker locker(vmobject().m_lock); @@ -444,7 +443,6 @@ PageFaultResponse Region::handle_zero_fault(size_t page_index_in_region) PageFaultResponse Region::handle_cow_fault(size_t page_index_in_region) { - VERIFY_INTERRUPTS_DISABLED(); auto current_thread = Thread::current(); if (current_thread) current_thread->did_cow_fault(); @@ -461,7 +459,6 @@ PageFaultResponse Region::handle_cow_fault(size_t page_index_in_region) PageFaultResponse Region::handle_inode_fault(size_t page_index_in_region) { - VERIFY_INTERRUPTS_DISABLED(); VERIFY(vmobject().is_inode()); VERIFY(!s_mm_lock.is_locked_by_current_processor()); VERIFY(!g_scheduler_lock.is_locked_by_current_processor());