fix: use condition variables instead of busy waits in worker threads

Resolves: NEO-16085, GSD-11678, HSD-14025819208

Signed-off-by: Igor Venevtsev <igor.venevtsev@intel.com>
This commit is contained in:
Igor Venevtsev
2025-09-23 12:24:40 +00:00
committed by Compute-Runtime-Automation
parent 49293fcac6
commit 452475a0b9
18 changed files with 218 additions and 67 deletions

View File

@@ -13,7 +13,6 @@ namespace NEO {
struct DirectSubmissionControllerMock : public DirectSubmissionController {
using DirectSubmissionController::bcsTimeoutDivisor;
using DirectSubmissionController::checkNewSubmissions;
using DirectSubmissionController::condVarMutex;
using DirectSubmissionController::directSubmissionControllingThread;
using DirectSubmissionController::directSubmissions;
using DirectSubmissionController::directSubmissionsMutex;
@@ -26,6 +25,7 @@ struct DirectSubmissionControllerMock : public DirectSubmissionController {
using DirectSubmissionController::lowestThrottleSubmitted;
using DirectSubmissionController::maxTimeout;
using DirectSubmissionController::pagingFenceRequests;
using DirectSubmissionController::syncData;
using DirectSubmissionController::timeout;
using DirectSubmissionController::timeoutDivisor;
using DirectSubmissionController::timeSinceLastCheck;
@@ -41,6 +41,21 @@ struct DirectSubmissionControllerMock : public DirectSubmissionController {
}
}
bool hasNoWork() override {
sleepOnNoWorkConditionVar.store(DirectSubmissionController::hasNoWork());
return sleepOnNoWorkConditionVar.load();
}
void handlePagingFenceRequests(std::unique_lock<std::mutex> &lock, bool checkForNewSubmissions) override {
handlePagingFenceRequestsCalled.store(true);
DirectSubmissionController::handlePagingFenceRequests(lock, checkForNewSubmissions);
}
void checkNewSubmissions() override {
checkNewSubmissionCalled.store(true);
DirectSubmissionController::checkNewSubmissions();
}
SteadyClock::time_point getCpuTimestamp() override {
return cpuTimestamp;
}
@@ -58,6 +73,9 @@ struct DirectSubmissionControllerMock : public DirectSubmissionController {
std::atomic<bool> sleepReturnValue{false};
std::atomic<TimeoutElapsedMode> timeoutElapsedReturnValue{TimeoutElapsedMode::notElapsed};
std::atomic<bool> timeoutElapsedCallBase{false};
std::atomic<bool> sleepOnNoWorkConditionVar{false};
std::atomic<bool> checkNewSubmissionCalled{false};
std::atomic<bool> handlePagingFenceRequestsCalled{false};
bool callBaseSleepMethod = false;
};
} // namespace NEO
} // namespace NEO

View File

@@ -1033,7 +1033,7 @@ TEST(DirectSubmissionControllerWindowsTest, givenDirectSubmissionControllerWhenC
DirectSubmissionControllerMock controller;
controller.callBaseSleepMethod = true;
std::unique_lock<std::mutex> lock(controller.condVarMutex);
std::unique_lock<std::mutex> lock(controller.syncData.mutex);
controller.sleep(lock);
EXPECT_TRUE(controller.sleepCalled);
EXPECT_EQ(1u, SysCalls::timeBeginPeriodCalled);