video_core: amdgpu: fix for a deadlock in wait on idle

This commit is contained in:
psucien 2024-05-29 16:03:37 +02:00
parent db113bbc7b
commit 5f37a6be83
2 changed files with 11 additions and 21 deletions

View File

@ -18,7 +18,8 @@ Liverpool::Liverpool() {
Liverpool::~Liverpool() { Liverpool::~Liverpool() {
process_thread.request_stop(); process_thread.request_stop();
cv_submit.notify_one(); num_submits = -1;
num_submits.notify_one();
process_thread.join(); process_thread.join();
} }
@ -26,10 +27,7 @@ void Liverpool::Process(std::stop_token stoken) {
Common::SetCurrentThreadName("GPU_CommandProcessor"); Common::SetCurrentThreadName("GPU_CommandProcessor");
while (!stoken.stop_requested()) { while (!stoken.stop_requested()) {
{ num_submits.wait(0);
std::unique_lock lock{m_submit};
cv_submit.wait(lock, stoken, [this]() { return num_submits != 0; });
}
if (stoken.stop_requested()) { if (stoken.stop_requested()) {
break; break;
@ -63,13 +61,14 @@ void Liverpool::Process(std::stop_token stoken) {
--num_submits; --num_submits;
} }
} }
cv_complete.notify_all(); // Notify GPU idle num_submits.notify_all();
} }
} }
void Liverpool::WaitGpuIdle() { void Liverpool::WaitGpuIdle() {
std::unique_lock lock{m_submit}; while (const auto old = num_submits.load()) {
cv_complete.wait(lock, [this]() { return num_submits == 0; }); num_submits.wait(old);
}
} }
Liverpool::Task Liverpool::ProcessCeUpdate(std::span<const u32> ccb) { Liverpool::Task Liverpool::ProcessCeUpdate(std::span<const u32> ccb) {
@ -309,11 +308,8 @@ void Liverpool::SubmitGfx(std::span<const u32> dcb, std::span<const u32> ccb) {
queue.submits.emplace(task.handle); queue.submits.emplace(task.handle);
} }
{ ++num_submits;
std::unique_lock lock{m_submit}; num_submits.notify_one();
++num_submits;
}
cv_submit.notify_one();
} }
void Liverpool::SubmitAsc(u32 vqid, std::span<const u32> acb) { void Liverpool::SubmitAsc(u32 vqid, std::span<const u32> acb) {
@ -326,11 +322,8 @@ void Liverpool::SubmitAsc(u32 vqid, std::span<const u32> acb) {
queue.submits.emplace(task.handle); queue.submits.emplace(task.handle);
} }
{ ++num_submits;
std::unique_lock lock{m_submit}; num_submits.notify_one();
++num_submits;
}
cv_submit.notify_one();
} }
} // namespace AmdGpu } // namespace AmdGpu

View File

@ -771,9 +771,6 @@ private:
Vulkan::Rasterizer* rasterizer{}; Vulkan::Rasterizer* rasterizer{};
std::jthread process_thread{}; std::jthread process_thread{};
std::condition_variable_any cv_submit{};
std::condition_variable cv_complete{};
std::mutex m_submit{};
std::atomic<u32> num_submits{}; std::atomic<u32> num_submits{};
}; };