From ccc3849de84f9772798afc3ea424cbb73c07087d Mon Sep 17 00:00:00 2001 From: tiancyin Date: Mon, 30 Jun 2025 12:11:48 +0800 Subject: [PATCH] wsl/libhsakmt: move IPC functions from device to thunk runtime IPC use system memory, it has nothing to do with wddm device. Reviewed-by: Flora Cui Signed-off-by: tiancyin --- libhsakmt.h | 6 ++++ openclose.cpp | 73 ++++++++++++++++++++++++++++++++++++++ wddm/device.cpp | 85 --------------------------------------------- wddm/gpu_memory.cpp | 4 +-- 4 files changed, 81 insertions(+), 87 deletions(-) diff --git a/libhsakmt.h b/libhsakmt.h index 5ea4d455cd..bdec0640b7 100644 --- a/libhsakmt.h +++ b/libhsakmt.h @@ -87,6 +87,12 @@ struct hsakmtRuntime { gpusize *out_gpu_virt_addr, gpusize alignment, bool lock); ErrorCode FreeGpuVirtualAddress(const thunk_proxy::AllocDomain domain, gpusize gpu_addr, gpusize size); + bool CommitSystemHeapSpaceIPC(void* addr, int64_t size, int &fd, bool lock=false); + bool DecommitSystemHeapSpaceIPC(void* addr, int64_t size, int &memfd); + ErrorCode ReserveIPCSysMem(gpusize size, + gpusize *out_gpu_virt_addr, gpusize alignment, + int &memfd, bool lock); + ErrorCode FreeIPCSysMem(gpusize gpu_addr, gpusize size, int &memfd); bool InitHandleApertureSpace(); void InitHandleApertureMgr(); ErrorCode HandleApertureAlloc(gpusize size, gpusize *out_gpu_virt_addr); diff --git a/openclose.cpp b/openclose.cpp index c6c6f79dd2..3cf3430bac 100644 --- a/openclose.cpp +++ b/openclose.cpp @@ -294,6 +294,79 @@ ErrorCode hsakmtRuntime::FreeGpuVirtualAddress(const thunk_proxy::AllocDomain do return code; } +bool hsakmtRuntime::CommitSystemHeapSpaceIPC(void* addr, int64_t size, int &memfd, bool lock) { + int fd = -1; + + if (memfd == -1) { + fd = memfd_create("rocr4wsl_gtt", MFD_CLOEXEC); + if (fd < 0) { + pr_err("memfd_create failed\n"); + return false; + } + + ftruncate(fd, size); + } else { + fd = memfd; + } + + int32_t protFlags = PROT_READ | PROT_WRITE; + int32_t mapFlags = MAP_SHARED | MAP_FIXED | MAP_NORESERVE | + MAP_UNINITIALIZED | (lock ? MAP_LOCKED : 0); + + void* paddr = mmap(addr, size, protFlags, mapFlags, fd, 0); + if (paddr == MAP_FAILED) { + pr_err("fail to commit %s addr = %p, paddr = %p\n", (lock ? "locked" : ""), addr, paddr); + if (memfd == -1) + close(fd); + return false; + } + assert(addr == paddr); + + memfd = fd; + + if (madvise(addr, size, MADV_DONTFORK)) + pr_err("fail to set MADV_DONTFORK for addr = %p\n", addr); + + return true; +} + +bool hsakmtRuntime::DecommitSystemHeapSpaceIPC(void* addr, int64_t size, int &memfd) { + if (munmap(addr, size) != 0) { + pr_err("fail to unmap = %p \n", addr); + return false; + } + close(memfd); + memfd = -1; + return true; +} + +ErrorCode hsakmtRuntime::ReserveIPCSysMem(gpusize size, + gpusize *out_gpu_virt_addr, gpusize alignment, + int &memfd, bool lock) { + gpusize gpu_addr = 0; + ErrorCode code = ErrorCode::Success; + gpu_addr = system_heap_mgr_->Alloc(size, alignment, 0); + if (gpu_addr == 0) + return ErrorCode::OutOfMemory; + + if (!CommitSystemHeapSpaceIPC((void*)gpu_addr, size, memfd, lock)) { + system_heap_mgr_->Free(gpu_addr); + code = ErrorCode::SyscallFail; + } + + *out_gpu_virt_addr = (code == ErrorCode::Success) ? gpu_addr : 0; + return code; +} + +ErrorCode hsakmtRuntime::FreeIPCSysMem(gpusize gpu_addr, gpusize size, int &memfd) { + auto code = ErrorCode::Success; + + DecommitSystemHeapSpaceIPC((void *)gpu_addr, size, memfd); + + system_heap_mgr_->Free(gpu_addr); + return code; +} + bool hsakmtRuntime::InitHandleApertureSpace() { wsl::thunk::WDDMDevice* device; size_t num_adapters = get_num_wddmdev(); diff --git a/wddm/device.cpp b/wddm/device.cpp index 7a6112028d..cb29d2dbee 100644 --- a/wddm/device.cpp +++ b/wddm/device.cpp @@ -180,52 +180,6 @@ bool WDDMDevice::DestroyPagingQueue(void) { return false; } -bool WDDMDevice::CommitSystemHeapSpaceIPC(void* addr, int64_t size, int &memfd, bool lock) { - int fd = -1; - - if (memfd == -1) { - fd = memfd_create("rocr4wsl_gtt", MFD_CLOEXEC); - if (fd < 0) { - pr_err("memfd_create failed\n"); - return false; - } - - ftruncate(fd, size); - } else { - fd = memfd; - } - - int32_t protFlags = PROT_READ | PROT_WRITE; - int32_t mapFlags = MAP_SHARED | MAP_FIXED | MAP_NORESERVE | - MAP_UNINITIALIZED | (lock ? MAP_LOCKED : 0); - - void* paddr = mmap(addr, size, protFlags, mapFlags, fd, 0); - if (paddr == MAP_FAILED) { - pr_err("fail to commit %s addr = %p, paddr = %p\n", (lock ? "locked" : ""), addr, paddr); - if (memfd == -1) - close(fd); - return false; - } - assert(addr == paddr); - - memfd = fd; - - if (madvise(addr, size, MADV_DONTFORK)) - pr_err("fail to set MADV_DONTFORK for addr = %p\n", addr); - - return true; -} - -bool WDDMDevice::DecommitSystemHeapSpaceIPC(void* addr, int64_t size, int &memfd) { - if (munmap(addr, size) != 0) { - pr_err("fail to unmap = %p \n", addr); - return false; - } - close(memfd); - memfd = -1; - return true; -} - void WDDMDevice::SetPowerOptimization(bool restore) { void *priv_data; int priv_size; @@ -248,45 +202,6 @@ void WDDMDevice::SetPowerOptimization(bool restore) { thunk_proxy::DestroyPrivData(priv_data); } - -ErrorCode WDDMDevice::ReserveIPCSysMem(gpusize size, - gpusize *out_gpu_virt_addr, gpusize alignment, - int &memfd, bool lock) { - gpusize gpu_addr = 0; - ErrorCode code = ErrorCode::Success; - - code = d3dthunk::ReserveGpuVirtualAddress(adapter_, size, - system_heap_space_start_, - system_heap_space_start_ + system_heap_space_size_, - &gpu_addr); - if (code != ErrorCode::Success) - return code; - - if (!CommitSystemHeapSpaceIPC((void*)gpu_addr, size, memfd, lock)) { - d3dthunk::FreeGpuVirtualAddress(adapter_, gpu_addr, size); - code = ErrorCode::SyscallFail; - } - - *out_gpu_virt_addr = (code == ErrorCode::Success) ? gpu_addr : 0; - return code; -} - -ErrorCode WDDMDevice::FreeIPCSysMem(gpusize gpu_addr, gpusize size, int &memfd) { - auto code = ErrorCode::Success; - - DecommitSystemHeapSpaceIPC((void *)gpu_addr, size, memfd); - - d3dthunk::FreeGpuVirtualAddressArgs free_args{}; - free_args.hAdapter = adapter_; - free_args.BaseAddress = gpu_addr; - free_args.Size = size; - - code = d3dthunk::FreeGpuVirtualAddress(&free_args); - - return code; -} - - void WDDMDevice::UpdatePageFence(uint64_t fence_value) { uint64_t current = page_fence_value_.load(); diff --git a/wddm/gpu_memory.cpp b/wddm/gpu_memory.cpp index ed083597a6..1814f48cf8 100644 --- a/wddm/gpu_memory.cpp +++ b/wddm/gpu_memory.cpp @@ -253,7 +253,7 @@ ErrorCode GpuMemory::ReserveGpuVirtualAddress(gpusize base_virt_addr, gpusize si if ((desc_.flags.is_sysmem_exporter || desc_.flags.is_imported_sys_memfd) && desc_.domain == thunk_proxy::AllocDomain::kSystem) { int mfd = (mem_fd_ > -1)? mem_fd_ : -1; - status = device_->ReserveIPCSysMem(Size(), &gpu_virt_addr, desc_.alignment, mfd, desc_.flags.is_locked); + status = dxg_runtime->ReserveIPCSysMem(Size(), &gpu_virt_addr, desc_.alignment, mfd, desc_.flags.is_locked); if (status == ErrorCode::Success) mem_fd_ = mfd; } else { @@ -272,7 +272,7 @@ ErrorCode GpuMemory::ReserveGpuVirtualAddress(gpusize base_virt_addr, gpusize si ErrorCode GpuMemory::FreeGpuVirtualAddress(gpusize base_addr, gpusize size) { if (mem_fd_ > -1) - return device_->FreeIPCSysMem(GpuAddress(), Size(), mem_fd_); + return dxg_runtime->FreeIPCSysMem(GpuAddress(), Size(), mem_fd_); return base_addr != 0 ? dxg_runtime->FreeGpuVirtualAddress(desc_.domain, base_addr, size) :