@@ -66,50 +66,40 @@ void DirectSubmissionController::startThread() {
6666}
6767
6868void DirectSubmissionController::stopThread () {
69- runControlling.store (false );
70- keepControlling.store (false );
69+ {
70+ std::lock_guard<std::mutex> lock (condVarMutex);
71+ keepControlling.store (false );
72+ condVar.notify_one ();
73+ }
7174 if (directSubmissionControllingThread) {
7275 directSubmissionControllingThread->join ();
7376 directSubmissionControllingThread.reset ();
7477 }
7578}
7679
77- void DirectSubmissionController::startControlling () {
78- this ->runControlling .store (true );
79- }
80-
8180void *DirectSubmissionController::controlDirectSubmissionsState (void *self) {
8281 auto controller = reinterpret_cast <DirectSubmissionController *>(self);
8382
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-
9783 controller->timeSinceLastCheck = controller->getCpuTimestamp ();
9884 controller->lastHangCheckTime = std::chrono::high_resolution_clock::now ();
99- while (true ) {
100- if (!controller->keepControlling .load ()) {
101- return nullptr ;
102- }
103- std::unique_lock<std::mutex> lock (controller->condVarMutex );
104- controller->handlePagingFenceRequests (lock, true );
10585
106- auto isControllerNotified = controller->sleep (lock);
107- if (isControllerNotified) {
108- controller->handlePagingFenceRequests (lock, true );
109- }
86+ while (controller->keepControlling .load ()) {
87+ std::unique_lock<std::mutex> lock (controller->condVarMutex );
88+ controller->wait (lock);
89+ controller->handlePagingFenceRequests (lock);
90+ controller->sleep (lock);
91+ controller->handlePagingFenceRequests (lock);
11092 lock.unlock ();
11193 controller->checkNewSubmissions ();
11294 }
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 ();
113103}
114104
115105void DirectSubmissionController::checkNewSubmissions () {
@@ -121,9 +111,11 @@ void DirectSubmissionController::checkNewSubmissions() {
121111 std::lock_guard<std::mutex> lock (this ->directSubmissionsMutex );
122112 bool shouldRecalculateTimeout = false ;
123113 std::optional<TaskCountType> bcsTaskCount{};
124- for (auto &directSubmission : this ->directSubmissions ) {
125- auto csr = directSubmission.first ;
126- auto &state = directSubmission.second ;
114+ for (auto &[csr, state] : directSubmissions) {
115+ if (!state.isActive ) {
116+ continue ;
117+ }
118+
127119 auto isBcs = EngineHelpers::isBcs (csr->getOsContext ().getEngineType ());
128120 if (timeoutMode == TimeoutElapsedMode::bcsOnly && !isBcs) {
129121 continue ;
@@ -143,8 +135,10 @@ void DirectSubmissionController::checkNewSubmissions() {
143135 auto lock = csr->obtainUniqueOwnership ();
144136 if (!isCsrIdleDetectionEnabled || (isDirectSubmissionIdle (csr, lock) && isCopyEngineIdle)) {
145137 csr->stopDirectSubmission (false , false );
138+ state.isActive = false ;
146139 state.isStopped = true ;
147140 shouldRecalculateTimeout = true ;
141+ --activeSubmissionsCount;
148142 }
149143 state.taskCount = csr->peekTaskCount ();
150144 } else {
@@ -282,13 +276,13 @@ void DirectSubmissionController::recalculateTimeout() {
282276}
283277
284278void DirectSubmissionController::enqueueWaitForPagingFence (CommandStreamReceiver *csr, uint64_t pagingFenceValue) {
285- std::lock_guard lock (this -> condVarMutex );
279+ std::lock_guard lock (condVarMutex);
286280 pagingFenceRequests.push ({csr, pagingFenceValue});
287281 condVar.notify_one ();
288282}
289283
290284void DirectSubmissionController::drainPagingFenceQueue () {
291- std::lock_guard lock (this -> condVarMutex );
285+ std::lock_guard lock (condVarMutex);
292286
293287 while (!pagingFenceRequests.empty ()) {
294288 auto request = pagingFenceRequests.front ();
@@ -297,18 +291,13 @@ void DirectSubmissionController::drainPagingFenceQueue() {
297291 }
298292}
299293
300- void DirectSubmissionController::handlePagingFenceRequests (std::unique_lock<std::mutex> &lock, bool checkForNewSubmissions ) {
294+ void DirectSubmissionController::handlePagingFenceRequests (std::unique_lock<std::mutex> &lock) {
301295 UNRECOVERABLE_IF (!lock.owns_lock ())
302296 while (!pagingFenceRequests.empty ()) {
303297 auto request = pagingFenceRequests.front ();
304298 pagingFenceRequests.pop ();
305299 lock.unlock ();
306-
307300 request.csr ->unblockPagingFenceSemaphore (request.pagingFenceValue );
308- if (checkForNewSubmissions) {
309- checkNewSubmissions ();
310- }
311-
312301 lock.lock ();
313302 }
314303}
0 commit comments