From 832814cefabcc2514ba987ec637e31d493ac5a4f Mon Sep 17 00:00:00 2001 From: Maciej Plewka Date: Fri, 28 Jun 2019 10:00:56 +0200 Subject: [PATCH] Add debug flag to enable calling freeMemory in memory Manager Change-Id: I61a3c6e768bd9a479731f9e3e000069c9b677c33 Signed-off-by: Maciej Plewka --- .../os_agnostic_memory_manager.cpp | 4 ++-- runtime/os_interface/debug_variables_base.inl | 1 + .../memory_manager/memory_manager_tests.cpp | 24 +++++++++++++++++-- unit_tests/test_files/igdrcl.config | 1 + 4 files changed, 26 insertions(+), 4 deletions(-) diff --git a/runtime/memory_manager/os_agnostic_memory_manager.cpp b/runtime/memory_manager/os_agnostic_memory_manager.cpp index 7e61edad7d..6bfb362815 100644 --- a/runtime/memory_manager/os_agnostic_memory_manager.cpp +++ b/runtime/memory_manager/os_agnostic_memory_manager.cpp @@ -215,7 +215,7 @@ void OsAgnosticMemoryManager::freeGraphicsMemoryImpl(GraphicsAllocation *gfxAllo } auto aubCenter = executionEnvironment.aubCenter.get(); - if (aubCenter && aubCenter->getAubManager()) { + if (aubCenter && aubCenter->getAubManager() && DebugManager.flags.EnableFreeMemory.get()) { aubCenter->getAubManager()->freeMemory(gfxAllocation->getGpuAddress(), gfxAllocation->getUnderlyingBufferSize()); } @@ -275,7 +275,7 @@ void OsAgnosticMemoryManager::cleanOsHandles(OsHandleStorage &handleStorage) { for (unsigned int i = 0; i < maxFragmentsCount; i++) { if (handleStorage.fragmentStorageData[i].freeTheFragment) { auto aubCenter = executionEnvironment.aubCenter.get(); - if (aubCenter && aubCenter->getAubManager()) { + if (aubCenter && aubCenter->getAubManager() && DebugManager.flags.EnableFreeMemory.get()) { aubCenter->getAubManager()->freeMemory((uint64_t)handleStorage.fragmentStorageData[i].cpuPtr, handleStorage.fragmentStorageData[i].fragmentSize); } delete handleStorage.fragmentStorageData[i].osHandleStorage; diff --git a/runtime/os_interface/debug_variables_base.inl b/runtime/os_interface/debug_variables_base.inl index f50637fdab..d8e40c5a7e 100644 --- a/runtime/os_interface/debug_variables_base.inl +++ b/runtime/os_interface/debug_variables_base.inl @@ -103,6 +103,7 @@ DECLARE_DEBUG_VARIABLE(bool, EnablePassInlineData, false, "Enable passing of inl DECLARE_DEBUG_VARIABLE(bool, EnableFormatQuery, false, "Enable sharing format querying") DECLARE_DEBUG_VARIABLE(bool, AllowOpenFdOperations, false, "When enabled driver is allowed to call DRM_IOCTL_PRIME_HANDLE_TO_FD.") DECLARE_DEBUG_VARIABLE(bool, EnableBlitterOperationsForReadWriteBuffers, false, "Use Blitter engine for Read/Write Buffers operations") +DECLARE_DEBUG_VARIABLE(bool, EnableFreeMemory, false, "Enable freeMemory in memory manager") DECLARE_DEBUG_VARIABLE(int32_t, EnableCacheFlushAfterWalker, 0, "-1: platform behavior, 0: disabled, 1: enabled. Adds dedicated cache flush command after WALKER command when surfaces used by kernel require to flush the cache") DECLARE_DEBUG_VARIABLE(int32_t, EnableLocalMemory, -1, "-1: default behavior, 0: disabled, 1: enabled, Allows allocating graphics memory in Local Memory") DECLARE_DEBUG_VARIABLE(int32_t, EnableStatelessToStatefulBufferOffsetOpt, -1, "-1: dont override, 0: disable, 1: enable, Enables buffer-offset improvement of the stateless to stateful optimization") diff --git a/unit_tests/memory_manager/memory_manager_tests.cpp b/unit_tests/memory_manager/memory_manager_tests.cpp index 5aaebae881..9c5b7d5dd4 100644 --- a/unit_tests/memory_manager/memory_manager_tests.cpp +++ b/unit_tests/memory_manager/memory_manager_tests.cpp @@ -303,7 +303,9 @@ TEST_F(MemoryAllocatorTest, givenOsHandleStorageWhenOsHandlesAreCleanedAndAubMan EXPECT_EQ(nullptr, mockAubCenter->aubManager); } -TEST_F(MemoryAllocatorTest, givenOsHandleStorageWhenOsHandlesAreCleanedAndAubManagerIsAvailableThenFreeMemoryIsCalledOnAubManager) { +TEST_F(MemoryAllocatorTest, givenOsHandleStorageAndFreeMemoryEnabledWhenOsHandlesAreCleanedAndAubManagerIsAvailableThenFreeMemoryIsCalledOnAubManager) { + DebugManagerStateRestore dbgRestore; + DebugManager.flags.EnableFreeMemory.set(true); MockExecutionEnvironment mockExecutionEnvironment(*platformDevices); MockMemoryManager mockMemoryManager(mockExecutionEnvironment); auto mockManager = new MockAubManager(); @@ -1155,7 +1157,9 @@ INSTANTIATE_TEST_CASE_P(OsAgnosticMemoryManagerWithParams, OsAgnosticMemoryManagerWithParams, ::testing::Values(false, true)); -TEST(OsAgnosticMemoryManager, givenOsAgnosticMemoryManagerWhenGraphicsAllocationIsDestroyedThenFreeMemoryOnAubManagerShouldBeCalled) { +TEST(OsAgnosticMemoryManager, givenOsAgnosticMemoryManagerAndFreeMemoryEnabledWhenGraphicsAllocationIsDestroyedThenFreeMemoryOnAubManagerShouldBeCalled) { + DebugManagerStateRestore dbgRestore; + DebugManager.flags.EnableFreeMemory.set(true); MockExecutionEnvironment executionEnvironment; OsAgnosticMemoryManager memoryManager(executionEnvironment); MockAubManager *mockManager = new MockAubManager(); @@ -1169,6 +1173,22 @@ TEST(OsAgnosticMemoryManager, givenOsAgnosticMemoryManagerWhenGraphicsAllocation EXPECT_TRUE(mockManager->freeMemoryCalled); } +TEST(OsAgnosticMemoryManager, givenOsAgnosticMemoryManagerAndFreeMemoryDisabledWhenGraphicsAllocationIsDestroyedThenFreeMemoryOnAubManagerShouldBeCalled) { + DebugManagerStateRestore dbgRestore; + DebugManager.flags.EnableFreeMemory.set(false); + MockExecutionEnvironment executionEnvironment; + OsAgnosticMemoryManager memoryManager(executionEnvironment); + MockAubManager *mockManager = new MockAubManager(); + MockAubCenter *mockAubCenter = new MockAubCenter(platformDevices[0], false, "file_name.aub", CommandStreamReceiverType::CSR_AUB); + mockAubCenter->aubManager = std::unique_ptr(mockManager); + executionEnvironment.aubCenter.reset(mockAubCenter); + + auto gfxAllocation = memoryManager.allocateGraphicsMemoryWithProperties(MockAllocationProperties{MemoryConstants::pageSize}); + EXPECT_FALSE(mockManager->freeMemoryCalled); + memoryManager.freeGraphicsMemory(gfxAllocation); + EXPECT_FALSE(mockManager->freeMemoryCalled); +} + TEST(MemoryManager, givenSharedResourceCopyWhenAllocatingGraphicsMemoryThenAllocateGraphicsMemoryForImageIsCalled) { ExecutionEnvironment *executionEnvironment = platformImpl->peekExecutionEnvironment(); MockMemoryManager memoryManager(false, true, *executionEnvironment); diff --git a/unit_tests/test_files/igdrcl.config b/unit_tests/test_files/igdrcl.config index ccc365efb3..132c107be7 100644 --- a/unit_tests/test_files/igdrcl.config +++ b/unit_tests/test_files/igdrcl.config @@ -113,3 +113,4 @@ EnableFormatQuery = 0 AllowOpenFdOperations = 0 EnableBlitterOperationsForReadWriteBuffers = 0 DisableAuxTranslation = 0 +EnableFreeMemory = 0