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 Godavarthy Surya
родитель
d65afe707c
Коммит
2dccb30f6f
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
// ================================================================================================
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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;
|
||||
|
||||
Ссылка в новой задаче
Block a user