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 <flora.cui@amd.com> Signed-off-by: tiancyin <tianci.yin@amd.com>
Этот коммит содержится в:
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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) :
|
||||
|
||||
Ссылка в новой задаче
Block a user