vm_page_allocate_page_run: use a mask to enforce the boundary
* use a mask to enforce the boundary as suggested by Ingo. Thanks!
This commit is contained in:
@@ -3831,8 +3831,8 @@ vm_page_allocate_page_run(uint32 flags, page_num_t length,
|
|||||||
ASSERT(((alignmentMask + 1) & alignmentMask) == 0);
|
ASSERT(((alignmentMask + 1) & alignmentMask) == 0);
|
||||||
// alignment must be a power of 2
|
// alignment must be a power of 2
|
||||||
|
|
||||||
// compute the boundary shift
|
// compute the boundary mask
|
||||||
uint32 boundaryShift = 0;
|
uint32 boundaryMask = 0;
|
||||||
if (restrictions->boundary != 0) {
|
if (restrictions->boundary != 0) {
|
||||||
page_num_t boundary = restrictions->boundary / B_PAGE_SIZE;
|
page_num_t boundary = restrictions->boundary / B_PAGE_SIZE;
|
||||||
// boundary must be a power of two and not less than alignment and
|
// 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 >= alignmentMask + 1);
|
||||||
ASSERT(boundary >= length);
|
ASSERT(boundary >= length);
|
||||||
|
|
||||||
while ((boundary >>= 1) > 0)
|
boundaryMask = -boundary;
|
||||||
boundaryShift++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
vm_page_reservation reservation;
|
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;
|
int useCached = freePages > 0 && (page_num_t)freePages > 2 * length ? 0 : 1;
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
if (alignmentMask != 0 || boundaryShift != 0) {
|
if (alignmentMask != 0 || boundaryMask != 0) {
|
||||||
page_num_t offsetStart = start + sPhysicalPageOffset;
|
page_num_t offsetStart = start + sPhysicalPageOffset;
|
||||||
|
|
||||||
// enforce alignment
|
// enforce alignment
|
||||||
if ((offsetStart & alignmentMask) != 0) {
|
if ((offsetStart & alignmentMask) != 0)
|
||||||
offsetStart = (offsetStart + alignmentMask) & ~alignmentMask;
|
offsetStart = (offsetStart + alignmentMask) & ~alignmentMask;
|
||||||
}
|
|
||||||
|
|
||||||
// enforce boundary
|
// enforce boundary
|
||||||
if (boundaryShift != 0 && offsetStart << boundaryShift
|
if (boundaryMask != 0 && ((offsetStart ^ (offsetStart
|
||||||
!= (offsetStart + length - 1) << boundaryShift) {
|
+ length - 1)) & boundaryMask) != 0) {
|
||||||
offsetStart = (offsetStart + length - 1) << boundaryShift
|
offsetStart = (offsetStart + length - 1) & boundaryMask;
|
||||||
>> boundaryShift;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
start = offsetStart - sPhysicalPageOffset;
|
start = offsetStart - sPhysicalPageOffset;
|
||||||
|
|||||||
Reference in New Issue
Block a user