diff --git a/shared/source/direct_submission/direct_submission_controller.cpp b/shared/source/direct_submission/direct_submission_controller.cpp index 451f613df2..6509b03446 100644 --- a/shared/source/direct_submission/direct_submission_controller.cpp +++ b/shared/source/direct_submission/direct_submission_controller.cpp @@ -14,7 +14,6 @@ #include "shared/source/os_interface/os_context.h" #include "shared/source/os_interface/os_thread.h" #include "shared/source/os_interface/os_time.h" -#include "shared/source/os_interface/product_helper.h" #include #include @@ -45,7 +44,7 @@ DirectSubmissionController::~DirectSubmissionController() { void DirectSubmissionController::registerDirectSubmission(CommandStreamReceiver *csr) { std::lock_guard lock(directSubmissionsMutex); directSubmissions.insert(std::make_pair(csr, DirectSubmissionState())); - csr->getProductHelper().overrideDirectSubmissionTimeouts(this->timeout, this->maxTimeout); + this->overrideDirectSubmissionTimeouts(csr->getProductHelper()); } void DirectSubmissionController::unregisterDirectSubmission(CommandStreamReceiver *csr) { diff --git a/shared/source/direct_submission/direct_submission_controller.h b/shared/source/direct_submission/direct_submission_controller.h index 0015307c74..6fb88f9e54 100644 --- a/shared/source/direct_submission/direct_submission_controller.h +++ b/shared/source/direct_submission/direct_submission_controller.h @@ -89,6 +89,7 @@ class DirectSubmissionController { bool isDirectSubmissionIdle(CommandStreamReceiver *csr, std::unique_lock &csrLock); MOCKABLE_VIRTUAL bool sleep(std::unique_lock &lock); MOCKABLE_VIRTUAL SteadyClock::time_point getCpuTimestamp(); + MOCKABLE_VIRTUAL void overrideDirectSubmissionTimeouts(const ProductHelper &productHelper); void recalculateTimeout(); void applyTimeoutForAcLineStatusAndThrottle(bool acLineConnected); @@ -116,7 +117,6 @@ class DirectSubmissionController { int32_t timeoutDivisor = 1; int32_t bcsTimeoutDivisor = 1; QueueThrottle lowestThrottleSubmitted = QueueThrottle::HIGH; - bool adjustTimeoutOnThrottleAndAcLineStatus = false; bool isCsrIdleDetectionEnabled = false; std::condition_variable condVar; diff --git a/shared/source/direct_submission/linux/direct_submission_controller_linux.cpp b/shared/source/direct_submission/linux/direct_submission_controller_linux.cpp index c7facb8948..679b5d14a6 100644 --- a/shared/source/direct_submission/linux/direct_submission_controller_linux.cpp +++ b/shared/source/direct_submission/linux/direct_submission_controller_linux.cpp @@ -13,4 +13,8 @@ namespace NEO { bool DirectSubmissionController::sleep(std::unique_lock &lock) { return NEO::waitOnConditionWithPredicate(condVar, lock, getSleepValue(), [&] { return !pagingFenceRequests.empty(); }); } + +void DirectSubmissionController::overrideDirectSubmissionTimeouts(const ProductHelper &productHelper) { +} + } // namespace NEO \ No newline at end of file diff --git a/shared/source/direct_submission/windows/direct_submission_controller_windows.cpp b/shared/source/direct_submission/windows/direct_submission_controller_windows.cpp index 032096fb2e..9b980eb7dc 100644 --- a/shared/source/direct_submission/windows/direct_submission_controller_windows.cpp +++ b/shared/source/direct_submission/windows/direct_submission_controller_windows.cpp @@ -7,6 +7,7 @@ #include "shared/source/direct_submission/direct_submission_controller.h" #include "shared/source/helpers/sleep.h" +#include "shared/source/os_interface/product_helper.h" #include "shared/source/os_interface/windows/sys_calls_winmm.h" #include @@ -17,4 +18,9 @@ bool DirectSubmissionController::sleep(std::unique_lock &lock) { SysCalls::timeEndPeriod(1u); return returnValue; } + +void DirectSubmissionController::overrideDirectSubmissionTimeouts(const ProductHelper &productHelper) { + productHelper.overrideDirectSubmissionTimeouts(this->timeout, this->maxTimeout); +} + } // namespace NEO \ No newline at end of file diff --git a/shared/source/os_interface/product_helper.inl b/shared/source/os_interface/product_helper.inl index 2c14ae9b22..1c66b1a386 100644 --- a/shared/source/os_interface/product_helper.inl +++ b/shared/source/os_interface/product_helper.inl @@ -971,10 +971,6 @@ uint32_t ProductHelperHw::adjustMaxThreadsPerThreadGroup(uint32_t ma return maxThreadsPerThreadGroup; } -template -void ProductHelperHw::overrideDirectSubmissionTimeouts(std::chrono::microseconds &timeout, std::chrono::microseconds &maxTimeout) const { -} - template bool ProductHelperHw::isMisalignedUserPtr2WayCoherent() const { return false; diff --git a/shared/source/os_interface/product_helper_before_xe2.inl b/shared/source/os_interface/product_helper_before_xe2.inl index 48e8cb2af5..6ee657d6bb 100644 --- a/shared/source/os_interface/product_helper_before_xe2.inl +++ b/shared/source/os_interface/product_helper_before_xe2.inl @@ -66,4 +66,8 @@ bool ProductHelperHw::isPidFdOrSocketForIpcSupported() const { return false; } +template +void ProductHelperHw::overrideDirectSubmissionTimeouts(std::chrono::microseconds &timeout, std::chrono::microseconds &maxTimeout) const { +} + } // namespace NEO diff --git a/shared/source/os_interface/product_helper_xe2_and_later.inl b/shared/source/os_interface/product_helper_xe2_and_later.inl index 9d8ca84c9e..1ef86151dc 100644 --- a/shared/source/os_interface/product_helper_xe2_and_later.inl +++ b/shared/source/os_interface/product_helper_xe2_and_later.inl @@ -69,4 +69,16 @@ bool ProductHelperHw::isPidFdOrSocketForIpcSupported() const { return false; } +template +void ProductHelperHw::overrideDirectSubmissionTimeouts(std::chrono::microseconds &timeout, std::chrono::microseconds &maxTimeout) const { + timeout = std::chrono::microseconds{1'000}; + maxTimeout = std::chrono::microseconds{1'000}; + if (debugManager.flags.DirectSubmissionControllerTimeout.get() != -1) { + timeout = std::chrono::microseconds{debugManager.flags.DirectSubmissionControllerTimeout.get()}; + } + if (debugManager.flags.DirectSubmissionControllerMaxTimeout.get() != -1) { + maxTimeout = std::chrono::microseconds{debugManager.flags.DirectSubmissionControllerMaxTimeout.get()}; + } +} + } // namespace NEO diff --git a/shared/source/xe2_hpg_core/windows/product_helper_lnl.cpp b/shared/source/xe2_hpg_core/windows/product_helper_lnl.cpp index 3d56e05a06..bbbd673f49 100644 --- a/shared/source/xe2_hpg_core/windows/product_helper_lnl.cpp +++ b/shared/source/xe2_hpg_core/windows/product_helper_lnl.cpp @@ -21,17 +21,5 @@ bool ProductHelperHw::restartDirectSubmissionForHostptrFree() const return true; } -template <> -void ProductHelperHw::overrideDirectSubmissionTimeouts(std::chrono::microseconds &timeout, std::chrono::microseconds &maxTimeout) const { - timeout = std::chrono::microseconds{1'000}; - maxTimeout = std::chrono::microseconds{1'000}; - if (debugManager.flags.DirectSubmissionControllerTimeout.get() != -1) { - timeout = std::chrono::microseconds{debugManager.flags.DirectSubmissionControllerTimeout.get()}; - } - if (debugManager.flags.DirectSubmissionControllerMaxTimeout.get() != -1) { - maxTimeout = std::chrono::microseconds{debugManager.flags.DirectSubmissionControllerMaxTimeout.get()}; - } -} - template class ProductHelperHw; } // namespace NEO diff --git a/shared/source/xe3_core/windows/product_helper_ptl.cpp b/shared/source/xe3_core/windows/product_helper_ptl.cpp index cd6e2a8556..5fc450be0b 100644 --- a/shared/source/xe3_core/windows/product_helper_ptl.cpp +++ b/shared/source/xe3_core/windows/product_helper_ptl.cpp @@ -16,18 +16,6 @@ constexpr static auto gfxProduct = IGFX_PTL; namespace NEO { -template <> -void ProductHelperHw::overrideDirectSubmissionTimeouts(std::chrono::microseconds &timeout, std::chrono::microseconds &maxTimeout) const { - timeout = std::chrono::microseconds{1'000}; - maxTimeout = std::chrono::microseconds{1'000}; - if (debugManager.flags.DirectSubmissionControllerTimeout.get() != -1) { - timeout = std::chrono::microseconds{debugManager.flags.DirectSubmissionControllerTimeout.get()}; - } - if (debugManager.flags.DirectSubmissionControllerMaxTimeout.get() != -1) { - maxTimeout = std::chrono::microseconds{debugManager.flags.DirectSubmissionControllerMaxTimeout.get()}; - } -} - template class ProductHelperHw; } // namespace NEO diff --git a/shared/test/common/mocks/mock_product_helper.cpp b/shared/test/common/mocks/mock_product_helper.cpp index cfd1df7d47..a840b78c61 100644 --- a/shared/test/common/mocks/mock_product_helper.cpp +++ b/shared/test/common/mocks/mock_product_helper.cpp @@ -488,6 +488,10 @@ bool ProductHelperHw::isPidFdOrSocketForIpcSupported() const { return false; } +template <> +void ProductHelperHw::overrideDirectSubmissionTimeouts(std::chrono::microseconds &timeout, std::chrono::microseconds &maxTimeout) const { +} + } // namespace NEO #include "shared/source/os_interface/product_helper.inl" diff --git a/shared/test/unit_test/direct_submission/direct_submission_controller_mock.h b/shared/test/unit_test/direct_submission/direct_submission_controller_mock.h index ebd5bd7c34..63026e716f 100644 --- a/shared/test/unit_test/direct_submission/direct_submission_controller_mock.h +++ b/shared/test/unit_test/direct_submission/direct_submission_controller_mock.h @@ -11,7 +11,6 @@ namespace NEO { struct DirectSubmissionControllerMock : public DirectSubmissionController { - using DirectSubmissionController::adjustTimeoutOnThrottleAndAcLineStatus; using DirectSubmissionController::bcsTimeoutDivisor; using DirectSubmissionController::checkNewSubmissions; using DirectSubmissionController::condVarMutex; diff --git a/shared/test/unit_test/direct_submission/direct_submission_controller_tests.cpp b/shared/test/unit_test/direct_submission/direct_submission_controller_tests.cpp index 67bff7e998..d953318fc0 100644 --- a/shared/test/unit_test/direct_submission/direct_submission_controller_tests.cpp +++ b/shared/test/unit_test/direct_submission/direct_submission_controller_tests.cpp @@ -238,26 +238,6 @@ TEST(DirectSubmissionControllerTests, givenDirectSubmissionControllerWhenIncreas controller.unregisterDirectSubmission(&csr); } -TEST(DirectSubmissionControllerTests, givenDirectSubmissionControllerWhenRegisterCsrsThenTimeoutIsAdjusted) { - MockExecutionEnvironment executionEnvironment; - executionEnvironment.prepareRootDeviceEnvironments(1); - executionEnvironment.initializeMemoryManager(); - DeviceBitfield deviceBitfield(1); - - MockCommandStreamReceiver csr(executionEnvironment, 0, deviceBitfield); - std::unique_ptr osContext(OsContext::create(nullptr, 0, 0, - EngineDescriptorHelper::getDefaultDescriptor({aub_stream::ENGINE_CCS, EngineUsage::regular}, - PreemptionMode::ThreadGroup, deviceBitfield))); - csr.setupContext(*osContext.get()); - - DirectSubmissionControllerMock controller; - auto timeout = std::chrono::microseconds{5'000}; - EXPECT_EQ(controller.timeout, timeout); - controller.registerDirectSubmission(&csr); - csr.getProductHelper().overrideDirectSubmissionTimeouts(timeout, timeout); - EXPECT_EQ(controller.timeout, timeout); -} - TEST(DirectSubmissionControllerTests, givenPowerSavingUintWhenCallingGetThrottleFromPowerSavingUintThenCorrectValueIsReturned) { EXPECT_EQ(QueueThrottle::MEDIUM, getThrottleFromPowerSavingUint(0u)); EXPECT_EQ(QueueThrottle::LOW, getThrottleFromPowerSavingUint(1u)); diff --git a/shared/test/unit_test/direct_submission/windows/wddm_direct_submission_tests.cpp b/shared/test/unit_test/direct_submission/windows/wddm_direct_submission_tests.cpp index a2522910a6..529e8f9391 100644 --- a/shared/test/unit_test/direct_submission/windows/wddm_direct_submission_tests.cpp +++ b/shared/test/unit_test/direct_submission/windows/wddm_direct_submission_tests.cpp @@ -1333,4 +1333,18 @@ HWTEST2_F(WddmDirectSubmissionTest, givenRelaxedOrderingSchedulerRequiredWhenAsk EXPECT_EQ(expectedBaseEndSize + directSubmission.getSizeDispatchRelaxedOrderingQueueStall(), directSubmission.getSizeEnd(true)); EXPECT_EQ(expectedBaseEndSize, directSubmission.getSizeEnd(false)); } + +HWTEST_F(WddmDirectSubmissionTest, givenDirectSubmissionControllerWhenRegisterCsrsThenTimeoutIsAdjusted) { + auto csr = device->getDefaultEngine().commandStreamReceiver; + + DirectSubmissionControllerMock controller; + auto timeout = std::chrono::microseconds{5'000}; + EXPECT_EQ(controller.timeout, timeout); + controller.registerDirectSubmission(csr); + csr->getProductHelper().overrideDirectSubmissionTimeouts(timeout, timeout); + EXPECT_EQ(controller.timeout, timeout); + + controller.unregisterDirectSubmission(csr); +} + } // namespace NEO diff --git a/shared/test/unit_test/os_interface/product_helper_tests.cpp b/shared/test/unit_test/os_interface/product_helper_tests.cpp index dbf690e821..14c87c04c8 100644 --- a/shared/test/unit_test/os_interface/product_helper_tests.cpp +++ b/shared/test/unit_test/os_interface/product_helper_tests.cpp @@ -1145,6 +1145,32 @@ HWTEST2_F(ProductHelperTest, givenProductHelperThenCompressionIsNotForbidden, Is EXPECT_FALSE(productHelper->isCompressionForbidden(hwInfo)); } +HWTEST2_F(ProductHelperTest, givenProductHelperBeforeXe2WhenOverrideDirectSubmissionTimeoutsThenTimeoutsNotAdjusted, IsBeforeXe2HpgCore) { + DebugManagerStateRestore restorer; + + std::chrono::microseconds timeout{5000}; + std::chrono::microseconds maxTimeout{5000}; + productHelper->overrideDirectSubmissionTimeouts(timeout, maxTimeout); + EXPECT_EQ(std::chrono::microseconds{5000}, timeout); + EXPECT_EQ(std::chrono::microseconds{5000}, maxTimeout); +} + +HWTEST2_F(ProductHelperTest, givenProductHelperWhenOverrideDirectSubmissionTimeoutsThenTimeoutsAdjusted, IsAtLeastXe2HpgCore) { + DebugManagerStateRestore restorer; + + std::chrono::microseconds timeout{5000}; + std::chrono::microseconds maxTimeout{5000}; + productHelper->overrideDirectSubmissionTimeouts(timeout, maxTimeout); + EXPECT_EQ(std::chrono::microseconds{1000}, timeout); + EXPECT_EQ(std::chrono::microseconds{1000}, maxTimeout); + + debugManager.flags.DirectSubmissionControllerTimeout.set(10000); + debugManager.flags.DirectSubmissionControllerMaxTimeout.set(10000); + productHelper->overrideDirectSubmissionTimeouts(timeout, maxTimeout); + EXPECT_EQ(std::chrono::microseconds{10000}, timeout); + EXPECT_EQ(std::chrono::microseconds{10000}, maxTimeout); +} + HWTEST_F(ProductHelperTest, givenProductHelperWhenQueryIsPostImageWriteFlushRequiredThenFalseReturned) { EXPECT_FALSE(productHelper->isPostImageWriteFlushRequired()); }