From 42625f0527bf85dbf78458c8f03e82ab11b542b4 Mon Sep 17 00:00:00 2001 From: Saleel Kudchadker Date: Mon, 13 Dec 2021 19:38:29 -0800 Subject: [PATCH] SWDEV-313306 - Clear external signals Crash was due to the fact that external signal structure was stale even after destroyign the command. That is because we skipped wait due to a missing check. Detect external signals and dispatch a barrier in ReleaseGpuMemoryFence. Also clear external_signals_ at ProfilingBegin. Change-Id: I991387edcfe928b511bf5e780988ee131321ed5a [ROCm/clr commit: 3239222516667d2022afc47a5c1603f09890fc95] --- projects/clr/rocclr/device/rocm/rocvirtual.cpp | 5 ++++- projects/clr/rocclr/device/rocm/rocvirtual.hpp | 6 ++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/projects/clr/rocclr/device/rocm/rocvirtual.cpp b/projects/clr/rocclr/device/rocm/rocvirtual.cpp index f853a700b9..9876996eb2 100644 --- a/projects/clr/rocclr/device/rocm/rocvirtual.cpp +++ b/projects/clr/rocclr/device/rocm/rocvirtual.cpp @@ -504,6 +504,7 @@ std::vector& VirtualGPU::HwQueueTracker::WaitingSignal(HwQueueEngi } external_signals_.clear(); } + // Return the array of waiting HSA signals return waiting_signals_; } @@ -1003,7 +1004,7 @@ void VirtualGPU::ResetQueueStates() { // ================================================================================================ bool VirtualGPU::releaseGpuMemoryFence(bool skip_cpu_wait) { - if (hasPendingDispatch_) { + if (hasPendingDispatch_ || !Barriers().IsExternalSignalListEmpty()) { // Dispatch barrier packet into the queue dispatchBarrierPacket(kBarrierPacketHeader); hasPendingDispatch_ = false; @@ -1276,6 +1277,7 @@ void VirtualGPU::profilingBegin(amd::Command& command, bool drmProfiling) { } if (AMD_DIRECT_DISPATCH) { + Barriers().ClearExternalSignals(); for (auto it = command.eventWaitList().begin(); it < command.eventWaitList().end(); ++it) { void* hw_event = ((*it)->NotifyEvent() != nullptr) ? (*it)->NotifyEvent()->HwEvent() : (*it)->HwEvent(); @@ -1302,6 +1304,7 @@ void VirtualGPU::profilingEnd(amd::Command& command) { if (!timestamp_->HwProfiling()) { timestamp_->end(); } + assert(Barriers().IsExternalSignalListEmpty()); command.setData(timestamp_); timestamp_ = nullptr; } diff --git a/projects/clr/rocclr/device/rocm/rocvirtual.hpp b/projects/clr/rocclr/device/rocm/rocvirtual.hpp index e21e38ffef..5301da8d1c 100644 --- a/projects/clr/rocclr/device/rocm/rocvirtual.hpp +++ b/projects/clr/rocclr/device/rocm/rocvirtual.hpp @@ -243,6 +243,12 @@ class VirtualGPU : public device::VirtualDevice { //! Get the last active signal on the queue ProfilingSignal* GetLastSignal() const { return signal_list_[current_id_]; } + //! Clear external signals + void ClearExternalSignals() { external_signals_.clear(); } + + //! Empty check for external signals + bool IsExternalSignalListEmpty() const { return external_signals_.empty(); } + private: //! Wait for the next active signal void WaitNext() {