diff --git a/Kernel/Process.cpp b/Kernel/Process.cpp index 9deac61357..027eea7a63 100644 --- a/Kernel/Process.cpp +++ b/Kernel/Process.cpp @@ -223,6 +223,8 @@ Region* Process::allocate_region_with_vmobject(VirtualAddress vaddr, size_t size bool Process::deallocate_region(Region& region) { InterruptDisabler disabler; + if (m_region_lookup_cache.region == ®ion) + m_region_lookup_cache.region = nullptr; for (int i = 0; i < m_regions.size(); ++i) { if (&m_regions[i] == ®ion) { m_regions.remove(i); @@ -234,10 +236,16 @@ bool Process::deallocate_region(Region& region) Region* Process::region_from_range(const Range& range) { + if (m_region_lookup_cache.range == range && m_region_lookup_cache.region) + return m_region_lookup_cache.region; + size_t size = PAGE_ROUND_UP(range.size()); for (auto& region : m_regions) { - if (region.vaddr() == range.base() && region.size() == size) + if (region.vaddr() == range.base() && region.size() == size) { + m_region_lookup_cache.range = range; + m_region_lookup_cache.region = ®ion; return ®ion; + } } return nullptr; } diff --git a/Kernel/Process.h b/Kernel/Process.h index 4b0ba61fbc..9d127f825e 100644 --- a/Kernel/Process.h +++ b/Kernel/Process.h @@ -452,6 +452,11 @@ private: Region* region_containing(const Range&); NonnullOwnPtrVector m_regions; + struct RegionLookupCache { + Range range; + Region* region { nullptr }; + }; + RegionLookupCache m_region_lookup_cache; pid_t m_ppid { 0 }; mode_t m_umask { 022 };