From 4ea452040d7ed53a78046d07ae231c4946e9b2fd Mon Sep 17 00:00:00 2001 From: Lukasz Jobczyk Date: Fri, 29 Oct 2021 11:54:52 +0000 Subject: [PATCH] Defer direct submission control until first submit Signed-off-by: Lukasz Jobczyk --- .../command_stream_receiver.cpp | 8 +++++++ .../command_stream/command_stream_receiver.h | 2 ++ .../direct_submission_controller.cpp | 10 +++++++++ .../direct_submission_controller.h | 3 +++ .../os_interface/linux/drm_command_stream.inl | 2 ++ .../direct_submission_controller_tests.cpp | 22 +++++++++++++++++++ 6 files changed, 47 insertions(+) diff --git a/shared/source/command_stream/command_stream_receiver.cpp b/shared/source/command_stream/command_stream_receiver.cpp index 29c5260929..68a46895ce 100644 --- a/shared/source/command_stream/command_stream_receiver.cpp +++ b/shared/source/command_stream/command_stream_receiver.cpp @@ -13,6 +13,7 @@ #include "shared/source/command_stream/preemption.h" #include "shared/source/command_stream/scratch_space_controller.h" #include "shared/source/device/device.h" +#include "shared/source/direct_submission/direct_submission_controller.h" #include "shared/source/execution_environment/root_device_environment.h" #include "shared/source/gmm_helper/page_table_mngr.h" #include "shared/source/helpers/array_count.h" @@ -385,6 +386,13 @@ AubSubCaptureStatus CommandStreamReceiver::checkAndActivateAubSubCapture(const s void CommandStreamReceiver::addAubComment(const char *comment) {} +void CommandStreamReceiver::startControllingDirectSubmissions() { + auto controller = this->executionEnvironment.directSubmissionController.get(); + if (controller) { + controller->startControlling(); + } +} + GraphicsAllocation *CommandStreamReceiver::allocateDebugSurface(size_t size) { UNRECOVERABLE_IF(debugSurface != nullptr); debugSurface = getMemoryManager()->allocateGraphicsMemoryWithProperties({rootDeviceIndex, size, GraphicsAllocation::AllocationType::INTERNAL_HOST_MEMORY, getOsContext().getDeviceBitfield()}); diff --git a/shared/source/command_stream/command_stream_receiver.h b/shared/source/command_stream/command_stream_receiver.h index 618e16cece..43768766b5 100644 --- a/shared/source/command_stream/command_stream_receiver.h +++ b/shared/source/command_stream/command_stream_receiver.h @@ -235,6 +235,8 @@ class CommandStreamReceiver { uint32_t getRootDeviceIndex() { return rootDeviceIndex; } + void startControllingDirectSubmissions(); + virtual bool initDirectSubmission(Device &device, OsContext &osContext) { return true; } diff --git a/shared/source/direct_submission/direct_submission_controller.cpp b/shared/source/direct_submission/direct_submission_controller.cpp index f19220de7d..3660c7c03a 100644 --- a/shared/source/direct_submission/direct_submission_controller.cpp +++ b/shared/source/direct_submission/direct_submission_controller.cpp @@ -42,9 +42,19 @@ void DirectSubmissionController::unregisterDirectSubmission(CommandStreamReceive directSubmissions.erase(csr); } +void DirectSubmissionController::startControlling() { + this->runControlling.store(true); +} + void *DirectSubmissionController::controlDirectSubmissionsState(void *self) { auto controller = reinterpret_cast(self); + while (!controller->runControlling.load()) { + if (!controller->keepControlling.load()) { + return nullptr; + } + } + while (true) { auto start = std::chrono::steady_clock::now(); diff --git a/shared/source/direct_submission/direct_submission_controller.h b/shared/source/direct_submission/direct_submission_controller.h index 4ae8a338ed..959df908ac 100644 --- a/shared/source/direct_submission/direct_submission_controller.h +++ b/shared/source/direct_submission/direct_submission_controller.h @@ -25,6 +25,8 @@ class DirectSubmissionController { void registerDirectSubmission(CommandStreamReceiver *csr); void unregisterDirectSubmission(CommandStreamReceiver *csr); + void startControlling(); + static bool isSupported(); protected: @@ -41,6 +43,7 @@ class DirectSubmissionController { std::unique_ptr directSubmissionControllingThread; std::atomic_bool keepControlling = true; + std::atomic_bool runControlling = false; int timeout = 5; }; diff --git a/shared/source/os_interface/linux/drm_command_stream.inl b/shared/source/os_interface/linux/drm_command_stream.inl index ef723a0745..1f65df931f 100644 --- a/shared/source/os_interface/linux/drm_command_stream.inl +++ b/shared/source/os_interface/linux/drm_command_stream.inl @@ -109,9 +109,11 @@ bool DrmCommandStreamReceiver::flush(BatchBuffer &batchBuffer, Reside } if (this->directSubmission.get()) { + this->startControllingDirectSubmissions(); return this->directSubmission->dispatchCommandBuffer(batchBuffer, *this->flushStamp.get()); } if (this->blitterDirectSubmission.get()) { + this->startControllingDirectSubmissions(); return this->blitterDirectSubmission->dispatchCommandBuffer(batchBuffer, *this->flushStamp.get()); } 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 6323d50dd2..24072c8f71 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 @@ -87,6 +87,8 @@ TEST(DirectSubmissionControllerTests, givenDirectSubmissionControllerWhenTimeout csr.taskCount.store(9u); DirectSubmissionControllerMock controller; + executionEnvironment.directSubmissionController.reset(&controller); + csr.startControllingDirectSubmissions(); controller.registerDirectSubmission(&csr); while (!controller.directSubmissions[&csr].isStopped) { @@ -97,6 +99,26 @@ TEST(DirectSubmissionControllerTests, givenDirectSubmissionControllerWhenTimeout EXPECT_EQ(controller.directSubmissions[&csr].taskCount, 9u); controller.unregisterDirectSubmission(&csr); + executionEnvironment.directSubmissionController.release(); +} + +TEST(DirectSubmissionControllerTests, givenDirectSubmissionControllerWithStartedControllingWhenShuttingDownThenNoHang) { + DirectSubmissionControllerMock controller; + EXPECT_NE(controller.directSubmissionControllingThread.get(), nullptr); + + controller.startControlling(); + controller.keepControlling.store(false); + controller.directSubmissionControllingThread->join(); + controller.directSubmissionControllingThread.reset(); +} + +TEST(DirectSubmissionControllerTests, givenDirectSubmissionControllerWithNotStartedControllingWhenShuttingDownThenNoHang) { + DirectSubmissionControllerMock controller; + EXPECT_NE(controller.directSubmissionControllingThread.get(), nullptr); + + controller.keepControlling.store(false); + controller.directSubmissionControllingThread->join(); + controller.directSubmissionControllingThread.reset(); } } // namespace NEO \ No newline at end of file