From c5d7d487dc75bb17e1b4ef93a4ce0dd22240387d Mon Sep 17 00:00:00 2001 From: Flora Cui Date: Wed, 16 Jul 2025 11:22:13 +0800 Subject: [PATCH] wsl/libhsakmt: adapt to the new check for kernel object Signed-off-by: Flora Cui Reviewed-by: Longlong Yao Part-of: --- memory.cpp | 3 +++ wddm/gpu_memory.cpp | 1 + wddm/queue.cpp | 15 ++++++++++----- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/memory.cpp b/memory.cpp index 1d66ba91a1..04ebcd34fe 100644 --- a/memory.cpp +++ b/memory.cpp @@ -212,6 +212,9 @@ HSAKMT_STATUS hsaKmtAllocMemoryAlignInternal(HSAuint32 PreferredNode, create_info.flags.physical_contiguous = MemFlags.ui32.Contiguous; create_info.flags.locked = MemFlags.ui32.NoSubstitute;//AllocatePinned create_info.flags.virtual_alloc = MemFlags.ui32.OnlyAddress; + create_info.flags.blit_kernel_object = + (MemFlags.ui32.ExecuteBlit && MemFlags.ui32.ExecuteAccess && + (create_info.domain == thunk_proxy::AllocDomain::kSystem)); /*when only alloc virtual or only physical, it's vmm allocation, force to local*/ if (create_info.flags.virtual_alloc || create_info.flags.physical_only || create_info.flags.physical_contiguous) { diff --git a/wddm/gpu_memory.cpp b/wddm/gpu_memory.cpp index 503a434080..e374be8867 100644 --- a/wddm/gpu_memory.cpp +++ b/wddm/gpu_memory.cpp @@ -65,6 +65,7 @@ ErrorCode GpuMemory::Init(const GpuMemoryCreateInfo &create_info) { desc_.flags.is_imported_sys_memfd = create_info.flags.sysmem_ipc_sig_importer; desc_.flags.is_sysmem_exporter = create_info.flags.sysmem_ipc_sig_exporter; desc_.flags.is_va_required = create_info.flags.alloc_va; + desc_.flags.is_blit_kernel_object = create_info.flags.blit_kernel_object; /* we can't tell the allocation is regular vmm or ipc mem at creation stage, they share same creation parameters, so forcing all vram allocations to diff --git a/wddm/queue.cpp b/wddm/queue.cpp index 971656e949..e3b5feb19a 100644 --- a/wddm/queue.cpp +++ b/wddm/queue.cpp @@ -521,15 +521,20 @@ uint32_t ComputeQueue::UpdateIndexStride(uint32_t srd, bool wave32) { } uint64_t ComputeQueue::GetKernelObjAddr(uint64_t addr) const { -//TODO: convert dev_addr to host_addr + /* convert dev_addr to host_addr */ + auto code = get_gpu_mem((void*)addr); + if (code && code->IsBlitKernelObject()) { + return code->GpuAddress(); + } + uint64_t host_addr = 0; auto ret = hsakmt_hsa_ven_amd_loader_query_host_address(reinterpret_cast(addr), reinterpret_cast(&host_addr)); - if (ret == HSA_STATUS_ERROR_INVALID_ARGUMENT) { - return 0; + if (ret == HSA_STATUS_SUCCESS) { + return host_addr; } - - return host_addr; + pr_err("failed to query host address for kernel object %p, ret=%d\n", (void*)addr, ret); + return 0; } void ComputeQueue::RingDoorbell() {