Browse Source

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
Liav A 5 năm trước cách đây
mục cha
commit
bce510bf6f

+ 11 - 6
Kernel/VM/MemoryManager.cpp

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

+ 1 - 0
Kernel/VM/MemoryManager.h

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