* 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
This commit is contained in:
Ingo Weinhold
2010-01-27 20:55:02 +00:00
parent b6620ccc71
commit d18eaf4c53
+31 -29
View File
@@ -2171,20 +2171,19 @@ vm_page_reserve_pages(uint32 count, int priority)
uint32 systemReserve = kPageReserveForPriority[priority]; uint32 systemReserve = kPageReserveForPriority[priority];
while (true) { while (true) {
int32 systemFreePages = sSystemReservedPages; int32 systemFreePages = sSystemReservedPages;
uint32 toReserve = 0;
if (systemFreePages > (int32)systemReserve) { if (systemFreePages > (int32)systemReserve) {
toReserve = std::min(count, systemFreePages - systemReserve); uint32 toReserve = std::min(count, systemFreePages - systemReserve);
if (atomic_test_and_set(&sSystemReservedPages, if (atomic_test_and_set(&sSystemReservedPages,
systemFreePages - toReserve, systemFreePages) systemFreePages - toReserve, systemFreePages)
!= systemFreePages) { != systemFreePages) {
// the count changed in the meantime -- retry // the count changed in the meantime -- retry
continue; continue;
} }
}
count -= toReserve; count -= toReserve;
if (count == 0) if (count == 0)
return; return;
}
break; break;
} }
@@ -2210,13 +2209,11 @@ vm_page_try_reserve_pages(uint32 count, int priority)
if (count == 0) if (count == 0)
return true; return true;
T(ReservePages(count)); uint32 reserved;
while (true) { while (true) {
// From the requested count reserve as many pages as possible from the // From the requested count reserve as many pages as possible from the
// general reserve. // general reserve.
int32 freePages = sUnreservedFreePages; int32 freePages = sUnreservedFreePages;
uint32 reserved = 0;
if (freePages > 0) { if (freePages > 0) {
reserved = std::min((int32)count, freePages); reserved = std::min((int32)count, freePages);
if (atomic_test_and_set(&sUnreservedFreePages, 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 // the count changed in the meantime -- retry
continue; continue;
} }
}
if (reserved == count) if (reserved == count) {
return true; T(ReservePages(count));
// 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) {
return true; return true;
} }
} else
reserved = 0;
// the count changed in the meantime -- retry break;
continue; }
// 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
} }
} }