From 447c3f58004b53dc9793d97ada01714f9f0cf5b6 Mon Sep 17 00:00:00 2001 From: Lukasz Jobczyk Date: Thu, 1 Oct 2020 11:48:08 +0200 Subject: [PATCH] Add debug flag to disable gem close worker Change-Id: If2453b2c168aa7086ad387f97ac2255291e08ae1 Signed-off-by: Lukasz Jobczyk --- .../linux/device_command_stream.inl | 4 ++- .../linux/device_command_stream_tests.cpp | 27 +++++++++++++++++++ .../linux/drm_memory_manager_tests.cpp | 24 +++++++++++++++++ .../test/unit_test/test_files/igdrcl.config | 1 + .../debug_settings/debug_variables_base.inl | 1 + .../os_interface/linux/drm_memory_manager.cpp | 5 ++++ 6 files changed, 61 insertions(+), 1 deletion(-) diff --git a/opencl/source/os_interface/linux/device_command_stream.inl b/opencl/source/os_interface/linux/device_command_stream.inl index 1229d93cc9..6fb3652d3f 100644 --- a/opencl/source/os_interface/linux/device_command_stream.inl +++ b/opencl/source/os_interface/linux/device_command_stream.inl @@ -6,6 +6,7 @@ */ #include "shared/source/command_stream/device_command_stream.h" +#include "shared/test/unit_test/helpers/debug_manager_state_restore.h" #include "opencl/source/command_stream/command_stream_receiver_with_aub_dump.h" #include "opencl/source/os_interface/linux/drm_command_stream.h" @@ -17,7 +18,8 @@ CommandStreamReceiver *DeviceCommandStreamReceiver::create(bool withA if (withAubDump) { return new CommandStreamReceiverWithAUBDump>("aubfile", executionEnvironment, rootDeviceIndex); } else { - return new DrmCommandStreamReceiver(executionEnvironment, rootDeviceIndex); + auto gemMode = DebugManager.flags.EnableGemCloseWorker.get() ? gemCloseWorkerMode::gemCloseWorkerActive : gemCloseWorkerMode::gemCloseWorkerInactive; + return new DrmCommandStreamReceiver(executionEnvironment, rootDeviceIndex, gemMode); } }; } // namespace NEO diff --git a/opencl/test/unit_test/os_interface/linux/device_command_stream_tests.cpp b/opencl/test/unit_test/os_interface/linux/device_command_stream_tests.cpp index 3778f7f941..2f47f36b88 100644 --- a/opencl/test/unit_test/os_interface/linux/device_command_stream_tests.cpp +++ b/opencl/test/unit_test/os_interface/linux/device_command_stream_tests.cpp @@ -62,6 +62,33 @@ HWTEST_F(DeviceCommandStreamLeaksTest, givenDefaultDrmCsrWhenOsInterfaceIsNullpt EXPECT_EQ(drmCsr->getOSInterface()->get()->getDrm(), executionEnvironment->rootDeviceEnvironments[0]->osInterface->get()->getDrm()); } +HWTEST_F(DeviceCommandStreamLeaksTest, givenDisabledGemCloseWorkerWhenCsrIsCreatedThenGemCloseWorkerInactiveModeIsSelected) { + DebugManagerStateRestore restorer; + DebugManager.flags.EnableGemCloseWorker.set(0u); + + std::unique_ptr ptr(DeviceCommandStreamReceiver::create(false, *executionEnvironment, 0)); + auto drmCsr = (DrmCommandStreamReceiver *)ptr.get(); + + EXPECT_EQ(drmCsr->peekGemCloseWorkerOperationMode(), gemCloseWorkerMode::gemCloseWorkerInactive); +} + +HWTEST_F(DeviceCommandStreamLeaksTest, givenEnabledGemCloseWorkerWhenCsrIsCreatedThenGemCloseWorkerActiveModeIsSelected) { + DebugManagerStateRestore restorer; + DebugManager.flags.EnableGemCloseWorker.set(1u); + + std::unique_ptr ptr(DeviceCommandStreamReceiver::create(false, *executionEnvironment, 0)); + auto drmCsr = (DrmCommandStreamReceiver *)ptr.get(); + + EXPECT_EQ(drmCsr->peekGemCloseWorkerOperationMode(), gemCloseWorkerMode::gemCloseWorkerActive); +} + +HWTEST_F(DeviceCommandStreamLeaksTest, givenDefaultGemCloseWorkerWhenCsrIsCreatedThenGemCloseWorkerActiveModeIsSelected) { + std::unique_ptr ptr(DeviceCommandStreamReceiver::create(false, *executionEnvironment, 0)); + auto drmCsr = (DrmCommandStreamReceiver *)ptr.get(); + + EXPECT_EQ(drmCsr->peekGemCloseWorkerOperationMode(), gemCloseWorkerMode::gemCloseWorkerActive); +} + using DeviceCommandStreamSetInternalUsageTests = DeviceCommandStreamLeaksTest; HWTEST_F(DeviceCommandStreamSetInternalUsageTests, givenValidDrmCsrThenGemCloseWorkerOperationModeIsSetToInactiveWhenInternalUsageIsSet) { diff --git a/opencl/test/unit_test/os_interface/linux/drm_memory_manager_tests.cpp b/opencl/test/unit_test/os_interface/linux/drm_memory_manager_tests.cpp index 76b84d0787..bb9430a3dd 100644 --- a/opencl/test/unit_test/os_interface/linux/drm_memory_manager_tests.cpp +++ b/opencl/test/unit_test/os_interface/linux/drm_memory_manager_tests.cpp @@ -2849,6 +2849,30 @@ TEST_F(DrmMemoryManagerBasic, givenDefaultMemoryManagerWhenItIsCreatedThenAsyncD memoryManager.commonCleanup(); } +TEST_F(DrmMemoryManagerBasic, givenDisabledGemCloseWorkerWhenMemoryManagerIsCreatedThenNoGemCloseWorker) { + DebugManagerStateRestore dbgStateRestore; + DebugManager.flags.EnableGemCloseWorker.set(0u); + + TestedDrmMemoryManager memoryManager(true, true, true, executionEnvironment); + + EXPECT_EQ(memoryManager.peekGemCloseWorker(), nullptr); +} + +TEST_F(DrmMemoryManagerBasic, givenEnabledGemCloseWorkerWhenMemoryManagerIsCreatedThenGemCloseWorker) { + DebugManagerStateRestore dbgStateRestore; + DebugManager.flags.EnableGemCloseWorker.set(1u); + + TestedDrmMemoryManager memoryManager(true, true, true, executionEnvironment); + + EXPECT_NE(memoryManager.peekGemCloseWorker(), nullptr); +} + +TEST_F(DrmMemoryManagerBasic, givenDefaultGemCloseWorkerWhenMemoryManagerIsCreatedThenGemCloseWorker) { + MemoryManagerCreate memoryManager(false, false, gemCloseWorkerMode::gemCloseWorkerActive, false, false, executionEnvironment); + + EXPECT_NE(memoryManager.peekGemCloseWorker(), nullptr); +} + TEST_F(DrmMemoryManagerBasic, givenEnabledAsyncDeleterFlagWhenMemoryManagerIsCreatedThenAsyncDeleterEnabledIsFalseAndDeleterIsNullptr) { DebugManagerStateRestore dbgStateRestore; DebugManager.flags.EnableDeferredDeleter.set(true); diff --git a/opencl/test/unit_test/test_files/igdrcl.config b/opencl/test/unit_test/test_files/igdrcl.config index 2333cc007a..db907ae2ce 100644 --- a/opencl/test/unit_test/test_files/igdrcl.config +++ b/opencl/test/unit_test/test_files/igdrcl.config @@ -107,6 +107,7 @@ EnableDeferredDeleter = 1 EnableAsyncDestroyAllocations = 1 EnableAsyncEventsHandler = 1 EnableForcePin = 1 +EnableGemCloseWorker = -1 EnableComputeWorkSizeND = 1 EnableMultiRootDeviceContexts = 0 EnableComputeWorkSizeSquared = 0 diff --git a/shared/source/debug_settings/debug_variables_base.inl b/shared/source/debug_settings/debug_variables_base.inl index 6588128fe0..105bbe0683 100644 --- a/shared/source/debug_settings/debug_variables_base.inl +++ b/shared/source/debug_settings/debug_variables_base.inl @@ -165,6 +165,7 @@ DECLARE_DEBUG_VARIABLE(bool, EnableFreeMemory, false, "Enable freeMemory in memo DECLARE_DEBUG_VARIABLE(bool, ForceSamplerLowFilteringPrecision, false, "Force Low Filtering Precision Sampler mode") DECLARE_DEBUG_VARIABLE(bool, UseBindlessBuffers, false, "Force compiler to use bindless buffer addressing instead of stateful one") DECLARE_DEBUG_VARIABLE(bool, UseBindlessImages, false, "Force compiler to use bindless image addressing instead of stateful one") +DECLARE_DEBUG_VARIABLE(int32_t, EnableGemCloseWorker, -1, "Use asynchronous gem object closing, -1:default, 0:disable, 1:enable") DECLARE_DEBUG_VARIABLE(int32_t, EnableIntelVme, -1, "-1: default, 0: disabled, 1: Enables cl_intel_motion_estimation extension") DECLARE_DEBUG_VARIABLE(int32_t, EnableIntelAdvancedVme, -1, "-1: default, 0: disabled, 1: Enables cl_intel_advanced_motion_estimation extension") DECLARE_DEBUG_VARIABLE(int32_t, EnableBlitterOperationsSupport, -1, "-1: default, 0: disable, 1: enable") diff --git a/shared/source/os_interface/linux/drm_memory_manager.cpp b/shared/source/os_interface/linux/drm_memory_manager.cpp index 3f8340d6d7..e0297852c2 100644 --- a/shared/source/os_interface/linux/drm_memory_manager.cpp +++ b/shared/source/os_interface/linux/drm_memory_manager.cpp @@ -44,6 +44,11 @@ DrmMemoryManager::DrmMemoryManager(gemCloseWorkerMode mode, localMemAllocs.emplace_back(); } MemoryManager::virtualPaddingAvailable = true; + + if (DebugManager.flags.EnableGemCloseWorker.get() != -1) { + mode = DebugManager.flags.EnableGemCloseWorker.get() ? gemCloseWorkerMode::gemCloseWorkerActive : gemCloseWorkerMode::gemCloseWorkerInactive; + } + if (mode != gemCloseWorkerMode::gemCloseWorkerInactive) { gemCloseWorker.reset(new DrmGemCloseWorker(*this)); }