From 20417d5b0ff891711761441c9b523075d7f90a76 Mon Sep 17 00:00:00 2001 From: taosang2 Date: Fri, 14 Jun 2024 16:39:30 -0400 Subject: [PATCH] SWDEV-467540 - Fix reference of freed locks 1.Move global amd::monitor listenerLock before global class runtime_tear_down as it will be referenced in ~RuntimeTearDown() after main(). It should be freed later than runtime_tear_down. 2.Update Device::~Device() to SVM free coopHostcallBuffer_ before context_ is released and freed. Change-Id: I1d21378ff463477d3238d71e5e2a1a7d6b9147ad [ROCm/clr commit: 544c45364f8466704fe940225bca3245e73539ac] --- projects/clr/rocclr/device/devhostcall.cpp | 2 +- projects/clr/rocclr/device/rocm/rocdevice.cpp | 11 +++++------ projects/clr/rocclr/platform/runtime.cpp | 4 ++++ 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/projects/clr/rocclr/device/devhostcall.cpp b/projects/clr/rocclr/device/devhostcall.cpp index 99da349697..d59e4f799b 100644 --- a/projects/clr/rocclr/device/devhostcall.cpp +++ b/projects/clr/rocclr/device/devhostcall.cpp @@ -273,7 +273,7 @@ class HostcallListener { }; HostcallListener* hostcallListener = nullptr; -amd::Monitor listenerLock("Hostcall listener lock"); +extern amd::Monitor listenerLock; constexpr static uint64_t kTimeoutFloor = K * K * 4; constexpr static uint64_t kTimeoutCeil = K * K * 16; static struct Init { diff --git a/projects/clr/rocclr/device/rocm/rocdevice.cpp b/projects/clr/rocclr/device/rocm/rocdevice.cpp index 1cc442795c..e9bafafa3b 100644 --- a/projects/clr/rocclr/device/rocm/rocdevice.cpp +++ b/projects/clr/rocclr/device/rocm/rocdevice.cpp @@ -246,6 +246,11 @@ void Device::checkAtomicSupport() { } Device::~Device() { + if (coopHostcallBuffer_) { + amd::disableHostcalls(coopHostcallBuffer_); + context().svmFree(coopHostcallBuffer_); + coopHostcallBuffer_ = nullptr; + } // Release cached map targets for (uint i = 0; mapCache_ != nullptr && i < mapCache_->size(); ++i) { if ((*mapCache_)[i] != nullptr) { @@ -301,12 +306,6 @@ Device::~Device() { delete[] p2p_agents_list_; - if (coopHostcallBuffer_) { - amd::disableHostcalls(coopHostcallBuffer_); - context().svmFree(coopHostcallBuffer_); - coopHostcallBuffer_ = nullptr; - } - if (0 != prefetch_signal_.handle) { hsa_signal_destroy(prefetch_signal_); } diff --git a/projects/clr/rocclr/platform/runtime.cpp b/projects/clr/rocclr/platform/runtime.cpp index 444f736468..1b710ca207 100644 --- a/projects/clr/rocclr/platform/runtime.cpp +++ b/projects/clr/rocclr/platform/runtime.cpp @@ -102,6 +102,10 @@ void Runtime::tearDown() { initialized_ = false; } +// ~RuntimeTearDown() will reference listenerLock. +// listenerLock will be constructed ealier and destructed later than +// runtime_tear_down. +amd::Monitor listenerLock("Hostcall listener lock"); std::vector RuntimeTearDown::external_; RuntimeTearDown::~RuntimeTearDown() {