From 77093f8f8559fa75f799669b531eee577956672c Mon Sep 17 00:00:00 2001 From: Flora Cui Date: Mon, 30 Jun 2025 14:14:10 +0800 Subject: [PATCH] wsl/libhsakmt: extract is_ipc_sysmemfd() Signed-off-by: Flora Cui Reviewed-by: Tianci Yin Part-of: --- libhsakmt.h | 2 ++ memory.cpp | 24 +++++++++++++++++------- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/libhsakmt.h b/libhsakmt.h index b62a607f95..72974c8907 100644 --- a/libhsakmt.h +++ b/libhsakmt.h @@ -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}); diff --git a/memory.cpp b/memory.cpp index ea863996a0..f4088cf104 100644 --- a/memory.cpp +++ b/memory.cpp @@ -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;