From e297cdb74bd89254c7043f5df85dd242e9199175 Mon Sep 17 00:00:00 2001 From: Lukasz Jobczyk Date: Fri, 31 Jul 2020 10:38:31 +0200 Subject: [PATCH] Disable gem close worker and force pin in direct submission Related-To: NEO-4338 Change-Id: I1959d69cf3aebf817493e155dad91ff8830ed5b4 Signed-off-by: Lukasz Jobczyk --- .../os_interface/linux/device_command_stream.inl | 4 +++- .../unit_test/mocks/linux/mock_drm_memory_manager.h | 1 + .../linux/device_command_stream_tests.cpp | 11 +++++++++++ .../os_interface/linux/drm_memory_manager_tests.cpp | 11 +++++++++++ .../source/os_interface/linux/drm_memory_manager.cpp | 6 ++++++ shared/source/os_interface/linux/drm_memory_manager.h | 2 +- 6 files changed, 33 insertions(+), 2 deletions(-) diff --git a/opencl/source/os_interface/linux/device_command_stream.inl b/opencl/source/os_interface/linux/device_command_stream.inl index 1229d93cc9..453d909135 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/source/debug_settings/debug_settings_manager.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.EnableDirectSubmission.get() == 1 ? gemCloseWorkerMode::gemCloseWorkerInactive : gemCloseWorkerMode::gemCloseWorkerActive; + return new DrmCommandStreamReceiver(executionEnvironment, rootDeviceIndex, gemMode); } }; } // namespace NEO diff --git a/opencl/test/unit_test/mocks/linux/mock_drm_memory_manager.h b/opencl/test/unit_test/mocks/linux/mock_drm_memory_manager.h index 537260b85d..659ccb5580 100644 --- a/opencl/test/unit_test/mocks/linux/mock_drm_memory_manager.h +++ b/opencl/test/unit_test/mocks/linux/mock_drm_memory_manager.h @@ -57,6 +57,7 @@ class TestedDrmMemoryManager : public MemoryManagerCreate { using DrmMemoryManager::createGraphicsAllocation; using DrmMemoryManager::createSharedBufferObject; using DrmMemoryManager::eraseSharedBufferObject; + using DrmMemoryManager::forcePinEnabled; using DrmMemoryManager::getDefaultDrmContextId; using DrmMemoryManager::getDrm; using DrmMemoryManager::getRootDeviceIndex; 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 8b8e67cc56..a142cda136 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 @@ -9,6 +9,7 @@ #include "shared/source/command_stream/device_command_stream.h" #include "shared/source/command_stream/linear_stream.h" #include "shared/source/os_interface/linux/os_interface.h" +#include "shared/test/unit_test/helpers/debug_manager_state_restore.h" #include "opencl/source/command_stream/aub_command_stream_receiver.h" #include "opencl/source/os_interface/linux/device_command_stream.inl" @@ -61,3 +62,13 @@ HWTEST_F(DeviceCommandStreamLeaksTest, givenDefaultDrmCsrWhenOsInterfaceIsNullpt EXPECT_NE(nullptr, executionEnvironment->rootDeviceEnvironments[0]->osInterface); EXPECT_EQ(drmCsr->getOSInterface()->get()->getDrm(), executionEnvironment->rootDeviceEnvironments[0]->osInterface->get()->getDrm()); } + +HWTEST_F(DeviceCommandStreamLeaksTest, givenEnableDirectSubmissionWhenCsrIsCreatedThenGemCloseWorkerInactiveModeIsSelected) { + DebugManagerStateRestore restorer; + DebugManager.flags.EnableDirectSubmission.set(1u); + + std::unique_ptr ptr(DeviceCommandStreamReceiver::create(false, *executionEnvironment, 0)); + auto drmCsr = (DrmCommandStreamReceiver *)ptr.get(); + + EXPECT_EQ(drmCsr->peekGemCloseWorkerOperationMode(), gemCloseWorkerMode::gemCloseWorkerInactive); +} \ No newline at end of file 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 40e7ef05de..e4c064bb20 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 @@ -2780,6 +2780,17 @@ TEST_F(DrmMemoryManagerBasic, givenDefaultMemoryManagerWhenItIsCreatedThenAsyncD memoryManager.commonCleanup(); } +TEST_F(DrmMemoryManagerBasic, givenEnabledDirectSubmissionWhenMemoryManagerIsCreatedThenForcePinGemCloseWorkerAndValidateHostMemoryAreDisabled) { + DebugManagerStateRestore dbgStateRestore; + DebugManager.flags.EnableDirectSubmission.set(1u); + + TestedDrmMemoryManager memoryManager(true, true, true, executionEnvironment); + + EXPECT_FALSE(memoryManager.isValidateHostMemoryEnabled()); + EXPECT_FALSE(memoryManager.forcePinEnabled); + EXPECT_EQ(memoryManager.peekGemCloseWorker(), nullptr); +} + TEST_F(DrmMemoryManagerBasic, givenEnabledAsyncDeleterFlagWhenMemoryManagerIsCreatedThenAsyncDeleterEnabledIsFalseAndDeleterIsNullptr) { DebugManagerStateRestore dbgStateRestore; DebugManager.flags.EnableDeferredDeleter.set(true); diff --git a/shared/source/os_interface/linux/drm_memory_manager.cpp b/shared/source/os_interface/linux/drm_memory_manager.cpp index 9a824d0e18..6f3e5d4b28 100644 --- a/shared/source/os_interface/linux/drm_memory_manager.cpp +++ b/shared/source/os_interface/linux/drm_memory_manager.cpp @@ -37,6 +37,12 @@ DrmMemoryManager::DrmMemoryManager(gemCloseWorkerMode mode, ExecutionEnvironment &executionEnvironment) : MemoryManager(executionEnvironment), forcePinEnabled(forcePinAllowed), validateHostPtrMemory(validateHostPtrMemory) { + if (DebugManager.flags.EnableDirectSubmission.get() == 1) { + mode = gemCloseWorkerMode::gemCloseWorkerInactive; + this->forcePinEnabled = false; + this->validateHostPtrMemory = false; + } + for (uint32_t rootDeviceIndex = 0; rootDeviceIndex < gfxPartitions.size(); ++rootDeviceIndex) { auto gpuAddressSpace = executionEnvironment.rootDeviceEnvironments[rootDeviceIndex]->getHardwareInfo()->capabilityTable.gpuAddressSpace; getGfxPartition(rootDeviceIndex)->init(gpuAddressSpace, getSizeToReserve(), rootDeviceIndex, gfxPartitions.size()); diff --git a/shared/source/os_interface/linux/drm_memory_manager.h b/shared/source/os_interface/linux/drm_memory_manager.h index 7578085371..01605a2840 100644 --- a/shared/source/os_interface/linux/drm_memory_manager.h +++ b/shared/source/os_interface/linux/drm_memory_manager.h @@ -94,7 +94,7 @@ class DrmMemoryManager : public MemoryManager { std::vector memoryForPinBBs; size_t pinThreshold = 8 * 1024 * 1024; bool forcePinEnabled = false; - const bool validateHostPtrMemory; + bool validateHostPtrMemory; std::unique_ptr gemCloseWorker; decltype(&mmap) mmapFunction = mmap; decltype(&munmap) munmapFunction = munmap;