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
Tento commit je obsažen v:
Jin Jung
2025-11-09 12:52:35 -08:00
odevzdal GitHub
rodič 7580052878
revize 324a5519b9
+28 -8
Zobrazit soubor
@@ -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<amd::ExternalBuffer*>(extMem);
const device::Memory* devMem = buf->getDeviceMemory(*hip::getCurrentDevice()->devices()[0]);
if (devMem == nullptr || ((bufferDesc->offset + bufferDesc->size) > devMem->size())) {
auto buf = reinterpret_cast<amd::ExternalBuffer*>(extMem);
// Validate bounds
if (bufferDesc->size > buf->getSize() ||
bufferDesc->offset > buf->getSize() - bufferDesc->size) {
HIP_RETURN(hipErrorInvalidValue);
}
*devPtr = reinterpret_cast<void*>(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<void*>(devMem->virtualAddress());
amd::MemObjMap::AddMemObj(*devPtr, view);
view->retain();
HIP_RETURN(hipSuccess);
}