diff --git a/opencl/source/platform/platform.cpp b/opencl/source/platform/platform.cpp index 42101c01ee..bcabc0da0d 100644 --- a/opencl/source/platform/platform.cpp +++ b/opencl/source/platform/platform.cpp @@ -45,7 +45,7 @@ Platform::~Platform() { for (auto clDevice : this->clDevices) { clDevice->getDevice().getRootDeviceEnvironmentRef().debugger.reset(nullptr); - clDevice->getDevice().stopDirectSubmission(); + clDevice->getDevice().stopDirectSubmissionAndWaitForCompletion(); clDevice->decRefInternal(); } diff --git a/shared/source/device/device.cpp b/shared/source/device/device.cpp index 2107afb5b8..84ded01d74 100644 --- a/shared/source/device/device.cpp +++ b/shared/source/device/device.cpp @@ -843,12 +843,12 @@ ReleaseHelper *Device::getReleaseHelper() const { return getRootDeviceEnvironment().getReleaseHelper(); } -void Device::stopDirectSubmission() { +void Device::stopDirectSubmissionAndWaitForCompletion() { for (auto &engine : allEngines) { auto csr = engine.commandStreamReceiver; if (csr->isAnyDirectSubmissionEnabled()) { auto lock = csr->obtainUniqueOwnership(); - csr->stopDirectSubmission(false); + csr->stopDirectSubmission(true); } } } diff --git a/shared/source/device/device.h b/shared/source/device/device.h index 10b33141b5..9a133b41a6 100644 --- a/shared/source/device/device.h +++ b/shared/source/device/device.h @@ -163,7 +163,7 @@ class Device : public ReferenceTrackedObject { uint32_t getNumberOfRegularContextsPerEngine() const { return numberOfRegularContextsPerEngine; } bool isMultiRegularContextSelectionAllowed(aub_stream::EngineType engineType, EngineUsage engineUsage) const; - MOCKABLE_VIRTUAL void stopDirectSubmission(); + MOCKABLE_VIRTUAL void stopDirectSubmissionAndWaitForCompletion(); bool isAnyDirectSubmissionEnabled(); bool isStateSipRequired() const { return getPreemptionMode() == PreemptionMode::MidThread || getDebugger() != nullptr; diff --git a/shared/source/direct_submission/direct_submission_hw.inl b/shared/source/direct_submission/direct_submission_hw.inl index 3a3bd058bc..40fc4f7385 100644 --- a/shared/source/direct_submission/direct_submission_hw.inl +++ b/shared/source/direct_submission/direct_submission_hw.inl @@ -543,6 +543,9 @@ bool DirectSubmissionHw::startRingBuffer() { template bool DirectSubmissionHw::stopRingBuffer(bool blocking) { if (!ringStart) { + if (blocking) { + this->ensureRingCompletion(); + } return true; } diff --git a/shared/test/common/libult/ult_command_stream_receiver.h b/shared/test/common/libult/ult_command_stream_receiver.h index 6be66a932d..c7c2b5c6ee 100644 --- a/shared/test/common/libult/ult_command_stream_receiver.h +++ b/shared/test/common/libult/ult_command_stream_receiver.h @@ -422,6 +422,7 @@ class UltCommandStreamReceiver : public CommandStreamReceiverHw, publ void stopDirectSubmission(bool blocking) override { stopDirectSubmissionCalled = true; + stopDirectSubmissionCalledBlocking = blocking; BaseClass::stopDirectSubmission(blocking); } @@ -496,6 +497,7 @@ class UltCommandStreamReceiver : public CommandStreamReceiverHw, publ bool callBaseIsKmdWaitOnTaskCountAllowed = false; bool isKmdWaitOnTaskCountAllowedValue = false; bool stopDirectSubmissionCalled = false; + bool stopDirectSubmissionCalledBlocking = false; }; } // namespace NEO diff --git a/shared/test/common/mocks/mock_device.h b/shared/test/common/mocks/mock_device.h index 1b31147347..d826bfec72 100644 --- a/shared/test/common/mocks/mock_device.h +++ b/shared/test/common/mocks/mock_device.h @@ -151,9 +151,9 @@ class MockDevice : public RootDevice { rtDispatchGlobalsForceAllocation = true; } - void stopDirectSubmission() override { + void stopDirectSubmissionAndWaitForCompletion() override { stopDirectSubmissionCalled = true; - Device::stopDirectSubmission(); + Device::stopDirectSubmissionAndWaitForCompletion(); } static ExecutionEnvironment *prepareExecutionEnvironment(const HardwareInfo *pHwInfo); static decltype(&createCommandStream) createCommandStreamReceiverFunc; diff --git a/shared/test/common/mocks/mock_direct_submission_hw.h b/shared/test/common/mocks/mock_direct_submission_hw.h index 7837e07594..1f88b3fc61 100644 --- a/shared/test/common/mocks/mock_direct_submission_hw.h +++ b/shared/test/common/mocks/mock_direct_submission_hw.h @@ -125,6 +125,11 @@ struct MockDirectSubmissionHw : public DirectSubmissionHw BaseClass::dispatchTaskStoreSection(taskStartSectionVa); } + void ensureRingCompletion() override { + ensureRingCompletionCalled++; + BaseClass::ensureRingCompletion(); + } + bool makeResourcesResident(DirectSubmissionAllocations &allocations) override { makeResourcesResidentVectorSize = static_cast(allocations.size()); if (callBaseResident) { @@ -185,6 +190,7 @@ struct MockDirectSubmissionHw : public DirectSubmissionHw uint32_t dispatchRelaxedOrderingSchedulerSectionCalled = 0; uint32_t dispatchRelaxedOrderingQueueStallCalled = 0; uint32_t dispatchTaskStoreSectionCalled = 0; + uint32_t ensureRingCompletionCalled = 0; uint32_t makeResourcesResidentVectorSize = 0u; bool allocateOsResourcesReturn = true; bool submitReturn = true; diff --git a/shared/test/unit_test/direct_submission/direct_submission_tests_1.cpp b/shared/test/unit_test/direct_submission/direct_submission_tests_1.cpp index 2a723071f9..83053f45f2 100644 --- a/shared/test/unit_test/direct_submission/direct_submission_tests_1.cpp +++ b/shared/test/unit_test/direct_submission/direct_submission_tests_1.cpp @@ -97,7 +97,7 @@ HWTEST_F(DirectSubmissionTest, givenBlitterDirectSubmissionWhenStopThenRingIsNot csr.blitterDirectSubmission.release(); } -HWTEST_F(DirectSubmissionTest, givenDeviceStopDirectSubmissionCalledThenCsrStopDirecttSubmissionCalled) { +HWTEST_F(DirectSubmissionTest, givenDeviceStopDirectSubmissionAndWaitForCompletionCalledThenCsrStopDirectSubmissionCalledBlocking) { VariableBackup backup(&ultHwConfig); ultHwConfig.csrBaseCallDirectSubmissionAvailable = true; ultHwConfig.csrBaseCallBlitterDirectSubmissionAvailable = true; @@ -110,13 +110,14 @@ HWTEST_F(DirectSubmissionTest, givenDeviceStopDirectSubmissionCalledThenCsrStopD EXPECT_TRUE(ret); EXPECT_FALSE(csr.stopDirectSubmissionCalled); - pDevice->stopDirectSubmission(); + pDevice->stopDirectSubmissionAndWaitForCompletion(); EXPECT_TRUE(csr.stopDirectSubmissionCalled); + EXPECT_TRUE(csr.stopDirectSubmissionCalledBlocking); csr.directSubmission.release(); } -HWTEST_F(DirectSubmissionTest, givenDeviceStopDirectSubmissionCalledThenBcsStopDirecttSubmissionCalled) { +HWTEST_F(DirectSubmissionTest, givenDeviceStopDirectSubmissionAndWaitForCompletionCalledThenBcsStopDirectSubmissionCalledBlocking) { VariableBackup backup(&ultHwConfig); ultHwConfig.csrBaseCallDirectSubmissionAvailable = true; ultHwConfig.csrBaseCallBlitterDirectSubmissionAvailable = true; @@ -133,12 +134,24 @@ HWTEST_F(DirectSubmissionTest, givenDeviceStopDirectSubmissionCalledThenBcsStopD EXPECT_TRUE(ret); EXPECT_FALSE(csr.stopDirectSubmissionCalled); - pDevice->stopDirectSubmission(); + pDevice->stopDirectSubmissionAndWaitForCompletion(); EXPECT_TRUE(csr.stopDirectSubmissionCalled); + EXPECT_TRUE(csr.stopDirectSubmissionCalledBlocking); csr.blitterDirectSubmission.release(); } +HWTEST_F(DirectSubmissionTest, givenDirectSubmissionStopRingBufferBlockingCalledAndRingBufferIsNotStartedThenEnsureRingCompletionCalled) { + MockDirectSubmissionHw> directSubmission(*pDevice->getDefaultEngine().commandStreamReceiver); + bool ret = directSubmission.initialize(false, false); + EXPECT_TRUE(ret); + + EXPECT_FALSE(directSubmission.ringStart); + EXPECT_EQ(0u, directSubmission.ensureRingCompletionCalled); + directSubmission.stopRingBuffer(true); + EXPECT_EQ(1u, directSubmission.ensureRingCompletionCalled); +} + HWTEST_F(DirectSubmissionTest, givenDirectSubmissionWhenMakingResourcesResidentThenCorrectContextIsUsed) { auto mockMemoryOperations = std::make_unique();