From b29a83d554200182bd1bfb41b08e601c7944c4df Mon Sep 17 00:00:00 2001 From: Conrad Pankoff Date: Wed, 12 Jun 2019 23:31:14 +1000 Subject: [PATCH] Kernel: Wrap around to region start if necessary in take_free_page --- Kernel/VM/PhysicalRegion.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/Kernel/VM/PhysicalRegion.cpp b/Kernel/VM/PhysicalRegion.cpp index 4743d1b59d..fd7021d977 100644 --- a/Kernel/VM/PhysicalRegion.cpp +++ b/Kernel/VM/PhysicalRegion.cpp @@ -43,6 +43,7 @@ RetainPtr 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 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;