diff --git a/shared/source/memory_manager/memory_manager.cpp b/shared/source/memory_manager/memory_manager.cpp index 5dee5006f7..028cbc8b1a 100644 --- a/shared/source/memory_manager/memory_manager.cpp +++ b/shared/source/memory_manager/memory_manager.cpp @@ -734,7 +734,7 @@ GraphicsAllocation *MemoryManager::allocateGraphicsMemory(const AllocationData & if (allocationData.gpuAddress) { return allocateGraphicsMemoryWithGpuVa(allocationData); } - if (peek64kbPagesEnabled(allocationData.rootDeviceIndex) && allocationData.flags.allow64kbPages) { + if (peek64kbPagesEnabled(allocationData.rootDeviceIndex) && allocationData.flags.allow64kbPages && (allocationData.alignment <= MemoryConstants::pageSize64k)) { return allocateGraphicsMemory64kb(allocationData); } return allocateGraphicsMemoryWithAlignment(allocationData); diff --git a/shared/source/os_interface/windows/wddm_memory_manager.cpp b/shared/source/os_interface/windows/wddm_memory_manager.cpp index c5c41e83af..6773b1a80e 100644 --- a/shared/source/os_interface/windows/wddm_memory_manager.cpp +++ b/shared/source/os_interface/windows/wddm_memory_manager.cpp @@ -145,7 +145,7 @@ GraphicsAllocation *WddmMemoryManager::allocateMemoryByKMD(const AllocationData GmmRequirements gmmRequirements{}; gmmRequirements.allowLargePages = true; gmmRequirements.preferCompressed = allocationData.flags.preferCompressed; - auto gmm = std::make_unique(executionEnvironment.rootDeviceEnvironments[allocationData.rootDeviceIndex]->getGmmHelper(), allocationData.hostPtr, allocationData.size, 0u, + auto gmm = std::make_unique(executionEnvironment.rootDeviceEnvironments[allocationData.rootDeviceIndex]->getGmmHelper(), allocationData.hostPtr, allocationData.size, allocationData.alignment, CacheSettingsHelper::getGmmUsageType(allocationData.type, !!allocationData.flags.uncacheable, productHelper), systemMemoryStorageInfo, gmmRequirements); auto allocation = std::make_unique(allocationData.rootDeviceIndex, 1u, // numGmms @@ -255,7 +255,7 @@ GraphicsAllocation *WddmMemoryManager::allocateGraphicsMemoryUsingKmdAndMapItToC if (alignGpuAddressTo64KB) { void *tempCPUPtr = cpuPtr; - cpuPtr = alignUp(cpuPtr, MemoryConstants::pageSize64k); + cpuPtr = alignUp(cpuPtr, std::max(alignUp(allocationData.alignment, MemoryConstants::pageSize64k), MemoryConstants::pageSize64k)); wddmAllocation->setGpuAddress(wddmAllocation->getGpuAddress() + ptrDiff(cpuPtr, tempCPUPtr)); } } diff --git a/shared/test/unit_test/memory_manager/memory_manager_allocate_in_preferred_pool_tests.cpp b/shared/test/unit_test/memory_manager/memory_manager_allocate_in_preferred_pool_tests.cpp index 8b00fd7b79..082e6c6085 100644 --- a/shared/test/unit_test/memory_manager/memory_manager_allocate_in_preferred_pool_tests.cpp +++ b/shared/test/unit_test/memory_manager/memory_manager_allocate_in_preferred_pool_tests.cpp @@ -401,6 +401,33 @@ TEST(MemoryManagerTest, givenDisabled64kbPagesWhenGraphicsMemoryMustBeHostMemory memoryManager.freeGraphicsMemory(allocation); } +TEST(MemoryManagerTest, givenEnabled64kbPagesWhenGraphicsMemoryIsAllocatedWithDifferentAlignmentsThenCorrectRoutineIsInvoked) { + MockExecutionEnvironment executionEnvironment(defaultHwInfo.get()); + MockMemoryManager memoryManager(true, false, executionEnvironment); + AllocationData allocData; + + size_t alignment = 8 * MemoryConstants::megaByte; + do { + alignment >>= 1; + + AllocationProperties properties(mockRootDeviceIndex, 10, AllocationType::buffer, mockDeviceBitfield); + properties.alignment = alignment; + + memoryManager.getAllocationData(allocData, properties, nullptr, memoryManager.createStorageInfoFromProperties(properties)); + + auto allocation = memoryManager.allocateGraphicsMemory(allocData); + ASSERT_NE(nullptr, allocation); + if (alignment <= MemoryConstants::pageSize64k) { + EXPECT_TRUE(memoryManager.allocation64kbPageCreated); + } else { + EXPECT_FALSE(memoryManager.allocation64kbPageCreated); + } + EXPECT_TRUE(memoryManager.allocationCreated); + + memoryManager.freeGraphicsMemory(allocation); + } while (alignment != 0); +} + TEST(MemoryManagerTest, givenForced32BitAndEnabled64kbPagesWhenGraphicsMemoryMustBeHostMemoryAndIsAllocatedWithNullptrForBufferThen32BitAllocationOver64kbIsChosen) { MockExecutionEnvironment executionEnvironment(defaultHwInfo.get()); MockMemoryManager memoryManager(false, false, executionEnvironment); diff --git a/shared/test/unit_test/os_interface/windows/wddm_memory_manager_tests.cpp b/shared/test/unit_test/os_interface/windows/wddm_memory_manager_tests.cpp index f95990f7af..0adaecf336 100644 --- a/shared/test/unit_test/os_interface/windows/wddm_memory_manager_tests.cpp +++ b/shared/test/unit_test/os_interface/windows/wddm_memory_manager_tests.cpp @@ -433,6 +433,36 @@ TEST_F(WddmMemoryManagerTests, givenAllocateGraphicsMemoryUsingKmdAndMapItToCpuV EXPECT_GT(reinterpret_cast(gmmHelper->getClientContext())->freeGpuVirtualAddressCalled, 0u); } +TEST_F(WddmMemoryManagerTests, givenAllocateGraphicsMemoryUsingKmdAndMapItToCpuVAWhenCreatingSVMAllocationThenAllocationIsAligned) { + if constexpr (is32bit) { + GTEST_SKIP(); + } + NEO::AllocationData allocData{}; + allocData.flags.allocateMemory = 1; + allocData.flags.useSystemMemory = 1; + allocData.type = NEO::AllocationType::svmCpu; + allocData.usmInitialPlacement = NEO::GraphicsAllocation::DEFAULT; + allocData.allocationMethod = NEO::GfxMemoryAllocationMethod::allocateByKmd; + allocData.size = 1; + allocData.forceKMDAllocation = true; + allocData.makeGPUVaDifferentThanCPUPtr = true; + allocData.useMmapObject = true; + memoryManager->callBaseAllocateGraphicsMemoryUsingKmdAndMapItToCpuVA = true; + + size_t alignment = 8 * MemoryConstants::megaByte; + do { + alignment >>= 1; + allocData.alignment = alignment; + auto allocation = memoryManager->allocateGraphicsMemoryUsingKmdAndMapItToCpuVA(allocData, false); + const auto cpuPtr = allocation->getUnderlyingBuffer(); + EXPECT_NE(nullptr, cpuPtr); + if (alignment != 0) { + EXPECT_EQ(reinterpret_cast(cpuPtr) & (~(alignment - 1)), reinterpret_cast(cpuPtr)); + } + memoryManager->freeGraphicsMemory(allocation); + } while (alignment != 0); +} + TEST_F(WddmMemoryManagerAllocPathTests, givenAllocateGraphicsMemoryUsingKmdAndMapItToCpuVAWhen32bitThenProperAddressSet) { if constexpr (is64bit) { GTEST_SKIP();