From 1a364f5c98292ac020eaa7a2ad9025629bec7be8 Mon Sep 17 00:00:00 2001 From: Maciej Plewka Date: Thu, 23 Nov 2023 20:10:41 +0000 Subject: [PATCH] fix: add synchronization for updating tag and updating residency in GA Signed-off-by: Maciej Plewka --- .../windows/wddm_direct_submission.inl | 1 + .../mocks/mock_wddm_residency_controller.h | 1 + .../windows/wddm_direct_submission_tests.cpp | 28 +++++++++++++++++++ 3 files changed, 30 insertions(+) diff --git a/shared/source/direct_submission/windows/wddm_direct_submission.inl b/shared/source/direct_submission/windows/wddm_direct_submission.inl index 586421394d..ffcf165107 100644 --- a/shared/source/direct_submission/windows/wddm_direct_submission.inl +++ b/shared/source/direct_submission/windows/wddm_direct_submission.inl @@ -131,6 +131,7 @@ void WddmDirectSubmission::handleStopRingBuffer() { template void WddmDirectSubmission::handleSwitchRingBuffers(ResidencyContainer *allocationsForResidency) { if (this->disableMonitorFence) { + auto lock = osContextWin->getResidencyController().acquireLock(); updateTagValueImpl(); updateMonitorFenceValueForResidencyList(allocationsForResidency); } diff --git a/shared/test/common/mocks/mock_wddm_residency_controller.h b/shared/test/common/mocks/mock_wddm_residency_controller.h index d43ef83135..d270eb8b4f 100644 --- a/shared/test/common/mocks/mock_wddm_residency_controller.h +++ b/shared/test/common/mocks/mock_wddm_residency_controller.h @@ -12,6 +12,7 @@ namespace NEO { class MockWddmResidencyController : public WddmResidencyController { public: using WddmResidencyController::lastTrimFenceValue; + using WddmResidencyController::lock; using WddmResidencyController::trimCallbackHandle; using WddmResidencyController::trimCandidateList; using WddmResidencyController::trimCandidatesCount; 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 894491383d..27b6ff518d 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 @@ -1021,4 +1021,32 @@ HWTEST_F(WddmDirectSubmissionTest, givenDirectSubmissionWhenSwitchingRingBuffers MockWddmDirectSubmission wddmDirectSubmission(*device->getDefaultEngine().commandStreamReceiver); wddmDirectSubmission.handleSwitchRingBuffers(nullptr); EXPECT_EQ(wddmDirectSubmission.updateMonitorFenceValueForResidencyListCalled, 1u); +} + +template +struct MyMockWddmDirectSubmission : public MockWddmDirectSubmission { + using BaseClass = MockWddmDirectSubmission; + using BaseClass::MockWddmDirectSubmission; + void updateMonitorFenceValueForResidencyList(ResidencyContainer *allocationsForResidency) override { + lockInTesting = true; + while (lockInTesting) + ; + BaseClass::updateMonitorFenceValueForResidencyList(allocationsForResidency); + } + std::atomic lockInTesting = false; +}; + +HWTEST_F(WddmDirectSubmissionTest, givenDirectSubmissionWhenSwitchingRingBuffersThenUpdateResidencyCalledWithinLock) { + using Dispatcher = RenderDispatcher; + + MyMockWddmDirectSubmission wddmDirectSubmission(*device->getDefaultEngine().commandStreamReceiver); + std::thread th([&]() { + wddmDirectSubmission.handleSwitchRingBuffers(nullptr); + }); + while (!wddmDirectSubmission.lockInTesting) + ; + auto tryLock = reinterpret_cast(&(wddmDirectSubmission.osContextWin->getResidencyController()))->lock.try_lock(); + EXPECT_FALSE(tryLock); + wddmDirectSubmission.lockInTesting = false; + th.join(); } \ No newline at end of file