hrev44773 adds 1 changeset to branch 'master' old head: 3704c0f8b1bad6ab6cbc6b21d2e33c8bb0dda38e new head: f5a14b17df1d1d13251f4d86a7ed024b516960ed ---------------------------------------------------------------------------- f5a14b1: vm_page_allocate_page_run: fix for aligned page allocations * don't enforce a zero boundary or a zero alignment * when going to the next range, takes alignment into account. It could previously just be enforced again through alignment and loop infinite. * it should help with some FreeBSD based drivers [ JÃrÃme Duval <jerome.duval@xxxxxxxxx> ] ---------------------------------------------------------------------------- Revision: hrev44773 Commit: f5a14b17df1d1d13251f4d86a7ed024b516960ed URL: http://cgit.haiku-os.org/haiku/commit/?id=f5a14b1 Author: JÃrÃme Duval <jerome.duval@xxxxxxxxx> Date: Mon Nov 5 23:29:57 2012 UTC ---------------------------------------------------------------------------- 1 file changed, 7 insertions(+), 4 deletions(-) src/system/kernel/vm/vm_page.cpp | 11 +++++++---- ---------------------------------------------------------------------------- diff --git a/src/system/kernel/vm/vm_page.cpp b/src/system/kernel/vm/vm_page.cpp index 9e4c591..29df4e1 100644 --- a/src/system/kernel/vm/vm_page.cpp +++ b/src/system/kernel/vm/vm_page.cpp @@ -3862,13 +3862,13 @@ vm_page_allocate_page_run(uint32 flags, page_num_t length, page_num_t offsetStart = start + sPhysicalPageOffset; // enforce alignment - if ((offsetStart & alignmentMask) != 0) { + if (alignmentMask != 0 && (offsetStart & alignmentMask) != 0) { offsetStart = ((offsetStart + alignmentMask) & ~alignmentMask) - sPhysicalPageOffset; } // enforce boundary - if (offsetStart << boundaryShift + if (boundaryShift != 0 && offsetStart << boundaryShift != (offsetStart + length - 1) << boundaryShift) { offsetStart = (offsetStart + length - 1) << boundaryShift >> boundaryShift; @@ -3887,7 +3887,10 @@ vm_page_allocate_page_run(uint32 flags, page_num_t length, } dprintf("vm_page_allocate_page_run(): Failed to allocate run of " - "length %" B_PRIuPHYSADDR " in second iteration!", length); + "length %" B_PRIuPHYSADDR " (%" B_PRIuPHYSADDR " %" + B_PRIuPHYSADDR ") in second iteration (align: %" B_PRIuPHYSADDR + " boundary: %" B_PRIuPHYSADDR ") !", length, requestedStart, + end, restrictions->alignment, restrictions->boundary); freeClearQueueLocker.Unlock(); vm_page_unreserve_pages(&reservation); @@ -3916,7 +3919,7 @@ vm_page_allocate_page_run(uint32 flags, page_num_t length, freeClearQueueLocker.Lock(); } - start += i + 1; + start += max_c(i, alignmentMask) + 1; } }