mark_page_range_in_use(): When the given range lies partially outside the

array at least work with the part intersecting with the array. Log those
quasi error cases.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36633 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Ingo Weinhold 2010-05-05 21:17:28 +00:00
parent 8588e7fc6f
commit 3735d4e299
1 changed files with 15 additions and 7 deletions

View File

@ -1295,25 +1295,33 @@ clear_page(struct vm_page *page)
static status_t
mark_page_range_in_use(addr_t startPage, addr_t length, bool wired)
mark_page_range_in_use(addr_t startPage, size_t length, bool wired)
{
TRACE(("mark_page_range_in_use: start 0x%lx, len 0x%lx\n",
startPage, length));
if (sPhysicalPageOffset > startPage) {
TRACE(("mark_page_range_in_use: start page %ld is before free list\n",
startPage));
return B_BAD_VALUE;
dprintf("mark_page_range_in_use(%#" B_PRIxADDR ", %#" B_PRIxSIZE "): "
"start page is before free list", startPage, length);
if (sPhysicalPageOffset - startPage >= length)
return B_OK;
length -= sPhysicalPageOffset - startPage;
startPage = sPhysicalPageOffset;
}
startPage -= sPhysicalPageOffset;
if (startPage + length > sNumPages) {
TRACE(("mark_page_range_in_use: range would extend past free list\n"));
return B_BAD_VALUE;
dprintf("mark_page_range_in_use(%#" B_PRIxADDR ", %#" B_PRIxSIZE "): "
"range would extend past free list", startPage, length);
if (startPage >= sNumPages)
return B_OK;
length = sNumPages - startPage;
}
WriteLocker locker(sFreePageQueuesLock);
for (addr_t i = 0; i < length; i++) {
for (size_t i = 0; i < length; i++) {
vm_page *page = &sPages[startPage + i];
switch (page->State()) {
case PAGE_STATE_FREE: