From e653699267f0039a02b20fd05939dc5360b32494 Mon Sep 17 00:00:00 2001 From: Lukasz Jobczyk Date: Mon, 29 Mar 2021 12:23:38 +0000 Subject: [PATCH] Disable monitor fence in Drm ULLS by default Signed-off-by: Lukasz Jobczyk --- .../command_stream_receiver_tests.cpp | 1 + .../linux/drm_command_stream_tests.cpp | 1 + .../test/unit_test/test_files/igdrcl.config | 2 +- .../debug_settings/debug_variables_base.inl | 2 +- .../direct_submission_hw.inl | 11 +++- .../linux/drm_direct_submission.inl | 23 +++++++- .../linux/drm_direct_submission_tests.cpp | 57 +++++++++++++++++++ 7 files changed, 91 insertions(+), 6 deletions(-) diff --git a/opencl/test/unit_test/command_stream/command_stream_receiver_tests.cpp b/opencl/test/unit_test/command_stream/command_stream_receiver_tests.cpp index d52db8de29..fee27a05e6 100644 --- a/opencl/test/unit_test/command_stream/command_stream_receiver_tests.cpp +++ b/opencl/test/unit_test/command_stream/command_stream_receiver_tests.cpp @@ -613,6 +613,7 @@ HWTEST_F(InitDirectSubmissionTest, givenNonDefaultContextContextWhenDirectSubmis HWTEST_F(InitDirectSubmissionTest, GivenBlitterOverrideEnabledWhenBlitterIsNonDefaultContextThenExpectDirectSubmissionStarted) { DebugManager.flags.DirectSubmissionOverrideBlitterSupport.set(1); + DebugManager.flags.DirectSubmissionDisableMonitorFence.set(0); auto csr = std::make_unique>(*device->executionEnvironment, device->getRootDeviceIndex(), device->getDeviceBitfield()); std::unique_ptr osContext(OsContext::create(device->getExecutionEnvironment()->rootDeviceEnvironments[0]->osInterface.get(), diff --git a/opencl/test/unit_test/os_interface/linux/drm_command_stream_tests.cpp b/opencl/test/unit_test/os_interface/linux/drm_command_stream_tests.cpp index acd680936b..265b6323d1 100644 --- a/opencl/test/unit_test/os_interface/linux/drm_command_stream_tests.cpp +++ b/opencl/test/unit_test/os_interface/linux/drm_command_stream_tests.cpp @@ -1313,6 +1313,7 @@ struct DrmCommandStreamDirectSubmissionTest : public DrmCommandStreamEnhancedTes template void SetUpT() { DebugManager.flags.EnableDirectSubmission.set(1u); + DebugManager.flags.DirectSubmissionDisableMonitorFence.set(0); DrmCommandStreamEnhancedTest::SetUpT(); auto hwInfo = device->getRootDeviceEnvironment().getMutableHardwareInfo(); auto engineType = device->getDefaultEngine().osContext->getEngineType(); diff --git a/opencl/test/unit_test/test_files/igdrcl.config b/opencl/test/unit_test/test_files/igdrcl.config index bf5ec6f778..eb98cc3f1a 100644 --- a/opencl/test/unit_test/test_files/igdrcl.config +++ b/opencl/test/unit_test/test_files/igdrcl.config @@ -91,7 +91,7 @@ DirectSubmissionEnableDebugBuffer = 0 DirectSubmissionDiagnosticExecutionCount = 30 DirectSubmissionNewResourceTlbFlush = -1 DirectSubmissionDisableCacheFlush = -1 -DirectSubmissionDisableMonitorFence = 0 +DirectSubmissionDisableMonitorFence = -1 USMEvictAfterMigration = 1 UseVmBind = -1 PassBoundBOToExec = -1 diff --git a/shared/source/debug_settings/debug_variables_base.inl b/shared/source/debug_settings/debug_variables_base.inl index efeb7026fe..18ee3defcd 100644 --- a/shared/source/debug_settings/debug_variables_base.inl +++ b/shared/source/debug_settings/debug_variables_base.inl @@ -166,7 +166,7 @@ DECLARE_DEBUG_VARIABLE(int32_t, DirectSubmissionOverrideComputeSupport, -1, "Ove DECLARE_DEBUG_VARIABLE(int32_t, DirectSubmissionDisableCacheFlush, -1, "-1: driver default, 0: additional cache flush is present 1: disable dispatching cache flush commands") DECLARE_DEBUG_VARIABLE(int32_t, DirectSubmissionNewResourceTlbFlush, -1, "-1: driver default - flush when new resource is bound, 0: disabled, 1: enabled") DECLARE_DEBUG_VARIABLE(bool, USMEvictAfterMigration, true, "Evict USM allocation after implicit migration to GPU") -DECLARE_DEBUG_VARIABLE(bool, DirectSubmissionDisableMonitorFence, false, "Disable dispatching monitor fence commands") +DECLARE_DEBUG_VARIABLE(int32_t, DirectSubmissionDisableMonitorFence, -1, "Disable dispatching monitor fence commands") /*FEATURE FLAGS*/ DECLARE_DEBUG_VARIABLE(bool, EnableNV12, true, "Enables NV12 extension") diff --git a/shared/source/direct_submission/direct_submission_hw.inl b/shared/source/direct_submission/direct_submission_hw.inl index a87f47937d..927e13f158 100644 --- a/shared/source/direct_submission/direct_submission_hw.inl +++ b/shared/source/direct_submission/direct_submission_hw.inl @@ -218,12 +218,21 @@ inline size_t DirectSubmissionHw::getSizeStartSection() { template inline void DirectSubmissionHw::dispatchSwitchRingBufferSection(uint64_t nextBufferGpuAddress) { + if (disableMonitorFence) { + TagData currentTagData = {}; + getTagAddressValue(currentTagData); + Dispatcher::dispatchMonitorFence(ringCommandStream, currentTagData.tagAddress, currentTagData.tagValue, *hwInfo); + } Dispatcher::dispatchStartCommandBuffer(ringCommandStream, nextBufferGpuAddress); } template inline size_t DirectSubmissionHw::getSizeSwitchRingBufferSection() { - return Dispatcher::getSizeStartCommandBuffer(); + size_t size = Dispatcher::getSizeStartCommandBuffer(); + if (disableMonitorFence) { + size += Dispatcher::getSizeMonitorFence(*hwInfo); + } + return size; } template diff --git a/shared/source/direct_submission/linux/drm_direct_submission.inl b/shared/source/direct_submission/linux/drm_direct_submission.inl index 3068d77412..361ddf7104 100644 --- a/shared/source/direct_submission/linux/drm_direct_submission.inl +++ b/shared/source/direct_submission/linux/drm_direct_submission.inl @@ -26,6 +26,12 @@ DrmDirectSubmission::DrmDirectSubmission(Device &device, OsContext &osContext) : DirectSubmissionHw(device, osContext) { + this->disableMonitorFence = true; + + if (DebugManager.flags.DirectSubmissionDisableMonitorFence.get() != -1) { + this->disableMonitorFence = DebugManager.flags.DirectSubmissionDisableMonitorFence.get(); + } + auto osContextLinux = static_cast(&this->osContext); osContextLinux->getDrm().setDirectSubmissionActive(true); }; @@ -33,8 +39,11 @@ DrmDirectSubmission::DrmDirectSubmission(Device &device, template inline DrmDirectSubmission::~DrmDirectSubmission() { if (this->ringStart) { - this->wait(static_cast(this->currentTagData.tagValue)); this->stopRingBuffer(); + if (this->disableMonitorFence) { + this->currentTagData.tagValue++; + } + this->wait(static_cast(this->currentTagData.tagValue)); auto bb = static_cast(this->ringBuffer)->getBO(); bb->wait(-1); } @@ -126,6 +135,12 @@ size_t DrmDirectSubmission::getSizeNewResourceHandler() { template void DrmDirectSubmission::handleSwitchRingBuffers() { + if (this->disableMonitorFence) { + auto previousRingBuffer = this->currentRingBuffer == DirectSubmissionHw::RingBufferUse::FirstBuffer ? DirectSubmissionHw::RingBufferUse::SecondBuffer : DirectSubmissionHw::RingBufferUse::FirstBuffer; + this->currentTagData.tagValue++; + this->completionRingBuffers[previousRingBuffer] = this->currentTagData.tagValue; + } + if (this->ringStart) { if (this->completionRingBuffers[this->currentRingBuffer] != 0) { this->wait(static_cast(this->completionRingBuffers[this->currentRingBuffer])); @@ -135,8 +150,10 @@ void DrmDirectSubmission::handleSwitchRingBuffers() { template uint64_t DrmDirectSubmission::updateTagValue() { - this->currentTagData.tagValue++; - this->completionRingBuffers[this->currentRingBuffer] = this->currentTagData.tagValue; + if (!this->disableMonitorFence) { + this->currentTagData.tagValue++; + this->completionRingBuffers[this->currentRingBuffer] = this->currentTagData.tagValue; + } return 0ull; } diff --git a/shared/test/unit_test/direct_submission/linux/drm_direct_submission_tests.cpp b/shared/test/unit_test/direct_submission/linux/drm_direct_submission_tests.cpp index 9eadb76a5a..2c50b4dd37 100644 --- a/shared/test/unit_test/direct_submission/linux/drm_direct_submission_tests.cpp +++ b/shared/test/unit_test/direct_submission/linux/drm_direct_submission_tests.cpp @@ -48,16 +48,24 @@ struct MockDrmDirectSubmission : public DrmDirectSubmission; using BaseClass::allocateResources; using BaseClass::currentTagData; + using BaseClass::disableMonitorFence; + using BaseClass::dispatchSwitchRingBufferSection; using BaseClass::DrmDirectSubmission; using BaseClass::getSizeNewResourceHandler; + using BaseClass::getSizeSwitchRingBufferSection; using BaseClass::getTagAddressValue; using BaseClass::handleNewResourcesSubmission; using BaseClass::handleResidency; using BaseClass::isNewResourceHandleNeeded; + using BaseClass::ringStart; using BaseClass::submit; using BaseClass::switchRingBuffers; using BaseClass::tagAddress; using BaseClass::updateTagValue; + + MockDrmDirectSubmission(Device &device, OsContext &osContext) : DrmDirectSubmission(device, osContext) { + this->disableMonitorFence = false; + } }; using namespace NEO; @@ -101,6 +109,55 @@ HWTEST_F(DrmDirectSubmissionTest, givenDrmDirectSubmissionWhenDestructObjectThen EXPECT_EQ(drm->ioctlCallsCount, 3u); } +HWTEST_F(DrmDirectSubmissionTest, givenDisabledMonitorFenceWhenDispatchSwitchRingBufferThenDispatchPipeControl) { + using PIPE_CONTROL = typename FamilyType::PIPE_CONTROL; + using Dispatcher = RenderDispatcher; + + MockDrmDirectSubmission directSubmission(*device.get(), + *osContext.get()); + directSubmission.disableMonitorFence = true; + directSubmission.ringStart = true; + + bool ret = directSubmission.allocateResources(); + EXPECT_TRUE(ret); + + uint64_t newAddress = 0x1234; + directSubmission.dispatchSwitchRingBufferSection(newAddress); + + HardwareParse hwParse; + hwParse.parsePipeControl = true; + hwParse.parseCommands(directSubmission.ringCommandStream, 0); + hwParse.findHardwareCommands(); + auto *pipeControl = hwParse.getCommand(); + + EXPECT_NE(pipeControl, nullptr); + EXPECT_EQ(directSubmission.getSizeSwitchRingBufferSection(), Dispatcher::getSizeStartCommandBuffer() + Dispatcher::getSizeMonitorFence(device->getHardwareInfo())); + + directSubmission.currentTagData.tagValue--; +} + +HWTEST_F(DrmDirectSubmissionTest, givenDisabledMonitorFenceWhenUpdateTagValueThenTagIsNotUpdated) { + using PIPE_CONTROL = typename FamilyType::PIPE_CONTROL; + using Dispatcher = RenderDispatcher; + + MockDrmDirectSubmission directSubmission(*device.get(), + *osContext.get()); + directSubmission.disableMonitorFence = true; + directSubmission.ringStart = true; + + bool ret = directSubmission.allocateResources(); + EXPECT_TRUE(ret); + + auto currentTag = directSubmission.currentTagData.tagValue; + directSubmission.updateTagValue(); + + auto updatedTag = directSubmission.currentTagData.tagValue; + + EXPECT_EQ(currentTag, updatedTag); + + directSubmission.currentTagData.tagValue--; +} + HWTEST_F(DrmDirectSubmissionTest, whenCheckForDirectSubmissionSupportThenProperValueIsReturned) { auto directSubmissionSupported = osContext->isDirectSubmissionSupported(device->getHardwareInfo());