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:
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() {
|
||||||
|
|||||||
Tagairt in Eagrán Nua
Cuir bac ar úsáideoir