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
Этот коммит содержится в:
коммит произвёл
Lang Yu
родитель
a7d8b1c287
Коммит
0accd17b6e
+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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
Ссылка в новой задаче
Block a user