@@ -66,40 +66,50 @@ void DirectSubmissionController::startThread() {
6666}
6767
6868void DirectSubmissionController::stopThread () {
69- {
70- std::lock_guard<std::mutex> lock (condVarMutex);
71- keepControlling.store (false );
72- condVar.notify_one ();
73- }
69+ runControlling.store (false );
70+ keepControlling.store (false );
7471 if (directSubmissionControllingThread) {
7572 directSubmissionControllingThread->join ();
7673 directSubmissionControllingThread.reset ();
7774 }
7875}
7976
77+ void DirectSubmissionController::startControlling () {
78+ this ->runControlling .store (true );
79+ }
80+
8081void *DirectSubmissionController::controlDirectSubmissionsState (void *self) {
8182 auto controller = reinterpret_cast <DirectSubmissionController *>(self);
8283
84+ while (!controller->runControlling .load ()) {
85+ if (!controller->keepControlling .load ()) {
86+ return nullptr ;
87+ }
88+ std::unique_lock<std::mutex> lock (controller->condVarMutex );
89+ controller->handlePagingFenceRequests (lock, false );
90+
91+ auto isControllerNotified = controller->sleep (lock);
92+ if (isControllerNotified) {
93+ controller->handlePagingFenceRequests (lock, false );
94+ }
95+ }
96+
8397 controller->timeSinceLastCheck = controller->getCpuTimestamp ();
8498 controller->lastHangCheckTime = std::chrono::high_resolution_clock::now ();
85-
86- while (controller->keepControlling .load ()) {
99+ while (true ) {
100+ if (!controller->keepControlling .load ()) {
101+ return nullptr ;
102+ }
87103 std::unique_lock<std::mutex> lock (controller->condVarMutex );
88- controller->wait (lock);
89- controller->handlePagingFenceRequests (lock);
90- controller->sleep (lock);
91- controller->handlePagingFenceRequests (lock);
104+ controller->handlePagingFenceRequests (lock, true );
105+
106+ auto isControllerNotified = controller->sleep (lock);
107+ if (isControllerNotified) {
108+ controller->handlePagingFenceRequests (lock, true );
109+ }
92110 lock.unlock ();
93111 controller->checkNewSubmissions ();
94112 }
95-
96- return nullptr ;
97- }
98-
99- void DirectSubmissionController::notifyNewSubmission (const CommandStreamReceiver *csr) {
100- ++activeSubmissionsCount;
101- directSubmissions[const_cast <CommandStreamReceiver *>(csr)].isActive = true ;
102- condVar.notify_one ();
103113}
104114
105115void DirectSubmissionController::checkNewSubmissions () {
@@ -111,11 +121,9 @@ void DirectSubmissionController::checkNewSubmissions() {
111121 std::lock_guard<std::mutex> lock (this ->directSubmissionsMutex );
112122 bool shouldRecalculateTimeout = false ;
113123 std::optional<TaskCountType> bcsTaskCount{};
114- for (auto &[csr, state] : directSubmissions) {
115- if (!state.isActive ) {
116- continue ;
117- }
118-
124+ for (auto &directSubmission : this ->directSubmissions ) {
125+ auto csr = directSubmission.first ;
126+ auto &state = directSubmission.second ;
119127 auto isBcs = EngineHelpers::isBcs (csr->getOsContext ().getEngineType ());
120128 if (timeoutMode == TimeoutElapsedMode::bcsOnly && !isBcs) {
121129 continue ;
@@ -135,10 +143,8 @@ void DirectSubmissionController::checkNewSubmissions() {
135143 auto lock = csr->obtainUniqueOwnership ();
136144 if (!isCsrIdleDetectionEnabled || (isDirectSubmissionIdle (csr, lock) && isCopyEngineIdle)) {
137145 csr->stopDirectSubmission (false , false );
138- state.isActive = false ;
139146 state.isStopped = true ;
140147 shouldRecalculateTimeout = true ;
141- --activeSubmissionsCount;
142148 }
143149 state.taskCount = csr->peekTaskCount ();
144150 } else {
@@ -276,13 +282,13 @@ void DirectSubmissionController::recalculateTimeout() {
276282}
277283
278284void DirectSubmissionController::enqueueWaitForPagingFence (CommandStreamReceiver *csr, uint64_t pagingFenceValue) {
279- std::lock_guard lock (condVarMutex);
285+ std::lock_guard lock (this -> condVarMutex );
280286 pagingFenceRequests.push ({csr, pagingFenceValue});
281287 condVar.notify_one ();
282288}
283289
284290void DirectSubmissionController::drainPagingFenceQueue () {
285- std::lock_guard lock (condVarMutex);
291+ std::lock_guard lock (this -> condVarMutex );
286292
287293 while (!pagingFenceRequests.empty ()) {
288294 auto request = pagingFenceRequests.front ();
@@ -291,13 +297,18 @@ void DirectSubmissionController::drainPagingFenceQueue() {
291297 }
292298}
293299
294- void DirectSubmissionController::handlePagingFenceRequests (std::unique_lock<std::mutex> &lock) {
300+ void DirectSubmissionController::handlePagingFenceRequests (std::unique_lock<std::mutex> &lock, bool checkForNewSubmissions ) {
295301 UNRECOVERABLE_IF (!lock.owns_lock ())
296302 while (!pagingFenceRequests.empty ()) {
297303 auto request = pagingFenceRequests.front ();
298304 pagingFenceRequests.pop ();
299305 lock.unlock ();
306+
300307 request.csr ->unblockPagingFenceSemaphore (request.pagingFenceValue );
308+ if (checkForNewSubmissions) {
309+ checkNewSubmissions ();
310+ }
311+
301312 lock.lock ();
302313 }
303314}
0 commit comments