diff --git a/rocclr/runtime/device/rocm/rocblit.cpp b/rocclr/runtime/device/rocm/rocblit.cpp index c4a9210ebb..3e4e753295 100644 --- a/rocclr/runtime/device/rocm/rocblit.cpp +++ b/rocclr/runtime/device/rocm/rocblit.cpp @@ -616,6 +616,9 @@ bool DmaBlitManager::hsaCopy( bool enableCopyRect, bool flushDMA) const { + // todo integerops long_math test exposes + // a HW hang without lock protection. note: Runtime kernel copy works fine + amd::ScopedLock k(dev().hsaCopyOps()); address src = reinterpret_cast
(srcMemory.getDeviceMemory()); address dst = reinterpret_cast(dstMemory.getDeviceMemory()); @@ -663,6 +666,8 @@ bool DmaBlitManager::hsaCopy( bool DmaBlitManager::hsaCopyStaged( const_address hostSrc, address hostDst, size_t size, address staging, bool hostToDev) const { + amd::ScopedLock k(dev().hsaCopyOps()); + // No allocation is necessary for Full Profile hsa_status_t status; if (dev().agent_profile() == HSA_PROFILE_FULL) { diff --git a/rocclr/runtime/device/rocm/rocdevice.cpp b/rocclr/runtime/device/rocm/rocdevice.cpp index 84dd70f527..359e865b61 100644 --- a/rocclr/runtime/device/rocm/rocdevice.cpp +++ b/rocclr/runtime/device/rocm/rocdevice.cpp @@ -189,6 +189,7 @@ Device::Device(hsa_agent_t bkendDevice) , xferQueue_(nullptr) , xferRead_(nullptr) , xferWrite_(nullptr) + , hsaCopyOps_(nullptr) , numOfVgpus_(0) { group_segment_.handle = 0; @@ -207,6 +208,7 @@ Device::~Device() } delete mapCache_; delete mapCacheOps_; + delete hsaCopyOps_; // Destroy temporary buffers for read/write delete xferRead_; @@ -626,6 +628,11 @@ Device::create() return false; } + hsaCopyOps_ = new amd::Monitor("HSA copy Lock", true); + if (nullptr == hsaCopyOps_) { + return false; + } + mapCache_ = new std::vector