diff --git a/projects/clr/hipamd/src/hip_vm.cpp b/projects/clr/hipamd/src/hip_vm.cpp index bf29686a6a..9fbb2db4c6 100644 --- a/projects/clr/hipamd/src/hip_vm.cpp +++ b/projects/clr/hipamd/src/hip_vm.cpp @@ -35,7 +35,7 @@ static_assert(static_cast(hipMemAccessFlagsProtReadWrite) hipError_t hipMemAddressFree(void* devPtr, size_t size) { HIP_INIT_API(hipMemAddressFree, devPtr, size); - + hipError_t status = hipSuccess; if (devPtr == nullptr || size == 0) { HIP_RETURN(hipErrorInvalidValue); } @@ -44,9 +44,11 @@ hipError_t hipMemAddressFree(void* devPtr, size_t size) { LogPrintfError("Cannot find the Virtual MemObj entry for this addr 0x%x", devPtr); } // Single call frees address range for all devices. - g_devices[0]->devices()[0]->virtualFree(devPtr); + if (!(g_devices[0]->devices()[0]->virtualFree(devPtr))) { + status = hipErrorUnknown; + } memObj->release(); - HIP_RETURN(hipSuccess); + HIP_RETURN(status); } hipError_t hipMemAddressReserve(void** ptr, size_t size, size_t alignment, void* addr, diff --git a/projects/clr/rocclr/device/device.hpp b/projects/clr/rocclr/device/device.hpp index 160eb84caa..99ba26d4a9 100644 --- a/projects/clr/rocclr/device/device.hpp +++ b/projects/clr/rocclr/device/device.hpp @@ -1896,7 +1896,7 @@ class Device : public RuntimeObject { * * @param addr Start address of the range */ - virtual void virtualFree(void* addr) = 0; + virtual bool virtualFree(void* addr) = 0; /** * Export Shareable VMM Handle to FD diff --git a/projects/clr/rocclr/device/pal/paldevice.cpp b/projects/clr/rocclr/device/pal/paldevice.cpp index 4218d1bcf3..bb46dac684 100644 --- a/projects/clr/rocclr/device/pal/paldevice.cpp +++ b/projects/clr/rocclr/device/pal/paldevice.cpp @@ -2512,16 +2512,18 @@ void* Device::virtualAlloc(void* addr, size_t size, size_t alignment) { } // ================================================================================================ -void Device::virtualFree(void* addr) { +bool Device::virtualFree(void* addr) { auto vaddr_mem_obj = amd::MemObjMap::FindVirtualMemObj(addr); if (vaddr_mem_obj == nullptr) { LogPrintfError("Cannot find any mem_obj for addr: 0x%x \n", addr); - return; + return false; } if (!vaddr_mem_obj->getContext().devices()[0]->DestroyVirtualBuffer(vaddr_mem_obj)) { LogPrintfError("Cannot destroy mem_obj:0x%x for addr: 0x%x \n", vaddr_mem_obj, addr); + return false; } + return true; } // ================================================================================================ diff --git a/projects/clr/rocclr/device/pal/paldevice.hpp b/projects/clr/rocclr/device/pal/paldevice.hpp index 7e5013d979..a97132fe90 100644 --- a/projects/clr/rocclr/device/pal/paldevice.hpp +++ b/projects/clr/rocclr/device/pal/paldevice.hpp @@ -145,7 +145,7 @@ class NullDevice : public amd::Device { } virtual void svmFree(void* ptr) const { return; } virtual void* virtualAlloc(void* addr, size_t size, size_t alignment) { return nullptr; }; - virtual void virtualFree(void* addr) { }; + virtual bool virtualFree(void* addr) { return true; } virtual bool SetMemAccess(void* va_addr, size_t va_size, VmmAccess access_flags) { return true; @@ -561,7 +561,7 @@ class Device : public NullDevice { //! Virtual address space allocation(reservation) virtual void* virtualAlloc(void* addr, size_t size, size_t alignment); - virtual void virtualFree(void* addr); + virtual bool virtualFree(void* addr); //! Set/Get memory access set by the app virtual bool SetMemAccess(void* va_addr, size_t va_size, VmmAccess access_flags); diff --git a/projects/clr/rocclr/device/rocm/rocdevice.cpp b/projects/clr/rocclr/device/rocm/rocdevice.cpp index a2b3c11e3f..648dfd217d 100644 --- a/projects/clr/rocclr/device/rocm/rocdevice.cpp +++ b/projects/clr/rocclr/device/rocm/rocdevice.cpp @@ -2470,18 +2470,22 @@ void* Device::virtualAlloc(void* req_addr, size_t size, size_t alignment) { return mem->getSvmPtr(); } -void Device::virtualFree(void* addr) { +bool Device::virtualFree(void* addr) { amd::Memory* memObj = amd::MemObjMap::FindVirtualMemObj(addr); if (memObj == nullptr) { LogPrintfError("Cannot find the Virtual MemObj entry for this addr 0x%x", addr); } - memObj->getContext().devices()[0]->DestroyVirtualBuffer(memObj); + if (!memObj->getContext().devices()[0]->DestroyVirtualBuffer(memObj)) { + return false; + } hsa_status_t hsa_status = hsa_amd_vmem_address_free(memObj->getSvmPtr(), memObj->getSize()); if (hsa_status != HSA_STATUS_SUCCESS) { LogPrintfError("Failed hsa_amd_vmem_address_free. Failed with status:%d \n", hsa_status); + return false; } + return true; } bool Device::SetMemAccess(void* va_addr, size_t va_size, VmmAccess access_flags) { diff --git a/projects/clr/rocclr/device/rocm/rocdevice.hpp b/projects/clr/rocclr/device/rocm/rocdevice.hpp index 6417c9d881..1535ee01de 100644 --- a/projects/clr/rocclr/device/rocm/rocdevice.hpp +++ b/projects/clr/rocclr/device/rocm/rocdevice.hpp @@ -229,9 +229,9 @@ class NullDevice : public amd::Device { return nullptr; } - void virtualFree(void* addr) override { + bool virtualFree(void* addr) override { ShouldNotReachHere(); - return; + return true; } virtual bool SetMemAccess(void* va_addr, size_t va_size, VmmAccess access_flags) @@ -480,7 +480,7 @@ class Device : public NullDevice { size_t num_attributes, const void* dev_ptr, size_t count) const; virtual void* virtualAlloc(void* req_addr, size_t size, size_t alignment); - virtual void virtualFree(void* addr); + virtual bool virtualFree(void* addr); virtual bool SetMemAccess(void* va_addr, size_t va_size, VmmAccess access_flags); virtual bool GetMemAccess(void* va_addr, VmmAccess* access_flags_ptr) const;