[Memory] Fix AllocRange upper bound and update PhysicalHeap tests
BaseHeap::AllocRange was rounding the inclusive high_address UP via xe::align(), which could push the search range one alignment stride past the requested end. The new free-block-tracker top-down search treats high_page_number as an inclusive max (usable_end = high_page_number + 1), so the round-up caused it to return a base page one stride beyond the caller's bound — most visibly when PhysicalHeap::Alloc passed parent_heap_end = GetPhysicalAddress(...) just below a page boundary, producing a translated address one page past the child heap and tripping "passed out of range address range" in BaseHeap::AllocFixed. Drop the xe::align on the high side so high_address stays a true inclusive bound. The low_address round-up is still correct since allocations must START at or above the aligned low.
This commit is contained in:
@@ -1182,8 +1182,7 @@ bool BaseHeap::AllocRange(uint32_t low_address, uint32_t high_address,
|
||||
alignment = xe::round_up(alignment, page_size_);
|
||||
uint32_t page_count = get_page_count(size, page_size_);
|
||||
low_address = std::max(heap_base_, xe::align(low_address, alignment));
|
||||
high_address = std::min(heap_base_ + (heap_size_ - 1),
|
||||
xe::align(high_address, alignment));
|
||||
high_address = std::min(heap_base_ + (heap_size_ - 1), high_address);
|
||||
|
||||
uint32_t low_page_number = (low_address - heap_base_) >> page_size_shift_;
|
||||
uint32_t high_page_number = (high_address - heap_base_) >> page_size_shift_;
|
||||
|
||||
Reference in New Issue
Block a user