Browse Source

Kernel: Wrap around to region start if necessary in take_free_page

Conrad Pankoff 6 năm trước cách đây
mục cha
commit
b29a83d554
1 tập tin đã thay đổi với 11 bổ sung0 xóa
  1. 11 0
      Kernel/VM/PhysicalRegion.cpp

+ 11 - 0
Kernel/VM/PhysicalRegion.cpp

@@ -43,6 +43,7 @@ RetainPtr<PhysicalPage> PhysicalRegion::take_free_page(bool supervisor)
     if (m_used == m_pages)
         return nullptr;
 
+    // search from the last page we allocated
     for (unsigned page = m_last; page < m_pages; page++) {
         if (!m_bitmap.get(page)) {
             m_bitmap.set(page, true);
@@ -52,6 +53,16 @@ RetainPtr<PhysicalPage> PhysicalRegion::take_free_page(bool supervisor)
         }
     }
 
+    // wrap back around to the start in case we missed something
+    for (unsigned page = 0; page < m_last; page++) {
+        if (!m_bitmap.get(page)) {
+            m_bitmap.set(page, true);
+            m_used++;
+            m_last = page + 1;
+            return PhysicalPage::create(m_lower.offset(page * PAGE_SIZE), supervisor);
+        }
+    }
+
     ASSERT_NOT_REACHED();
 
     return nullptr;