From c2dc301792a61ac09bb8ba714f3dbce1248d9002 Mon Sep 17 00:00:00 2001 From: Oak Zeng Date: Thu, 30 Nov 2017 11:06:45 -0500 Subject: [PATCH] Revert "Revert "More cleanup of fmm.c"" This reverts commit 52f6a619705ed23fea2554dd67f648086854875b. Change-Id: I31afe4889794df8cf1e96f5f18771bed75a213d9 Signed-off-by: Oak Zeng --- src/fmm.c | 60 ++++++++++++++++--------------------------------------- 1 file changed, 17 insertions(+), 43 deletions(-) diff --git a/src/fmm.c b/src/fmm.c index 860b121e60..ceae462d79 100644 --- a/src/fmm.c +++ b/src/fmm.c @@ -1774,7 +1774,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) { @@ -1899,20 +1899,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; @@ -1921,37 +1923,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))) @@ -1959,12 +1939,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, @@ -1997,7 +1971,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; @@ -2026,7 +2000,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); } @@ -2034,12 +2008,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); /* @@ -3059,7 +3033,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));