SWDEV-510319 - Fixed random segfaults in graph tests

This change fixes random segfaults in graph tests that
are seen after the change make internal callbacks non-blocking.
The callback thread that decreases the GraphExec ref count
may now run after the runtime shutdown. This can cause a segfault
because the hip::device that is accessed in GraphExec destructor
is already destroyed during runtime shutdown. This patch ensures
that the hip::device object  stays alive until after the
callback thread completes.

Change-Id: I75a6ac01f27a0b2250bbd10ed389ebfb322927af
这个提交包含在:
Ioannis Assiouras
2025-01-22 02:40:10 +00:00
父节点 c460b0541b
当前提交 21c223f8df
修改 3 个文件,包含 7 行新增5 行删除
+1
查看文件
@@ -363,6 +363,7 @@ hipError_t GraphExec::Init() {
status = CaptureAQLPackets();
}
instantiateDeviceId_ = hip::getCurrentDevice()->deviceId();
static_cast<ReferenceCountedObject*>( hip::getCurrentDevice())->retain();
return status;
}
+3 -4
查看文件
@@ -505,7 +505,6 @@ struct Graph {
amd::ScopedLock lock(graphSetLock_);
graphSet_.insert(this);
mem_pool_ = device->GetGraphMemoryPool();
mem_pool_->retain();
graphInstantiated_ = false;
roots_.resize(DEBUG_HIP_FORCE_GRAPH_QUEUES);
leafs_.resize(DEBUG_HIP_FORCE_GRAPH_QUEUES);
@@ -543,9 +542,6 @@ struct Graph {
}
}
graphUserObj_.clear();
if (mem_pool_ != nullptr) {
mem_pool_->release();
}
memAllocNodePtrs_.clear();
}
@@ -764,6 +760,9 @@ struct GraphExec : public amd::ReferenceCountedObject, public Graph {
kernArgManager_->release();
}
}
if (instantiateDeviceId_ != -1) {
static_cast<ReferenceCountedObject*>(g_devices[instantiateDeviceId_])->release();
}
}
Node GetClonedNode(Node node) {
+3 -1
查看文件
@@ -235,11 +235,13 @@ bool HsaAmdSignalHandler(hsa_signal_value_t value, void* arg) {
// Reset last used SDMA engine mask
gpu->setLastUsedSdmaEngine(0);
bool isBlocking = ts->GetBlocking();
// Update the batch, since signal is complete
gpu->updateCommandsState(ts->command().GetBatchHead());
// Reset API callback signal. It will release AQL queue and start commands processing
if (callback_signal.handle != 0 && ts->GetBlocking()) {
if (callback_signal.handle != 0 && isBlocking) {
hsa_signal_subtract_relaxed(callback_signal, 1);
}