Fix set/get access failure for VMM on windows (#2280)

* Fix set/get access failure for VMM on windows

* seperate code paths for linux and windows to avoid using import/export calls in windows

---------

Co-authored-by: Rahul Manocha <rmanocha@amd.com>
Tá an tiomantas seo le fáil i:
Rahul Manocha
2026-01-16 08:34:21 -08:00
tiomanta ag GitHub
tuismitheoir f64d8e0f43
tiomantas 249a947dc7
@@ -3666,32 +3666,30 @@ hsa_status_t Runtime::VMemoryHandleMap(void* va, size_t size, size_t in_offset,
// Create handle by exporting and importing the memory from the owning agent // Create handle by exporting and importing the memory from the owning agent
auto &agent_driver = agent->driver(); auto &agent_driver = agent->driver();
ShareableHandle shareable_handle;
#if defined(__linux__)
hsa_status_t status = agent_driver.ExportDMABuf(memoryHandleIt->first, size, hsa_status_t status = agent_driver.ExportDMABuf(memoryHandleIt->first, size,
&dmabuf_fd, &offset); &dmabuf_fd, &offset);
if (status != HSA_STATUS_SUCCESS) if (status != HSA_STATUS_SUCCESS)
return status; return status;
assert(offset == 0); assert(offset == 0);
ShareableHandle shareable_handle;
status = agent_driver.ImportDMABuf(dmabuf_fd, *agent, shareable_handle); status = agent_driver.ImportDMABuf(dmabuf_fd, *agent, shareable_handle);
if (status != HSA_STATUS_SUCCESS) if (status != HSA_STATUS_SUCCESS)
return status; return status;
if (dmabuf_fd != -1) { close(dmabuf_fd);
close(dmabuf_fd);
}
// Get address that memory is mapped to // Get address that memory is mapped to
if (shareable_handle.IsValid()) { ret = GetAmdgpuDeviceArgs(agent, shareable_handle, &drm_fd, &drm_cpu_addr);
ret = GetAmdgpuDeviceArgs(agent, shareable_handle, &drm_fd, &drm_cpu_addr); if (ret) return HSA_STATUS_ERROR;
if (ret) return HSA_STATUS_ERROR; #else
} else { hsa_status_t status = agent_driver.GetShareableHandle(va, memoryHandleIt->first, size, &shareable_handle);
hsa_status_t status = agent_driver.GetShareableHandle(va, memoryHandleIt->first, size, &shareable_handle); if (status != HSA_STATUS_SUCCESS) {
if (status != HSA_STATUS_SUCCESS) { return status;
return status;
}
drm_cpu_addr = reinterpret_cast<uint64_t>(va);
} }
drm_cpu_addr = reinterpret_cast<uint64_t>(va);
#endif
mapped_handle_map_.emplace( mapped_handle_map_.emplace(
std::piecewise_construct, std::forward_as_tuple(va), std::piecewise_construct, std::forward_as_tuple(va),
@@ -3783,6 +3781,7 @@ Runtime::MappedHandleAllowedAgent::MappedHandleAllowedAgent(
uint64_t offset = 0; uint64_t offset = 0;
MemoryHandle *memHandle = mappedHandle->mem_handle; MemoryHandle *memHandle = mappedHandle->mem_handle;
#if defined(__linux__)
// Export memory from owner agent. // Export memory from owner agent.
hsa_status_t status = memHandle->agentOwner()->driver().ExportDMABuf( hsa_status_t status = memHandle->agentOwner()->driver().ExportDMABuf(
memHandle->thunk_handle, mappedHandle->size, &dmabuf_fd, &offset); memHandle->thunk_handle, mappedHandle->size, &dmabuf_fd, &offset);
@@ -3798,6 +3797,9 @@ Runtime::MappedHandleAllowedAgent::MappedHandleAllowedAgent(
close(dmabuf_fd); close(dmabuf_fd);
if (status != HSA_STATUS_SUCCESS) if (status != HSA_STATUS_SUCCESS)
return; return;
#else
shareable_handle.handle = _mappedHandle->shareable_handle.handle;
#endif
} }
Runtime::MappedHandleAllowedAgent::~MappedHandleAllowedAgent() { Runtime::MappedHandleAllowedAgent::~MappedHandleAllowedAgent() {