SWDEV-413997 - Fixing multiple device cases.

Change-Id: I10ad3fbfca887e92cd81f68392fa1acf753cbd2b
This commit is contained in:
kjayapra-amd
2024-03-15 11:31:19 -04:00
committed by Karthik Jayaprakash
parent 7de7da4016
commit d52d16c8e6
8 changed files with 177 additions and 50 deletions
+114
View File
@@ -376,6 +376,120 @@ amd::Memory* MemObjMap::FindVirtualMemObj(const void* k) {
}
}
//==================================================================================================
bool Device::ValidateVirtualAddressRange(amd::Memory* vaddr_base_obj, amd::Memory* vaddr_sub_obj) {
// Check if the start of the subbuffer is >= to base start.
if (vaddr_base_obj->getSvmPtr() > vaddr_sub_obj->getSvmPtr()) {
LogError("Sub buffer cannot start with addr lesser than base_start.");
return false;
}
// Check if the new size belongs to the vaddr_base_obj range.
address vaddr_base_end = reinterpret_cast<address>(vaddr_base_obj->getSvmPtr())
+ vaddr_base_obj->getSize();
address vaddr_sub_end = reinterpret_cast<address>(vaddr_sub_obj->getSvmPtr())
+ vaddr_sub_obj->getSize();
if (vaddr_sub_end > vaddr_base_end) {
LogError("Sub buffer memory end cannot be greater than base_end. Return nullptr");
return false;
}
return true;
}
//==================================================================================================
amd::Memory* Device::CreateVirtualBuffer(amd::Context& device_context, void* vptr, size_t size,
int deviceId, bool parent, bool kForceAlloc) {
amd::Memory* vaddr_base_obj = nullptr;
amd::Memory* vaddr_sub_obj = nullptr;
if (parent) {
vaddr_base_obj = new (device_context) amd::Buffer(device_context, CL_MEM_VA_RANGE_AMD, size,
vptr);
if (vaddr_base_obj == nullptr) {
LogError("failed to new a va range curr_mem_obj object!");
return nullptr;
}
// This curr_mem_obj->create() does not create an actual memory but stores the memory info
// with given vptr on ROCr backend.
constexpr bool kSysMemAlloc = false;
constexpr bool kSkipAlloc = false;
if (!vaddr_base_obj->create(nullptr, kSysMemAlloc, kSkipAlloc, kForceAlloc)) {
LogError("failed to create a va range mem object");
vaddr_base_obj->release();
return nullptr;
}
amd::MemObjMap::AddVirtualMemObj(vaddr_base_obj->getSvmPtr(), vaddr_base_obj);
} else {
// If not parent, but sub-buffer/child, then validate the address range
vaddr_base_obj = amd::MemObjMap::FindVirtualMemObj(vptr);
if (vaddr_base_obj == nullptr) {
LogPrintfError("Cannot find entry in VirtualMemObjMap: 0x%x \n", vptr);
return nullptr;
}
size_t offset = (reinterpret_cast<address>(vptr)
- reinterpret_cast<address>(vaddr_base_obj->getSvmPtr()));
vaddr_sub_obj = new (device_context) amd::Buffer(*vaddr_base_obj, CL_MEM_VA_RANGE_AMD, offset,
size);
// This curr_mem_obj->create() does not create an actual memory but stores the memory info
// with given vptr on ROCr backend.
constexpr bool kSysMemAlloc = false;
constexpr bool kSkipAlloc = false;
if (!vaddr_sub_obj->create(nullptr, kSysMemAlloc, kSkipAlloc, kForceAlloc)) {
LogError("failed to create a va range mem object");
vaddr_sub_obj->release();
return nullptr;
}
vaddr_sub_obj->getUserData().deviceId = deviceId;
if (!ValidateVirtualAddressRange(vaddr_base_obj, vaddr_sub_obj)) {
LogError("Validation failed on address range, returning nullptr");
return nullptr;
}
}
if (vptr != nullptr) {
// Assert to make sure that amd::Memory object has set the right ptr.
guarantee(vptr == (parent ? vaddr_base_obj->getSvmPtr() : vaddr_sub_obj->getSvmPtr()),
"amd::Memory object does not have the right ptr");
}
return parent ? vaddr_base_obj : vaddr_sub_obj;
}
//==================================================================================================
bool Device::DestroyVirtualBuffer(amd::Memory* vaddr_mem_obj) {
// Argument nullptr check.
if (vaddr_mem_obj == nullptr || vaddr_mem_obj->getSvmPtr() == nullptr) {
LogPrintfError("Mem obj passed is nullptr, vaddr_mem_obj: %p \n", vaddr_mem_obj);
return false;
}
if (vaddr_mem_obj->parent() == nullptr) {
// If parent is nullptr, then vaddr_mem_obj is the parent.
amd::MemObjMap::RemoveVirtualMemObj(vaddr_mem_obj->getSvmPtr());
return true;
} else {
// If parent is not nullptr, this is the sub-buffer object.
amd::Memory* vaddr_base_obj = amd::MemObjMap::FindVirtualMemObj(vaddr_mem_obj->getSvmPtr());
if (vaddr_base_obj == nullptr) {
LogPrintfError("Cannot find mem obj for ptr: 0x%x", vaddr_mem_obj->getSvmPtr());
return false;
}
vaddr_base_obj->removeSubBuffer(vaddr_mem_obj);
}
return true;
}
void MemObjMap::UpdateAccess(amd::Device *peerDev) {
if (peerDev == nullptr) {
return;