From 5ad12a800d5076cdbb62f86ebc1fb665d04c08dd Mon Sep 17 00:00:00 2001 From: Jerome Duval Date: Fri, 9 Nov 2012 00:21:41 +0100 Subject: [PATCH] vm_page_allocate_page_run: use a mask to enforce the boundary * use a mask to enforce the boundary as suggested by Ingo. Thanks! --- src/system/kernel/vm/vm_page.cpp | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/src/system/kernel/vm/vm_page.cpp b/src/system/kernel/vm/vm_page.cpp index 007aacdae9..d2add5a297 100644 --- a/src/system/kernel/vm/vm_page.cpp +++ b/src/system/kernel/vm/vm_page.cpp @@ -3831,8 +3831,8 @@ vm_page_allocate_page_run(uint32 flags, page_num_t length, ASSERT(((alignmentMask + 1) & alignmentMask) == 0); // alignment must be a power of 2 - // compute the boundary shift - uint32 boundaryShift = 0; + // compute the boundary mask + uint32 boundaryMask = 0; if (restrictions->boundary != 0) { page_num_t boundary = restrictions->boundary / B_PAGE_SIZE; // boundary must be a power of two and not less than alignment and @@ -3841,8 +3841,7 @@ vm_page_allocate_page_run(uint32 flags, page_num_t length, ASSERT(boundary >= alignmentMask + 1); ASSERT(boundary >= length); - while ((boundary >>= 1) > 0) - boundaryShift++; + boundaryMask = -boundary; } vm_page_reservation reservation; @@ -3858,19 +3857,17 @@ vm_page_allocate_page_run(uint32 flags, page_num_t length, int useCached = freePages > 0 && (page_num_t)freePages > 2 * length ? 0 : 1; for (;;) { - if (alignmentMask != 0 || boundaryShift != 0) { + if (alignmentMask != 0 || boundaryMask != 0) { page_num_t offsetStart = start + sPhysicalPageOffset; // enforce alignment - if ((offsetStart & alignmentMask) != 0) { + if ((offsetStart & alignmentMask) != 0) offsetStart = (offsetStart + alignmentMask) & ~alignmentMask; - } // enforce boundary - if (boundaryShift != 0 && offsetStart << boundaryShift - != (offsetStart + length - 1) << boundaryShift) { - offsetStart = (offsetStart + length - 1) << boundaryShift - >> boundaryShift; + if (boundaryMask != 0 && ((offsetStart ^ (offsetStart + + length - 1)) & boundaryMask) != 0) { + offsetStart = (offsetStart + length - 1) & boundaryMask; } start = offsetStart - sPhysicalPageOffset;