Kernel: Fix the search method of free userspace physical pages (#742)

Now the userspace page allocator will search through physical regions,
and stop the search as it finds an available page.

Also remove an "address of" sign since we don't need that when
counting size of physical regions
This commit is contained in:
Liav A 2019-11-08 23:39:29 +02:00 committed by Andreas Kling
parent fa77a57257
commit bce510bf6f
Notes: sideshowbarker 2024-07-19 11:19:28 +09:00
2 changed files with 14 additions and 8 deletions

View File

@ -144,7 +144,7 @@ void MemoryManager::initialize_paging()
} else {
if (region.is_null() || region_is_super || region->upper().offset(PAGE_SIZE) != addr) {
m_user_physical_regions.append(PhysicalRegion::create(addr, addr));
region = &m_user_physical_regions.last();
region = m_user_physical_regions.last();
region_is_super = false;
} else {
region->expand(region->lower(), addr);
@ -386,16 +386,21 @@ void MemoryManager::deallocate_user_physical_page(PhysicalPage&& page)
ASSERT_NOT_REACHED();
}
RefPtr<PhysicalPage> MemoryManager::find_free_user_physical_page()
{
RefPtr<PhysicalPage> page;
for (auto& region : m_user_physical_regions) {
page = region.take_free_page(false);
if (!page.is_null())
break;
}
return page;
}
RefPtr<PhysicalPage> MemoryManager::allocate_user_physical_page(ShouldZeroFill should_zero_fill)
{
InterruptDisabler disabler;
RefPtr<PhysicalPage> page;
for (auto& region : m_user_physical_regions) {
page = region.take_free_page(false);
if (page.is_null())
continue;
}
RefPtr<PhysicalPage> page = find_free_user_physical_page();
if (!page) {
if (m_user_physical_regions.is_empty()) {

View File

@ -103,6 +103,7 @@ private:
static Region* region_from_vaddr(VirtualAddress);
RefPtr<PhysicalPage> find_free_user_physical_page();
u8* quickmap_page(PhysicalPage&);
void unquickmap_page();