From 147485a9aa423d3607b1342864ee1482ca30a9be Mon Sep 17 00:00:00 2001 From: Jaydeep Date: Fri, 13 May 2022 12:39:47 +0000 Subject: [PATCH] SWDEV-336548 - Check for valid hipArray pointer in hipFreeArray Change-Id: Icf0d47eeca7b5dd390a6a9c53b622b3680688ca4 [ROCm/clr commit: 1032581ded93c2c233d1c81c0ce2880792f052f7] --- projects/clr/hipamd/src/hip_gl.cpp | 5 ++++- projects/clr/hipamd/src/hip_internal.hpp | 3 ++- projects/clr/hipamd/src/hip_memory.cpp | 21 +++++++++++++++++---- 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/projects/clr/hipamd/src/hip_gl.cpp b/projects/clr/hipamd/src/hip_gl.cpp index 02ff1c895a..e1b757a91f 100644 --- a/projects/clr/hipamd/src/hip_gl.cpp +++ b/projects/clr/hipamd/src/hip_gl.cpp @@ -211,7 +211,10 @@ hipError_t hipGraphicsSubResourceGetMappedArray(hipArray_t* array, hipGraphicsRe myarray->isDrv = 0; myarray->textureType = 0; *array = myarray; - + { + amd::ScopedLock lock(hip::hipArraySetLock); + hip::hipArraySet.insert(*array); + } HIP_RETURN(hipSuccess); } diff --git a/projects/clr/hipamd/src/hip_internal.hpp b/projects/clr/hipamd/src/hip_internal.hpp index 0a88265218..6bcb9a0949 100644 --- a/projects/clr/hipamd/src/hip_internal.hpp +++ b/projects/clr/hipamd/src/hip_internal.hpp @@ -468,6 +468,8 @@ namespace hip { int getDeviceID(amd::Context& ctx); /// Check if stream is valid extern bool isValid(hipStream_t& stream); + extern amd::Monitor hipArraySetLock; + extern std::unordered_set hipArraySet; }; extern void WaitThenDecrementSignal(hipStream_t stream, hipError_t status, void* user_data); @@ -510,5 +512,4 @@ extern std::vector g_captureStreams; extern amd::Monitor g_captureStreamsLock; extern thread_local std::vector l_captureStreams; extern thread_local hipStreamCaptureMode l_streamCaptureMode; - #endif // HIP_SRC_HIP_INTERNAL_H diff --git a/projects/clr/hipamd/src/hip_memory.cpp b/projects/clr/hipamd/src/hip_memory.cpp index 2c027c23cc..6b85d489e2 100644 --- a/projects/clr/hipamd/src/hip_memory.cpp +++ b/projects/clr/hipamd/src/hip_memory.cpp @@ -27,6 +27,9 @@ #include "platform/memory.hpp" #include "amdocl/cl_vk_amd.hpp" +amd::Monitor hip::hipArraySetLock{"Guards global hipArray set"}; +std::unordered_set hip::hipArraySet; + // ================================================================================================ amd::Memory* getMemoryObject(const void* ptr, size_t& offset, size_t size) { amd::Memory *memObj = amd::MemObjMap::FindMemObj(ptr); @@ -614,7 +617,12 @@ hipError_t ihipArrayDestroy(hipArray* array) { if (array == nullptr) { return hipErrorInvalidValue; } - + { + amd::ScopedLock lock(hip::hipArraySetLock); + if (hip::hipArraySet.find(array) == hip::hipArraySet.end()) { + return hipErrorContextIsDestroyed; + } + } cl_mem memObj = reinterpret_cast(array->data); if (is_valid(memObj) == false) { return hipErrorInvalidValue; @@ -628,9 +636,11 @@ hipError_t ihipArrayDestroy(hipArray* array) { } as_amd(memObj)->release(); - + { + amd::ScopedLock lock(hip::hipArraySetLock); + hip::hipArraySet.erase(array); + } delete array; - return hipSuccess; } @@ -963,7 +973,10 @@ hipError_t ihipArrayCreate(hipArray** array, (*array)->depth = pAllocateArray->Depth; (*array)->Format = pAllocateArray->Format; (*array)->NumChannels = pAllocateArray->NumChannels; - + { + amd::ScopedLock lock(hip::hipArraySetLock); + hip::hipArraySet.insert(*array); + } return hipSuccess; }