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 <Lang.Yu@amd.com>
Change-Id: I1ae0b4faa2f8af5ec69a81cfeb7661bd47d739d4
Этот коммит содержится в:
David Yat Sin
2024-01-04 00:12:50 +00:00
коммит произвёл Lang Yu
родитель a7d8b1c287
Коммит 0accd17b6e
6 изменённых файлов: 24 добавлений и 22 удалений
+11 -18
Просмотреть файл
@@ -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)
+3
Просмотреть файл
@@ -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;
+1
Просмотреть файл
@@ -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;
+5
Просмотреть файл
@@ -40,6 +40,7 @@
#include <strings.h>
#include "fmm.h"
#include <dlfcn.h>
#include <string.h>
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;
+1 -4
Просмотреть файл
@@ -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;
+3
Просмотреть файл
@@ -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;