SWDEV-485904 - propagate hsa_amd_vmem_address_free error to hip API

Unit_hipMemSetAccess_GrowVMM test fails with
HSA_STATUS_ERROR_RESOURCE_FREE silently

Change-Id: I7a78410e432de4a2e877062782abf8761645f392


[ROCm/clr commit: b498103f9b]
Этот коммит содержится в:
Anusha GodavarthySurya
2024-09-20 12:08:42 +00:00
коммит произвёл Anusha Godavarthy Surya
родитель d65afe707c
Коммит 2dccb30f6f
6 изменённых файлов: 21 добавлений и 13 удалений
+5 -3
Просмотреть файл
@@ -35,7 +35,7 @@ static_assert(static_cast<uint32_t>(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,
+1 -1
Просмотреть файл
@@ -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
+4 -2
Просмотреть файл
@@ -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;
}
// ================================================================================================
+2 -2
Просмотреть файл
@@ -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);
+6 -2
Просмотреть файл
@@ -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) {
+3 -3
Просмотреть файл
@@ -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;