From 0accd17b6ec75cb422567ddf12d13813a389d65d Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Thu, 4 Jan 2024 00:12:50 +0000 Subject: [PATCH] HSA_USE_SVM to override SVMAPISupported node prop When HSA_USE_SVM is 0, thunk uses non-SVM path, but upper layers still use SVM path. That is not as expected. Suggested-by: Lang Yu Change-Id: I1ae0b4faa2f8af5ec69a81cfeb7661bd47d739d4 --- src/fmm.c | 29 +++++++++++------------------ src/globals.c | 3 +++ src/libhsakmt.h | 1 + src/openclose.c | 5 +++++ src/queues.c | 5 +---- src/topology.c | 3 +++ 6 files changed, 24 insertions(+), 22 deletions(-) diff --git a/src/fmm.c b/src/fmm.c index b87ee1279d..ffb09080b9 100644 --- a/src/fmm.c +++ b/src/fmm.c @@ -231,9 +231,6 @@ typedef struct { /* specifies the alignment size as PAGE_SIZE * 2^alignment_order */ uint32_t alignment_order; - - /* whether to check all dGPUs in the topology support SVM API */ - bool is_svm_api_supported; } svm_t; /* The other apertures are specific to each GPU. gpu_mem_t manages GPU @@ -254,7 +251,6 @@ static svm_t svm = { .userptr_for_paged_mem = false, .check_userptr = false, .disable_cache = false, - .is_svm_api_supported = false }; /* On APU, for memory allocated on the system memory that GPU doesn't access @@ -1951,7 +1947,7 @@ HSAKMT_STATUS fmm_release(void *address) object = vm_find_object(address, 0, &aperture); if (!object) - return svm.is_svm_api_supported ? + return is_svm_api_supported ? HSAKMT_STATUS_SUCCESS : HSAKMT_STATUS_MEMORY_NOT_REGISTERED; @@ -2492,7 +2488,7 @@ HSAKMT_STATUS fmm_init_process_apertures(unsigned int NumNodes) uint32_t num_of_sysfs_nodes; HSAKMT_STATUS ret = HSAKMT_STATUS_SUCCESS; char *disableCache, *pagedUserptr, *checkUserptr, *guardPagesStr, *reserveSvm; - char *maxVaAlignStr, *useSvmStr; + char *maxVaAlignStr; unsigned int guardPages = 1; uint64_t svm_base = 0, svm_limit = 0; uint32_t svm_alignment = 0; @@ -2531,9 +2527,6 @@ HSAKMT_STATUS fmm_init_process_apertures(unsigned int NumNodes) if (!maxVaAlignStr || sscanf(maxVaAlignStr, "%u", &svm.alignment_order) != 1) svm.alignment_order = 9; - useSvmStr = getenv("HSA_USE_SVM"); - svm.is_svm_api_supported = !(useSvmStr && !strcmp(useSvmStr, "0")); - gpu_mem_count = 0; g_first_gpu_mem = NULL; @@ -2588,7 +2581,7 @@ HSAKMT_STATUS fmm_init_process_apertures(unsigned int NumNodes) gpu_mem[gpu_mem_count].local_mem_size = props.LocalMemSize; gpu_mem[gpu_mem_count].device_id = props.DeviceId; gpu_mem[gpu_mem_count].node_id = i; - svm.is_svm_api_supported &= props.Capability.ui32.SVMAPISupported; + is_svm_api_supported &= props.Capability.ui32.SVMAPISupported; gpu_mem[gpu_mem_count].scratch_physical.align = PAGE_SIZE; gpu_mem[gpu_mem_count].scratch_physical.ops = &reserved_aperture_ops; @@ -3116,7 +3109,7 @@ static HSAKMT_STATUS _fmm_map_to_gpu_userptr(void *addr, uint64_t size, /* Map and return the GPUVM address adjusted by the offset * from the start of the page */ - if (svm.is_svm_api_supported) { + if (is_svm_api_supported) { svm_addr = (void*)((HSAuint64)addr - page_offset); if (!nodes_to_map) { nodes_to_map = all_gpu_id_array; @@ -3156,7 +3149,7 @@ HSAKMT_STATUS fmm_map_to_gpu(void *address, uint64_t size, uint64_t *gpuvm_addre address, size); object = vm_find_object(address, size, &aperture); - if (!object && !svm.is_svm_api_supported ) { + if (!object && !is_svm_api_supported) { if (!is_dgpu) { /* Prefetch memory on APUs with dummy-reads */ fmm_check_user_memory(address, size); @@ -3183,7 +3176,7 @@ HSAKMT_STATUS fmm_map_to_gpu(void *address, uint64_t size, uint64_t *gpuvm_addre /* Prefetch memory on APUs with dummy-reads */ fmm_check_user_memory(address, size); ret = HSAKMT_STATUS_SUCCESS; - } else if ((svm.is_svm_api_supported && !object) || object->userptr) { + } else if ((is_svm_api_supported && !object) || object->userptr) { ret = _fmm_map_to_gpu_userptr(address, size, gpuvm_address, object, NULL, 0); } else { ret = _fmm_map_to_gpu(aperture, address, size, object, NULL, 0); @@ -3361,7 +3354,7 @@ int fmm_unmap_from_gpu(void *address) object = vm_find_object(address, 0, &aperture); if (!object) /* On APUs GPU unmapping of system memory is a no-op */ - return (!is_dgpu || svm.is_svm_api_supported) ? 0 : -EINVAL; + return (!is_dgpu || is_svm_api_supported) ? 0 : -EINVAL; /* Successful vm_find_object returns with the aperture locked */ if (aperture == &cpuvm_aperture) @@ -3510,7 +3503,7 @@ HSAKMT_STATUS fmm_register_memory(void *address, uint64_t size_in_bytes, return HSAKMT_STATUS_SUCCESS; /* Register a new user ptr */ - if (svm.is_svm_api_supported) + if (is_svm_api_supported) return fmm_register_mem_svm_api(address, size_in_bytes, coarse_grain, @@ -3885,7 +3878,7 @@ HSAKMT_STATUS fmm_deregister_memory(void *address) /* On APUs we assume it's a random system memory address * where registration and dergistration is a no-op */ - return (!is_dgpu || svm.is_svm_api_supported) ? + return (!is_dgpu || is_svm_api_supported) ? HSAKMT_STATUS_SUCCESS : HSAKMT_STATUS_MEMORY_NOT_REGISTERED; /* Successful vm_find_object returns with aperture locked */ @@ -3949,7 +3942,7 @@ HSAKMT_STATUS fmm_map_to_gpu_nodes(void *address, uint64_t size, return HSAKMT_STATUS_INVALID_PARAMETER; object = vm_find_object(address, size, &aperture); - if (!object && !svm.is_svm_api_supported) + if (!object && !is_svm_api_supported) return HSAKMT_STATUS_ERROR; /* Successful vm_find_object returns with aperture locked */ @@ -3972,7 +3965,7 @@ HSAKMT_STATUS fmm_map_to_gpu_nodes(void *address, uint64_t size, return HSAKMT_STATUS_ERROR; } - if ((svm.is_svm_api_supported && !object) || object->userptr) { + if ((is_svm_api_supported && !object) || object->userptr) { retcode = _fmm_map_to_gpu_userptr(address, size, gpuvm_address, object, nodes_to_map, num_of_nodes * sizeof(uint32_t)); if (object) diff --git a/src/globals.c b/src/globals.c index 851853aad0..c2fbd4f02e 100644 --- a/src/globals.c +++ b/src/globals.c @@ -34,3 +34,6 @@ pthread_mutex_t hsakmt_mutex = PTHREAD_MUTEX_INITIALIZER; bool is_dgpu; int PAGE_SIZE; int PAGE_SHIFT; + +/* whether to check all dGPUs in the topology support SVM API */ +bool is_svm_api_supported; diff --git a/src/libhsakmt.h b/src/libhsakmt.h index 2d8da2c9c8..656800dae6 100644 --- a/src/libhsakmt.h +++ b/src/libhsakmt.h @@ -37,6 +37,7 @@ extern unsigned long kfd_open_count; extern bool hsakmt_forked; extern pthread_mutex_t hsakmt_mutex; extern bool is_dgpu; +extern bool is_svm_api_supported; extern HsaVersionInfo kfd_version_info; diff --git a/src/openclose.c b/src/openclose.c index 4913349256..bc513c6a03 100644 --- a/src/openclose.c +++ b/src/openclose.c @@ -40,6 +40,7 @@ #include #include "fmm.h" #include +#include int (*fn_amdgpu_device_get_fd)(HsaAMDGPUDeviceHandle device_handle); @@ -152,6 +153,7 @@ HSAKMT_STATUS HSAKMTAPI hsaKmtOpenKFD(void) int fd = -1; HsaSystemProperties sys_props; char *error; + char *useSvmStr; pthread_mutex_lock(&hsakmt_mutex); @@ -192,6 +194,9 @@ HSAKMT_STATUS HSAKMTAPI hsaKmtOpenKFD(void) if (result != HSAKMT_STATUS_SUCCESS) goto kfd_version_failed; + useSvmStr = getenv("HSA_USE_SVM"); + is_svm_api_supported = !(useSvmStr && !strcmp(useSvmStr, "0")); + result = topology_sysfs_get_system_props(&sys_props); if (result != HSAKMT_STATUS_SUCCESS) goto topology_sysfs_failed; diff --git a/src/queues.c b/src/queues.c index f62e862b03..f9e561267f 100644 --- a/src/queues.c +++ b/src/queues.c @@ -494,7 +494,6 @@ static int handle_concrete_asic(struct queue *q, if (ret) { HsaNodeProperties node; - bool svm_api; if (hsaKmtGetNodeProperties(NodeId, &node)) return HSAKMT_STATUS_ERROR; @@ -509,12 +508,10 @@ static int handle_concrete_asic(struct queue *q, q->total_mem_alloc_size = (q->ctx_save_restore_size + q->debug_memory_size) * node.NumXcc; - svm_api = node.Capability.ui32.SVMAPISupported; - /* Allocate unified memory for context save restore * area on dGPU. */ - if (!q->use_ats && svm_api) { + if (!q->use_ats && is_svm_api_supported) { uint32_t size = PAGE_ALIGN_UP(q->total_mem_alloc_size); void *addr; HSAKMT_STATUS r = HSAKMT_STATUS_ERROR; diff --git a/src/topology.c b/src/topology.c index 2cf89f6b8d..7e655e362e 100644 --- a/src/topology.c +++ b/src/topology.c @@ -1192,6 +1192,9 @@ static HSAKMT_STATUS topology_sysfs_get_node_props(uint32_t node_id, gfxv = (uint32_t)prop_val; } + if (!is_svm_api_supported) + props->Capability.ui32.SVMAPISupported = 0; + /* Bail out early, if a CPU node */ if (!props->NumFComputeCores) goto out;