From d18eaf4c5326b0a5e2a50f54bfe700a9ff1a32c2 Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Wed, 27 Jan 2010 20:55:02 +0000 Subject: [PATCH] * Improved the clarity of some loops in the page reservation functions. No functional change (other than avoiding no-ops like subtracting 0). * vm_page_try_reserve_pages(): Moved the kernel tracing calls from the top of the function to the points where the reservation already succeeded. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35322 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/system/kernel/vm/vm_page.cpp | 60 +++++++++++++++++--------------- 1 file changed, 31 insertions(+), 29 deletions(-) diff --git a/src/system/kernel/vm/vm_page.cpp b/src/system/kernel/vm/vm_page.cpp index cee92912f6..53d9c9c464 100644 --- a/src/system/kernel/vm/vm_page.cpp +++ b/src/system/kernel/vm/vm_page.cpp @@ -2171,20 +2171,19 @@ vm_page_reserve_pages(uint32 count, int priority) uint32 systemReserve = kPageReserveForPriority[priority]; while (true) { int32 systemFreePages = sSystemReservedPages; - uint32 toReserve = 0; if (systemFreePages > (int32)systemReserve) { - toReserve = std::min(count, systemFreePages - systemReserve); + uint32 toReserve = std::min(count, systemFreePages - systemReserve); if (atomic_test_and_set(&sSystemReservedPages, systemFreePages - toReserve, systemFreePages) != systemFreePages) { // the count changed in the meantime -- retry continue; } - } - count -= toReserve; - if (count == 0) - return; + count -= toReserve; + if (count == 0) + return; + } break; } @@ -2210,13 +2209,11 @@ vm_page_try_reserve_pages(uint32 count, int priority) if (count == 0) return true; - T(ReservePages(count)); - + uint32 reserved; while (true) { // From the requested count reserve as many pages as possible from the // general reserve. int32 freePages = sUnreservedFreePages; - uint32 reserved = 0; if (freePages > 0) { reserved = std::min((int32)count, freePages); if (atomic_test_and_set(&sUnreservedFreePages, @@ -2225,31 +2222,36 @@ vm_page_try_reserve_pages(uint32 count, int priority) // the count changed in the meantime -- retry continue; } - } - if (reserved == count) - return true; - - // Try to get the remaining pages from the system reserve. - uint32 systemReserve = kPageReserveForPriority[priority]; - uint32 leftToReserve = count - reserved; - while (true) { - int32 systemFreePages = sSystemReservedPages; - if ((uint32)systemFreePages < leftToReserve + systemReserve) { - // no dice - vm_page_unreserve_pages(reserved); - return false; - } - - if (atomic_test_and_set(&sSystemReservedPages, - systemFreePages - leftToReserve, systemFreePages) - == systemFreePages) { + if (reserved == count) { + T(ReservePages(count)); return true; } + } else + reserved = 0; - // the count changed in the meantime -- retry - continue; + break; + } + + // Try to get the remaining pages from the system reserve. + uint32 systemReserve = kPageReserveForPriority[priority]; + uint32 leftToReserve = count - reserved; + while (true) { + int32 systemFreePages = sSystemReservedPages; + if ((uint32)systemFreePages < leftToReserve + systemReserve) { + // no dice + vm_page_unreserve_pages(reserved); + return false; } + + if (atomic_test_and_set(&sSystemReservedPages, + systemFreePages - leftToReserve, systemFreePages) + == systemFreePages) { + T(ReservePages(count)); + return true; + } + + // the count changed in the meantime -- retry } }