From 324a5519b95e60fd224d18b20ce271bfdfdc1925 Mon Sep 17 00:00:00 2001 From: Jin Jung Date: Sun, 9 Nov 2025 12:52:35 -0800 Subject: [PATCH] SWDEV-563842 - Fix Memory Address Offset Bug (#1749) * SWDEV-563842 - Fix Memory Address Offset Bug * Revert "SWDEV-563842 - Fix Memory Address Offset Bug" This reverts commit 477958dc48300ee1fe0166aa6f0d3d8125b91f5e. * SWDEV-563842 - Fix Memcpy Address Offset Bug * SWDEV-563842 - Find Memcpy Device Address Offset * Revert "SWDEV-563842 - Find Memcpy Device Address Offset" This reverts commit 6c75a9e5b58b7dfabb9e3f91fa3dd892d42639cc. * Revert "SWDEV-563842 - Fix Memcpy Address Offset Bug" This reverts commit 0b89072a988074aa4da4e8fc7ba04c554f31ed44. * SWDEV-563842 - MemObjMap_ Offset Support This patch fixes the buffer offset handling bug. * Revert "SWDEV-563842 - MemObjMap_ Offset Support" This reverts commit 37fce3382465e3420721e5277377f943ec2b30a1. * SWDEV-563842 - External Memory Buffer View --- projects/clr/hipamd/src/hip_memory.cpp | 36 ++++++++++++++++++++------ 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/projects/clr/hipamd/src/hip_memory.cpp b/projects/clr/hipamd/src/hip_memory.cpp index bd553f4678..8fce273719 100644 --- a/projects/clr/hipamd/src/hip_memory.cpp +++ b/projects/clr/hipamd/src/hip_memory.cpp @@ -111,8 +111,8 @@ hipError_t ihipFree(void* ptr) { // Wait on the device, associated with the current memory object during allocation g_devices[device_id]->SyncAllStreams(); - // External mem is not svm. - if (memory_object->isInterop()) { + // Non SVM memory free, such as external memory + if (memory_object->getSvmPtr() == nullptr) { amd::MemObjMap::RemoveMemObj(ptr); memory_object->release(); } else { @@ -172,15 +172,35 @@ hipError_t hipExternalMemoryGetMappedBuffer(void** devPtr, hipExternalMemory_t e if (devPtr == nullptr || extMem == nullptr || bufferDesc == nullptr || bufferDesc->flags != 0) { HIP_RETURN(hipErrorInvalidValue); } - auto buf = reinterpret_cast(extMem); - const device::Memory* devMem = buf->getDeviceMemory(*hip::getCurrentDevice()->devices()[0]); - if (devMem == nullptr || ((bufferDesc->offset + bufferDesc->size) > devMem->size())) { + auto buf = reinterpret_cast(extMem); + + // Validate bounds + if (bufferDesc->size > buf->getSize() || + bufferDesc->offset > buf->getSize() - bufferDesc->size) { HIP_RETURN(hipErrorInvalidValue); } - *devPtr = reinterpret_cast(devMem->virtualAddress() + bufferDesc->offset); - amd::MemObjMap::AddMemObj(*devPtr, buf); - buf->retain(); + + // Create a buffer view + auto view = new (buf->getContext()) + amd::Buffer(*buf, buf->getMemFlags(), bufferDesc->offset, bufferDesc->size); + if (view == nullptr || !view->create()) { + if (view) view->release(); + HIP_RETURN(hipErrorOutOfMemory); + } + + // Create device memory for the current device + const device::Memory* devMem = view->getDeviceMemory(*hip::getCurrentDevice()->devices()[0]); + if (devMem == nullptr) { + view->release(); + HIP_RETURN(hipErrorInvalidValue); + } + + // Map the device memory to the user pointer + *devPtr = reinterpret_cast(devMem->virtualAddress()); + amd::MemObjMap::AddMemObj(*devPtr, view); + view->retain(); + HIP_RETURN(hipSuccess); }