2
0

wsl/libhsakmt: extract is_ipc_sysmemfd()

Signed-off-by: Flora Cui <flora.cui@amd.com>
Reviewed-by: Tianci Yin <tianci.yin@amd.com>
Part-of: <http://10.67.69.192/wsl/rocr-runtime/-/merge_requests/85>
Este cometimento está contido em:
Flora Cui
2025-06-30 14:14:10 +08:00
cometido por Frank Min
ascendente 5a89405bf8
cometimento 77093f8f85
2 ficheiros modificados com 19 adições e 7 eliminações
+2
Ver ficheiro
@@ -224,6 +224,8 @@ bool queue_release_buffer(void *MemoryAddress);
uint32_t get_vgpr_size_per_cu(HSA_ENGINE_ID id);
#define SGPR_SIZE_PER_CU 0x4000
bool is_ipc_sysmemfd(int fd);
HSAKMT_STATUS hsaKmtImportDMABufHandle(int DMABufFd,
HsaGraphicsResourceInfo *GraphicsResourceInfo,
HSA_REGISTER_MEM_FLAGS RegisterFlags = {0});
+17 -7
Ver ficheiro
@@ -427,6 +427,16 @@ HSAKMT_STATUS HSAKMTAPI hsaKmtRegisterMemoryWithFlags(
return HSAKMT_STATUS_SUCCESS;
}
bool is_ipc_sysmemfd(int fd) {
std::string fdPath = "/proc/self/fd/" + std::to_string(fd);
char linkTarget[256];
ssize_t bytes = readlink(fdPath.c_str(), linkTarget, sizeof(linkTarget) - 1);
if (bytes == -1)
return false;
linkTarget[bytes] = '\0';
return strstr(linkTarget, "rocr4wsl_gtt") != nullptr;
}
HSAKMT_STATUS HSAKMTAPI hsaKmtRegisterGraphicsHandleToNodes(HSAuint64 GraphicsResourceHandle,
HsaGraphicsResourceInfo *GraphicsResourceInfo,
HSAuint64 NumberOfNodes,
@@ -457,6 +467,12 @@ HSAKMT_STATUS HSAKMTAPI hsaKmtRegisterGraphicsHandleToNodesExt(HSAuint64 Graphic
NodeArray = (HSAuint32*)&(dxg_runtime->default_node);
}
if (is_ipc_sysmemfd(GraphicsResourceHandle)) {
GraphicsResourceInfo->NodeId = dxg_runtime->default_node;
pr_info("skip register sysmemfd. It would be released in next step\n");
return HSAKMT_STATUS_SUCCESS;
}
GraphicsResourceInfo->NodeId = NodeArray[0];
return hsaKmtImportDMABufHandle(GraphicsResourceHandle,
GraphicsResourceInfo,
@@ -501,13 +517,7 @@ HSAKMT_STATUS hsaKmtImportDMABufHandle(int DMABufFd,
create_info.dmabuf_fd = DMABufFd;
create_info.flags.imported_vram_alloc_va = RegisterFlags.ui32.requiresVAddr;
std::string fdPath = "/proc/self/fd/" + std::to_string(DMABufFd);
char linkTarget[256];
ssize_t bytes = readlink(fdPath.c_str(), linkTarget, sizeof(linkTarget) - 1);
if (bytes == -1)
pr_err("Error reading link\n");
linkTarget[bytes] = '\0';
if (strstr(linkTarget, "rocr4wsl_gtt") != nullptr) {
if (is_ipc_sysmemfd(DMABufFd)) {
struct stat st;
fstat(DMABufFd, &st);
uint64_t sz = st.st_size;