1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 11:48:10 +00:00

Kernel: Don't bother with page tables for PROT_NONE mappings

When mapping or unmapping completely inaccessible memory regions,
we don't need to update the page tables at all. This saves a bunch of
time in some situations, most notably during dynamic linking, where we
make a large VM reservation and immediately throw it away. :^)
This commit is contained in:
Andreas Kling 2022-01-15 17:37:17 +01:00
parent 9ddccbc6da
commit c6adefcfc0
2 changed files with 18 additions and 5 deletions

View file

@ -52,10 +52,16 @@ Region::~Region()
MM.unregister_kernel_region(*this);
if (m_page_directory) {
SpinlockLocker page_lock(m_page_directory->get_lock());
SpinlockLocker lock(s_mm_lock);
unmap(ShouldDeallocateVirtualRange::Yes);
VERIFY(!m_page_directory);
SpinlockLocker pd_locker(m_page_directory->get_lock());
if (!is_readable() && !is_writable() && !is_executable()) {
// If the region is "PROT_NONE", we didn't map it in the first place,
// so all we need to do here is deallocate the VM.
m_page_directory->range_allocator().deallocate(range());
} else {
SpinlockLocker mm_locker(s_mm_lock);
unmap_with_locks_held(ShouldDeallocateVirtualRange::Yes, ShouldFlushTLB::Yes, pd_locker, mm_locker);
VERIFY(!m_page_directory);
}
}
}