diff --git a/projects/clr/hipamd/src/hip_vm.cpp b/projects/clr/hipamd/src/hip_vm.cpp index fc2533d8a3..184908ad3b 100644 --- a/projects/clr/hipamd/src/hip_vm.cpp +++ b/projects/clr/hipamd/src/hip_vm.cpp @@ -354,26 +354,32 @@ hipError_t hipMemUnmap(void* ptr, size_t size) { HIP_RETURN(hipErrorInvalidValue); } - amd::Memory* phys_mem_obj = vaddr_sub_obj->getUserData().phys_mem_obj; - if (phys_mem_obj == nullptr) { - HIP_RETURN(hipErrorInvalidValue); + address end_address = reinterpret_cast
(vaddr_sub_obj->getSvmPtr()) + size; + while (vaddr_sub_obj && + reinterpret_cast(vaddr_sub_obj->getSvmPtr()) + vaddr_sub_obj->getSize() <= + end_address) { + amd::Memory* phys_mem_obj = vaddr_sub_obj->getUserData().phys_mem_obj; + if (phys_mem_obj == nullptr) { + HIP_RETURN(hipErrorInvalidValue); + } + + amd::Command* cmd = new amd::VirtualMapCommand( + *hip::getCurrentDevice()->NullStream(), amd::Command::EventWaitList{}, + vaddr_sub_obj->getSvmPtr(), vaddr_sub_obj->getSize(), nullptr); + + cmd->enqueue(); + cmd->awaitCompletion(); + cmd->release(); + // restore the original pa of the generic allocation + hip::GenericAllocation* ga = + reinterpret_cast