* 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:
@@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user