From 77281239071c509b19e2df5ec6de1b4024b7fddf Mon Sep 17 00:00:00 2001 From: Maciej Plewka Date: Fri, 26 Jan 2024 15:19:48 +0100 Subject: [PATCH] fix: Do not use 2mb alignment for host ptr allocs Signed-off-by: Maciej Plewka Related-To: NEO-9945 --- .../source/os_interface/linux/drm_memory_manager.cpp | 5 ++--- shared/source/os_interface/linux/drm_memory_manager.h | 4 ++-- .../test/common/mocks/linux/mock_drm_memory_manager.h | 11 +++++++++++ .../os_interface/linux/drm_memory_manager_tests.cpp | 8 +++----- 4 files changed, 18 insertions(+), 10 deletions(-) diff --git a/shared/source/os_interface/linux/drm_memory_manager.cpp b/shared/source/os_interface/linux/drm_memory_manager.cpp index 060c97d099..064d0061ec 100644 --- a/shared/source/os_interface/linux/drm_memory_manager.cpp +++ b/shared/source/os_interface/linux/drm_memory_manager.cpp @@ -121,7 +121,7 @@ BufferObject *DrmMemoryManager::createRootDeviceBufferObject(uint32_t rootDevice if (bo) { if (isLimitedRange(rootDeviceIndex)) { auto boSize = bo->peekSize(); - bo->setAddress(acquireGpuRange(boSize, rootDeviceIndex, HeapIndex::heapStandard)); + bo->setAddress(DrmMemoryManager::acquireGpuRange(boSize, rootDeviceIndex, HeapIndex::heapStandard)); UNRECOVERABLE_IF(boSize < bo->peekSize()); } } else { @@ -518,8 +518,7 @@ GraphicsAllocation *DrmMemoryManager::allocateGraphicsMemoryForNonSvmHostPtr(con auto offsetInPage = ptrDiff(allocationData.hostPtr, alignedPtr); auto rootDeviceIndex = allocationData.rootDeviceIndex; - alignedSize = alignUp(alignedSize, MemoryConstants::pageSize2M); - auto gpuVirtualAddress = acquireGpuRangeWithCustomAlignment(alignedSize, rootDeviceIndex, HeapIndex::heapStandard, MemoryConstants::pageSize2M); + auto gpuVirtualAddress = acquireGpuRange(alignedSize, rootDeviceIndex, HeapIndex::heapStandard); if (!gpuVirtualAddress) { return nullptr; } diff --git a/shared/source/os_interface/linux/drm_memory_manager.h b/shared/source/os_interface/linux/drm_memory_manager.h index d613e4ad10..985ee6b924 100644 --- a/shared/source/os_interface/linux/drm_memory_manager.h +++ b/shared/source/os_interface/linux/drm_memory_manager.h @@ -108,8 +108,8 @@ class DrmMemoryManager : public MemoryManager { void pushSharedBufferObject(BufferObject *bo); BufferObject *allocUserptr(uintptr_t address, size_t size, uint32_t rootDeviceIndex); bool setDomainCpu(GraphicsAllocation &graphicsAllocation, bool writeEnable); - uint64_t acquireGpuRange(size_t &size, uint32_t rootDeviceIndex, HeapIndex heapIndex); - uint64_t acquireGpuRangeWithCustomAlignment(size_t &size, uint32_t rootDeviceIndex, HeapIndex heapIndex, size_t alignment); + MOCKABLE_VIRTUAL uint64_t acquireGpuRange(size_t &size, uint32_t rootDeviceIndex, HeapIndex heapIndex); + MOCKABLE_VIRTUAL uint64_t acquireGpuRangeWithCustomAlignment(size_t &size, uint32_t rootDeviceIndex, HeapIndex heapIndex, size_t alignment); MOCKABLE_VIRTUAL void releaseGpuRange(void *address, size_t size, uint32_t rootDeviceIndex); void emitPinningRequest(BufferObject *bo, const AllocationData &allocationData) const; uint32_t getDefaultDrmContextId(uint32_t rootDeviceIndex) const; diff --git a/shared/test/common/mocks/linux/mock_drm_memory_manager.h b/shared/test/common/mocks/linux/mock_drm_memory_manager.h index e7b5abaf1f..bc2a4a7258 100644 --- a/shared/test/common/mocks/linux/mock_drm_memory_manager.h +++ b/shared/test/common/mocks/linux/mock_drm_memory_manager.h @@ -147,7 +147,18 @@ class TestedDrmMemoryManager : public MemoryManagerCreate { } return DrmMemoryManager::obtainFdFromHandle(boHandle, rootDeviceIndex); } + uint64_t acquireGpuRange(size_t &size, uint32_t rootDeviceIndex, HeapIndex heapIndex) override { + acquireGpuRangeCalledTimes++; + return DrmMemoryManager::acquireGpuRange(size, rootDeviceIndex, heapIndex); + } + uint64_t acquireGpuRangeWithCustomAlignment(size_t &size, uint32_t rootDeviceIndex, HeapIndex heapIndex, size_t alignment) override { + acquireGpuRangeWithCustomAlignmenCalledTimes++; + return DrmMemoryManager::acquireGpuRangeWithCustomAlignment(size, rootDeviceIndex, heapIndex, alignment); + } + + uint32_t acquireGpuRangeCalledTimes = 0u; + uint32_t acquireGpuRangeWithCustomAlignmenCalledTimes = 0u; ExecutionEnvironment *executionEnvironment = nullptr; protected: diff --git a/shared/test/unit_test/os_interface/linux/drm_memory_manager_tests.cpp b/shared/test/unit_test/os_interface/linux/drm_memory_manager_tests.cpp index adf46dbac3..df63fccef3 100644 --- a/shared/test/unit_test/os_interface/linux/drm_memory_manager_tests.cpp +++ b/shared/test/unit_test/os_interface/linux/drm_memory_manager_tests.cpp @@ -3226,7 +3226,7 @@ TEST_F(DrmMemoryManagerBasic, givenDrmMemoryManagerWhenAllocateGraphicsMemoryFor memoryManager->freeGraphicsMemory(allocation1); } -TEST_F(DrmMemoryManagerBasic, givenDrmMemoryManagerWhenAllocateGraphicsMemoryForNonSvmHostPtrThenGpuVaIsAlignedTo2Mb) { +TEST_F(DrmMemoryManagerBasic, givenDrmMemoryManagerWhenAllocateGraphicsMemoryForNonSvmHostPtrThenAcquireGpuRangeCalled) { AllocationData allocationData; allocationData.rootDeviceIndex = rootDeviceIndex; std::unique_ptr memoryManager(new (std::nothrow) TestedDrmMemoryManager(false, false, false, executionEnvironment)); @@ -3237,10 +3237,8 @@ TEST_F(DrmMemoryManagerBasic, givenDrmMemoryManagerWhenAllocateGraphicsMemoryFor allocationData.hostPtr = reinterpret_cast(0x1234); auto allocation = static_cast(memoryManager->allocateGraphicsMemoryForNonSvmHostPtr(allocationData)); - EXPECT_EQ(static_cast(allocation)->getBO()->peekAddress(), castToUint64(allocation->getReservedAddressPtr())); - EXPECT_TRUE(isAligned(static_cast(allocation)->getBO()->peekAddress())); - EXPECT_TRUE(isAligned(allocation->getReservedAddressSize())); - + EXPECT_EQ(memoryManager->acquireGpuRangeCalledTimes, 1u); + EXPECT_EQ(memoryManager->acquireGpuRangeWithCustomAlignmenCalledTimes, 0u); memoryManager->freeGraphicsMemory(allocation); }