From 5883a2c86b9dbfc485353ec39680e0041fc31169 Mon Sep 17 00:00:00 2001 From: Oak Zeng Date: Mon, 27 Nov 2017 18:13:08 -0500 Subject: [PATCH] More cleanup of fmm.c 1. Renamed _fmm_map_to_gpu to _fmm_map_to_apu_local to reflect the real semantics of this function 2. Renamed _fmm_map_to_gpu_gtt to _fmm_map_to_gpu because this function is used to map both gtt and local memory 3. Call _fmm_map_to_gpu in _fmm_map_to_apu_local to get rid of duplicated codes Change-Id: Id8e3ebfffe0a3c27ebdcac8a8f4dc3738d67d10a Signed-off-by: Oak Zeng [ROCm/ROCR-Runtime commit: 019f7cbd207315f21854d81d9f6a9763ae039669] --- projects/rocr-runtime/src/fmm.c | 60 ++++++++++----------------------- 1 file changed, 17 insertions(+), 43 deletions(-) diff --git a/projects/rocr-runtime/src/fmm.c b/projects/rocr-runtime/src/fmm.c index ba22f34508..0f3b4aa969 100644 --- a/projects/rocr-runtime/src/fmm.c +++ b/projects/rocr-runtime/src/fmm.c @@ -1770,7 +1770,7 @@ static void add_device_ids_to_mapped_array(vm_object_t *obj, /* If nodes_to_map is not NULL, map the nodes specified; otherwise map all. */ -static int _fmm_map_to_gpu_gtt(manageable_aperture_t *aperture, +static int _fmm_map_to_gpu(manageable_aperture_t *aperture, void *address, uint64_t size, vm_object_t *obj, uint32_t *nodes_to_map, uint32_t nodes_array_size) { @@ -1895,20 +1895,22 @@ static int _fmm_map_to_gpu_scratch(uint32_t gpu_id, manageable_aperture_t *apert /* map to GPU */ - ret = _fmm_map_to_gpu_gtt(aperture, address, size, NULL, NULL, 0); + ret = _fmm_map_to_gpu(aperture, address, size, NULL, NULL, 0); if (ret != 0) __fmm_release(mem, aperture); return ret; } -static int _fmm_map_to_gpu(uint32_t gpu_id, manageable_aperture_t *aperture, +static int _fmm_map_to_apu_local(uint32_t gpu_id, + manageable_aperture_t *aperture, void *address, uint64_t size, uint64_t *gpuvm_address) { - struct kfd_ioctl_map_memory_to_gpu_args args; vm_object_t *object; + if (gpuvm_address) + *gpuvm_address = 0; /* Check that address space was previously reserved */ if (!vm_find(aperture, address)) return -1; @@ -1917,37 +1919,15 @@ static int _fmm_map_to_gpu(uint32_t gpu_id, manageable_aperture_t *aperture, /* Find the object to retrieve the handle */ object = vm_find_object_by_address(aperture, address, 0); - if (!object) - goto err_object_not_found; - - args.handle = object->handle; - if (object->registered_device_id_array_size > 0 && - object->registered_device_id_array) { - args.device_ids_array_ptr = - (uint64_t)object->registered_device_id_array; - args.device_ids_array_size = object->registered_device_id_array_size; - } else { - args.device_ids_array_ptr = (uint64_t)all_gpu_id_array; - args.device_ids_array_size = all_gpu_id_array_size; + if (!object) { + pthread_mutex_unlock(&aperture->fmm_mutex); + return -1; } - - if (kmtIoctl(kfd_fd, AMDKFD_IOC_MAP_MEMORY_TO_GPU, &args)) - goto err_map_ioctl_failed; - - - add_device_ids_to_mapped_array(object, - (uint32_t *)args.device_ids_array_ptr, - args.device_ids_array_size); - /* Mapping changed and lifecycle of object->mapped_node_id_array - * terminates here. Free it and allocate on next query - */ - if (object->mapped_node_id_array) { - free(object->mapped_node_id_array); - object->mapped_node_id_array = NULL; - } - pthread_mutex_unlock(&aperture->fmm_mutex); + if (_fmm_map_to_gpu(aperture, address, size, object, NULL, 0)) + return -1; + if (gpuvm_address) { *gpuvm_address = (uint64_t)object->start; if (!topology_is_dgpu(get_device_id_by_gpu_id(gpu_id))) @@ -1955,12 +1935,6 @@ static int _fmm_map_to_gpu(uint32_t gpu_id, manageable_aperture_t *aperture, } return 0; - -err_map_ioctl_failed: -err_object_not_found: - pthread_mutex_unlock(&aperture->fmm_mutex); - *gpuvm_address = 0; - return -1; } static int _fmm_map_to_gpu_userptr(void *addr, uint64_t size, @@ -1993,7 +1967,7 @@ static int _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 */ - ret = _fmm_map_to_gpu_gtt(aperture, svm_addr, svm_size, obj, NULL, 0); + ret = _fmm_map_to_gpu(aperture, svm_addr, svm_size, obj, NULL, 0); if (ret == 0 && gpuvm_addr) *gpuvm_addr = (uint64_t)svm_addr + page_offset; @@ -2022,7 +1996,7 @@ int fmm_map_to_gpu(void *address, uint64_t size, uint64_t *gpuvm_address) if ((address >= gpu_mem[i].gpuvm_aperture.base) && (address <= gpu_mem[i].gpuvm_aperture.limit)) /* map it */ - return _fmm_map_to_gpu(gpu_mem[i].gpu_id, + return _fmm_map_to_apu_local(gpu_mem[i].gpu_id, &gpu_mem[i].gpuvm_aperture, address, size, gpuvm_address); } @@ -2030,12 +2004,12 @@ int fmm_map_to_gpu(void *address, uint64_t size, uint64_t *gpuvm_address) if ((address >= svm.dgpu_aperture.base) && (address <= svm.dgpu_aperture.limit)) /* map it */ - return _fmm_map_to_gpu_gtt(&svm.dgpu_aperture, + return _fmm_map_to_gpu(&svm.dgpu_aperture, address, size, NULL, NULL, 0); else if ((address >= svm.dgpu_alt_aperture.base) && (address <= svm.dgpu_alt_aperture.limit)) /* map it */ - return _fmm_map_to_gpu_gtt(&svm.dgpu_alt_aperture, + return _fmm_map_to_gpu(&svm.dgpu_alt_aperture, address, size, NULL, NULL, 0); /* @@ -3054,7 +3028,7 @@ HSAKMT_STATUS fmm_map_to_gpu_nodes(void *address, uint64_t size, } if (map_node_id_array_size) - retcode = _fmm_map_to_gpu_gtt(aperture, address, size, object, + retcode = _fmm_map_to_gpu(aperture, address, size, object, map_node_id_array, map_node_id_array_size * sizeof(uint32_t));