fix: correct page alignment calculation in getPageAlignedSizeRequired

In the current implementation, for some data the result is incorrect.
For example for:
size=131073 (64 kB * 2 + 1),
pageSize=65536 (64 kB),
the result should be 196608 (64 kB * 3) instead of 131073.

Related-To: GSD-8948
Signed-off-by: Jaroslaw Warchulski <jaroslaw.warchulski@intel.com>
This commit is contained in:
Jaroslaw Warchulski
2024-10-15 20:24:47 +00:00
committed by Compute-Runtime-Automation
parent c94e38f74d
commit 56c5c78961
2 changed files with 8 additions and 3 deletions

View File

@@ -1105,7 +1105,7 @@ size_t ContextImp::getPageAlignedSizeRequired(size_t size, NEO::HeapIndex *heapR
// Given a size larger than the pageSize, then round the size up to the next pageSize alignment if unaligned
if (size > pageSize) {
if (size % pageSize > 0) {
return ((size + pageSize) & (~pageSize));
return ((size + pageSize - 1) & ~(pageSize - 1));
} else {
return size;
}

View File

@@ -1705,14 +1705,19 @@ TEST_F(ContextTest, whenCallingVirtualMemoryReservationWithInvalidMultiPageSizeI
res = contextImp->queryVirtualMemPageSize(device, size, &pagesize);
size = pagesize * 3 + 10;
EXPECT_EQ(ZE_RESULT_SUCCESS, res);
NEO::MemoryManager *failingReserveMemoryManager = new ReserveMemoryManagerMock(*neoDevice->executionEnvironment);
auto memoryManager = driverHandle->getMemoryManager();
driverHandle->setMemoryManager(failingReserveMemoryManager);
size = pagesize * 3 + 10;
res = contextImp->reserveVirtualMem(pStart, size, &ptr);
EXPECT_EQ(ZE_RESULT_ERROR_UNSUPPORTED_SIZE, res);
size = pagesize * 2 + 1;
res = contextImp->reserveVirtualMem(pStart, size, &ptr);
EXPECT_EQ(ZE_RESULT_ERROR_UNSUPPORTED_SIZE, res);
driverHandle->setMemoryManager(memoryManager);
delete failingReserveMemoryManager;