SWDEV-440746 - Fix the hostcall buffer creation
Avoid a deadlock on the host call buffer creation. Since the buffer will be
allocated in the queue thread, then use direct device memory allocation
skipping the global context lock.
Change-Id: I09b55ee03bb42ab5d320c152b52a8c842c5fdcc1
[ROCm/clr commit: 62559a6e5a]
This commit is contained in:
@@ -284,7 +284,10 @@ static struct Init {
|
|||||||
~Init() {
|
~Init() {
|
||||||
if (state == State::kInit) {
|
if (state == State::kInit) {
|
||||||
state = State::kDestroy;
|
state = State::kDestroy;
|
||||||
while (state == State::kDestroy) {}
|
// @note: Under Linux thread destruction can be delayed and
|
||||||
|
// ROCR may crash in a wait for event occasionally. Hence, runtime needs
|
||||||
|
// an early exit. The logic isn't required for Windows.
|
||||||
|
while (IS_LINUX && (state == State::kDestroy)) {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} kHostThreadActive;
|
} kHostThreadActive;
|
||||||
|
|||||||
@@ -1154,7 +1154,7 @@ VirtualGPU::~VirtualGPU() {
|
|||||||
"deleting hostcall buffer %p for virtual queue %p",
|
"deleting hostcall buffer %p for virtual queue %p",
|
||||||
hostcallBuffer_, this);
|
hostcallBuffer_, this);
|
||||||
disableHostcalls(hostcallBuffer_);
|
disableHostcalls(hostcallBuffer_);
|
||||||
dev().context().svmFree(hostcallBuffer_);
|
dev().svmFree(hostcallBuffer_);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3766,7 +3766,8 @@ void* VirtualGPU::getOrCreateHostcallBuffer() {
|
|||||||
auto size = getHostcallBufferSize(numPackets);
|
auto size = getHostcallBufferSize(numPackets);
|
||||||
auto align = getHostcallBufferAlignment();
|
auto align = getHostcallBufferAlignment();
|
||||||
|
|
||||||
hostcallBuffer_ = dev().context().svmAlloc(size, align, CL_MEM_SVM_FINE_GRAIN_BUFFER | CL_MEM_SVM_ATOMICS);
|
hostcallBuffer_ = dev().svmAlloc(dev().context(), size, align,
|
||||||
|
CL_MEM_SVM_FINE_GRAIN_BUFFER | CL_MEM_SVM_ATOMICS, nullptr);
|
||||||
if (!hostcallBuffer_) {
|
if (!hostcallBuffer_) {
|
||||||
ClPrint(amd::LOG_ERROR, amd::LOG_QUEUE,
|
ClPrint(amd::LOG_ERROR, amd::LOG_QUEUE,
|
||||||
"Failed to create hostcall buffer");
|
"Failed to create hostcall buffer");
|
||||||
|
|||||||
Reference in New Issue
Block a user