fix: do not align to 64kb when requested alignment is bigger

Related-To: NEO-14082
Signed-off-by: Maciej Plewka <maciej.plewka@intel.com>
This commit is contained in:
Maciej Plewka
2025-07-22 14:34:22 +00:00
committed by Compute-Runtime-Automation
parent 5893fb08fb
commit 88fb60a515
3 changed files with 44 additions and 2 deletions

View File

@@ -206,7 +206,7 @@ GraphicsAllocation *WddmMemoryManager::allocateGraphicsMemoryForImageImpl(const
GraphicsAllocation *WddmMemoryManager::allocateGraphicsMemory64kb(const AllocationData &allocationData) {
AllocationData allocationData64KbAlignment = allocationData;
allocationData64KbAlignment.alignment = MemoryConstants::pageSize64k;
allocationData64KbAlignment.alignment = MemoryConstants::pageSize64k > allocationData64KbAlignment.alignment ? MemoryConstants::pageSize64k : allocationData64KbAlignment.alignment;
return allocateGraphicsMemoryUsingKmdAndMapItToCpuVA(allocationData64KbAlignment, true);
}
@@ -252,7 +252,7 @@ GraphicsAllocation *WddmMemoryManager::allocateGraphicsMemoryUsingKmdAndMapItToC
}
auto gmm = new Gmm(executionEnvironment.rootDeviceEnvironments[allocationData.rootDeviceIndex]->getGmmHelper(), nullptr,
sizeAligned, 0u,
sizeAligned, allocationData.alignment,
CacheSettingsHelper::getGmmUsageType(wddmAllocation->getAllocationType(), !!allocationData.flags.uncacheable, productHelper, hwInfo),
storageInfo,
gmmRequirements);

View File

@@ -385,6 +385,38 @@ TEST(MemoryManagerTest, givenEnabled64kbPagesWhenGraphicsMemoryWithoutAllow64kbP
memoryManager.freeGraphicsMemory(allocation);
}
TEST(MemoryManagerTest, givenEnabled64kbPagesWhenGraphicsMemoryWith128kbAlignmentCreatedThen64kbAllocationIsReturned) {
MockExecutionEnvironment executionEnvironment(defaultHwInfo.get());
MockMemoryManager memoryManager(true, false, executionEnvironment);
AllocationData allocData;
AllocationProperties properties(mockRootDeviceIndex, 10, AllocationType::buffer, mockDeviceBitfield);
memoryManager.getAllocationData(allocData, properties, nullptr, memoryManager.createStorageInfoFromProperties(properties));
allocData.flags.allow64kbPages = true;
allocData.alignment = 2 * MemoryConstants::pageSize64k;
auto allocation = memoryManager.allocateGraphicsMemory(allocData);
EXPECT_TRUE(memoryManager.allocation64kbPageCreated);
memoryManager.freeGraphicsMemory(allocation);
}
TEST(MemoryManagerTest, givenEnabled64kbPagesWhenGraphicsMemoryWith32kbAlignmentCreatedThen64kbAllocationIsReturned) {
MockExecutionEnvironment executionEnvironment(defaultHwInfo.get());
MockMemoryManager memoryManager(true, false, executionEnvironment);
AllocationData allocData;
AllocationProperties properties(mockRootDeviceIndex, 10, AllocationType::buffer, mockDeviceBitfield);
memoryManager.getAllocationData(allocData, properties, nullptr, memoryManager.createStorageInfoFromProperties(properties));
allocData.flags.allow64kbPages = true;
allocData.alignment = MemoryConstants::pageSize64k / 2;
auto allocation = memoryManager.allocateGraphicsMemory(allocData);
EXPECT_TRUE(memoryManager.allocation64kbPageCreated);
memoryManager.freeGraphicsMemory(allocation);
}
TEST(MemoryManagerTest, givenDisabled64kbPagesWhenGraphicsMemoryMustBeHostMemoryAndIsAllocatedWithNullptrForBufferThenNon64kbAllocationIsReturned) {
MockExecutionEnvironment executionEnvironment(defaultHwInfo.get());
MockMemoryManager memoryManager(false, false, executionEnvironment);

View File

@@ -264,6 +264,16 @@ TEST_F(WddmMemoryManagerTests, givenAllocateGraphicsMemory64kbWhen32bitThenAddre
memoryManager.freeGraphicsMemory(allocation);
}
TEST_F(WddmMemoryManagerTests, givenMemoryManagerWith64KBPagesEnabledWhenAllocateGraphicsMemoryWith128kbAlignmentThenGmmObjectHasCorrectAlignment) {
MockWddmMemoryManager memoryManager(false, false, *executionEnvironment);
AllocationData allocationData;
allocationData.size = 4096u;
allocationData.alignment = 2 * MemoryConstants::pageSize64k;
auto allocation = memoryManager.allocateGraphicsMemory64kb(allocationData);
EXPECT_EQ(allocation->getDefaultGmm()->resourceParams.BaseAlignment, allocationData.alignment);
memoryManager.freeGraphicsMemory(allocation);
}
class MockAllocateGraphicsMemoryUsingKmdAndMapItToCpuVAWddm : public MemoryManagerCreate<WddmMemoryManager> {
public:
using WddmMemoryManager::adjustGpuPtrToHostAddressSpace;