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>
このコミットが含まれているのは:
@@ -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() {
|
||||
|
||||
新しいイシューから参照
ユーザーをブロックする