From a53f1a7c1e7f0fc706902204b11a2f423f83f41e Mon Sep 17 00:00:00 2001 From: Flora Cui Date: Sat, 5 Jul 2025 12:38:07 +0800 Subject: [PATCH] wsl/libhsakmt: add same process check for ipc buffer Signed-off-by: Flora Cui Reviewed-by: Tianci Yin Part-of: --- wddm/device.h | 2 +- wddm/gpu_memory.h | 10 ++++++++-- wddm/status.h | 1 + 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/wddm/device.h b/wddm/device.h index 252373b565..1d78acf925 100644 --- a/wddm/device.h +++ b/wddm/device.h @@ -205,7 +205,7 @@ public: gpusize base_addr, gpusize size); - ErrorCode CreateGpuMemory(const GpuMemoryCreateInfo &create_info, GpuMemory **gpu_mem); + ErrorCode CreateGpuMemory(const GpuMemoryCreateInfo &create_info, GpuMemory **gpu_mem, gpusize *gpu_va = nullptr); ErrorCode HandleApertureAlloc(gpusize size, gpusize *out_gpu_virt_addr); void HandleApertureFree(gpusize gpu_addr); diff --git a/wddm/gpu_memory.h b/wddm/gpu_memory.h index 976783f56b..82e61f1b7f 100644 --- a/wddm/gpu_memory.h +++ b/wddm/gpu_memory.h @@ -84,7 +84,8 @@ union GpuMemoryDescFlags { uint32_t is_va_required :1; uint32_t is_imported_vram_vmem :1; uint32_t is_imported_vram_ipc :1; - uint32_t unused : 20; + uint32_t is_imported_from_same_process : 3; // imported from same process, record shared cnt + uint32_t unused : 17; }; uint32_t reserved; @@ -148,6 +149,8 @@ struct SharedHandleInfo { uint64_t size; uint32_t flags; int mem_flags; + pid_t pid; + gpusize gpu_addr; }; using GpuMemoryHandle = void *; @@ -187,6 +190,9 @@ public: inline void GetQueueReference() { desc_.flags.is_queue_referenced = 1; } inline void PutQueueReference() { desc_.flags.is_queue_referenced = 0; } inline bool IsQueueReferenced() const { return desc_.flags.is_queue_referenced; } + inline void IncSharedReference() { desc_.flags.is_imported_from_same_process++; } + inline uint32_t DecSharedReference() { return (desc_.flags.is_imported_from_same_process == 0) ? 0 : --desc_.flags.is_imported_from_same_process; } + inline bool IsSharedFromSameProcess() const { return desc_.flags.is_imported_from_same_process > 0; } WinAllocationHandle GetAllocationHandle(size_t index) const { return alloc_handles_ptr_[index]; } size_t NumChunks() const { return num_allocations_; } @@ -207,7 +213,7 @@ public: ErrorCode Evict(); ErrorCode ExportPhysicalHandle(int* dmabuf_fd, uint32_t flags = SHARED_ALLOCATION_ALL_ACCESS); - ErrorCode ImportPhysicalHandle(const GpuMemoryCreateInfo &create_info); + ErrorCode ImportPhysicalHandle(const GpuMemoryCreateInfo &create_info, gpusize *gpu_addr = nullptr); ~GpuMemory(); protected: explicit GpuMemory(WDDMDevice *device); diff --git a/wddm/status.h b/wddm/status.h index 528264c74e..0efd9559fd 100644 --- a/wddm/status.h +++ b/wddm/status.h @@ -54,6 +54,7 @@ enum class ErrorCode { Timeout, SyscallFail, InvalidateParams, + SameProcessSameDevice, Unknown, };