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>
このコミットが含まれているのは:
Rahul Manocha
2026-01-16 08:34:21 -08:00
committed by GitHub
コミット 249a947dc7
+15 -13
ファイルの表示
@@ -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
auto &agent_driver = agent->driver();
ShareableHandle shareable_handle;
#if defined(__linux__)
hsa_status_t status = agent_driver.ExportDMABuf(memoryHandleIt->first, size,
&dmabuf_fd, &offset);
if (status != HSA_STATUS_SUCCESS)
return status;
assert(offset == 0);
ShareableHandle shareable_handle;
status = agent_driver.ImportDMABuf(dmabuf_fd, *agent, shareable_handle);
if (status != HSA_STATUS_SUCCESS)
return status;
if (dmabuf_fd != -1) {
close(dmabuf_fd);
}
close(dmabuf_fd);
// Get address that memory is mapped to
if (shareable_handle.IsValid()) {
ret = GetAmdgpuDeviceArgs(agent, shareable_handle, &drm_fd, &drm_cpu_addr);
if (ret) return HSA_STATUS_ERROR;
} else {
hsa_status_t status = agent_driver.GetShareableHandle(va, memoryHandleIt->first, size, &shareable_handle);
if (status != HSA_STATUS_SUCCESS) {
return status;
}
drm_cpu_addr = reinterpret_cast<uint64_t>(va);
ret = GetAmdgpuDeviceArgs(agent, shareable_handle, &drm_fd, &drm_cpu_addr);
if (ret) return HSA_STATUS_ERROR;
#else
hsa_status_t status = agent_driver.GetShareableHandle(va, memoryHandleIt->first, size, &shareable_handle);
if (status != HSA_STATUS_SUCCESS) {
return status;
}
drm_cpu_addr = reinterpret_cast<uint64_t>(va);
#endif
mapped_handle_map_.emplace(
std::piecewise_construct, std::forward_as_tuple(va),
@@ -3783,6 +3781,7 @@ Runtime::MappedHandleAllowedAgent::MappedHandleAllowedAgent(
uint64_t offset = 0;
MemoryHandle *memHandle = mappedHandle->mem_handle;
#if defined(__linux__)
// Export memory from owner agent.
hsa_status_t status = memHandle->agentOwner()->driver().ExportDMABuf(
memHandle->thunk_handle, mappedHandle->size, &dmabuf_fd, &offset);
@@ -3798,6 +3797,9 @@ Runtime::MappedHandleAllowedAgent::MappedHandleAllowedAgent(
close(dmabuf_fd);
if (status != HSA_STATUS_SUCCESS)
return;
#else
shareable_handle.handle = _mappedHandle->shareable_handle.handle;
#endif
}
Runtime::MappedHandleAllowedAgent::~MappedHandleAllowedAgent() {