SWDEV-360183 - Finish the trace if queue was destroyed

- Make sure SQQT trace is captured for RGP server if the queue is destroyed before normal capture is done.
- Remove prepare queue from the logic. It's not really used for any HW capture and can cause RGP server abort if destroyed before capture is even started(delayed capture)

Change-Id: I6eb19963190a5769c6477a5496c1b831a6d59b89


[ROCm/clr commit: c1c5127875]
This commit is contained in:
German
2022-10-17 13:47:13 -04:00
committed by German Andryeyev
parent d77a150bf9
commit 6ab9293146
2 changed files with 24 additions and 19 deletions
+24 -18
View File
@@ -540,10 +540,8 @@ Pal::Result RgpCaptureMgr::PrepareRGPTrace(VirtualGPU* gpu) {
}
if (result == Pal::Result::Success) {
// Remember which queue started the trace
trace_.prepare_queue_ = gpu;
trace_.begin_queue_ = nullptr;
trace_.begin_queue_ = nullptr;
trace_.status_ = TraceStatus::Preparing;
} else {
// We failed to prepare for the trace so abort it.
@@ -571,13 +569,6 @@ Pal::Result RgpCaptureMgr::BeginRGPTrace(VirtualGPU* gpu) {
// resources against this new one if the device is changing.
Pal::Result result = Pal::Result::Success;
if (result == Pal::Result::Success) {
// Only allow trace to start if the queue family at prep-time matches the queue
// family at begin time because the command buffer engine type must match
if (trace_.prepare_queue_ != gpu) {
result = Pal::Result::ErrorIncompatibleQueue;
}
}
// Start a GPA tracing sample with SQTT enabled
if (result == Pal::Result::Success) {
@@ -711,14 +702,32 @@ Pal::Result RgpCaptureMgr::EndRGPTrace(VirtualGPU* gpu) {
// This function resets and possibly cancels a currently active (between begin/end) RGP trace.
// It frees any dependent resources.
void RgpCaptureMgr::FinishRGPTrace(VirtualGPU* gpu, bool aborted) {
if (trace_.prepare_queue_ == nullptr) {
// Make sure current queue matches the capture queue
if ((trace_.begin_queue_ == nullptr) || (trace_.begin_queue_ != gpu)) {
return;
}
// Finish the trace if the queue was destroyed before
// OCL reached the number of captured dispatches
if ((trace_.sqtt_disp_count_ != 0) && (gpu != nullptr)) {
EndRGPHardwareTrace(gpu);
// Finish the trace if the queue was destroyed before OCL reached
// the number of captured dispatches
if (trace_.sqtt_disp_count_ != 0) {
if (EndRGPHardwareTrace(gpu) != Pal::Result::Success) {
aborted = true;
}
}
// If the trace was aborted, then make sure the current results are sent to RGP server
if (aborted) {
if (trace_.status_ == TraceStatus::WaitingForSqtt) {
auto result = EndRGPTrace(gpu);
// The logic always checks for the trace status below and error can be ignored, since
// runtime aborts the trace
}
// Check if runtime is waiting for the final trace results
if (trace_.status_ == TraceStatus::WaitingForResults) {
// If results are ready, then finish the trace
if (CheckForTraceResults() == Pal::Result::Success) {
rgp_server_->EndTrace();
}
}
}
// Inform RGP protocol that we're done with the trace, either by aborting it or finishing normally
@@ -727,17 +736,14 @@ void RgpCaptureMgr::FinishRGPTrace(VirtualGPU* gpu, bool aborted) {
} else {
rgp_server_->EndTrace();
}
if (trace_.gpa_session_ != nullptr) {
trace_.gpa_session_->Reset();
}
// Reset tracing state to idle
trace_.prepared_disp_count_ = 0;
trace_.sqtt_disp_count_ = 0;
trace_.gpa_sample_id_ = 0;
trace_.status_ = TraceStatus::Idle;
trace_.prepare_queue_ = nullptr;
trace_.begin_queue_ = nullptr;
}
@@ -361,7 +361,6 @@ class RgpCaptureMgr {
GpuEvent end_sqtt_event_; // Event that is signaled when a trace-end cmdbuf retires
GpuEvent end_event_; // Event that is signaled when a trace-end cmdbuf retires
VirtualGPU* prepare_queue_; // The queue that triggered the full start of a trace
VirtualGPU* begin_queue_; // The queue that triggered starting SQTT
GpuUtil::GpaSession* gpa_session_; // GPA session helper object for building RGP data