From 3735d4e299adca4b864ab31f702276ed9c0c6dea Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Wed, 5 May 2010 21:17:28 +0000 Subject: [PATCH] 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 --- src/system/kernel/vm/vm_page.cpp | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/src/system/kernel/vm/vm_page.cpp b/src/system/kernel/vm/vm_page.cpp index 821e4a7122..6ac036134d 100644 --- a/src/system/kernel/vm/vm_page.cpp +++ b/src/system/kernel/vm/vm_page.cpp @@ -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: