From 52f6a619705ed23fea2554dd67f648086854875b Mon Sep 17 00:00:00 2001 From: Oak Zeng Date: Wed, 29 Nov 2017 09:31:35 -0500 Subject: [PATCH] Revert "More cleanup of fmm.c" This reverts commit 019f7cbd207315f21854d81d9f6a9763ae039669. This change caused a regression () Revert temporarily Change-Id: I5af59d319afeb7f0b03e5a09e8397e3853b8b37b Signed-off-by: Oak Zeng --- src/fmm.c | 62 +++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 44 insertions(+), 18 deletions(-) diff --git a/src/fmm.c b/src/fmm.c index 0f3b4aa969..ba22f34508 100644 --- a/src/fmm.c +++ b/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(manageable_aperture_t *aperture, +static int _fmm_map_to_gpu_gtt(manageable_aperture_t *aperture, void *address, uint64_t size, vm_object_t *obj, uint32_t *nodes_to_map, uint32_t nodes_array_size) { @@ -1895,22 +1895,20 @@ static int _fmm_map_to_gpu_scratch(uint32_t gpu_id, manageable_aperture_t *apert /* map to GPU */ - ret = _fmm_map_to_gpu(aperture, address, size, NULL, NULL, 0); + ret = _fmm_map_to_gpu_gtt(aperture, address, size, NULL, NULL, 0); if (ret != 0) __fmm_release(mem, aperture); return ret; } -static int _fmm_map_to_apu_local(uint32_t gpu_id, - manageable_aperture_t *aperture, +static int _fmm_map_to_gpu(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; @@ -1919,14 +1917,36 @@ static int _fmm_map_to_apu_local(uint32_t gpu_id, /* Find the object to retrieve the handle */ object = vm_find_object_by_address(aperture, address, 0); - if (!object) { - pthread_mutex_unlock(&aperture->fmm_mutex); - return -1; - } - pthread_mutex_unlock(&aperture->fmm_mutex); + if (!object) + goto err_object_not_found; - if (_fmm_map_to_gpu(aperture, address, size, object, NULL, 0)) - return -1; + 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 (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 (gpuvm_address) { *gpuvm_address = (uint64_t)object->start; @@ -1935,6 +1955,12 @@ static int _fmm_map_to_apu_local(uint32_t gpu_id, } 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, @@ -1967,7 +1993,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(aperture, svm_addr, svm_size, obj, NULL, 0); + ret = _fmm_map_to_gpu_gtt(aperture, svm_addr, svm_size, obj, NULL, 0); if (ret == 0 && gpuvm_addr) *gpuvm_addr = (uint64_t)svm_addr + page_offset; @@ -1996,7 +2022,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_apu_local(gpu_mem[i].gpu_id, + return _fmm_map_to_gpu(gpu_mem[i].gpu_id, &gpu_mem[i].gpuvm_aperture, address, size, gpuvm_address); } @@ -2004,12 +2030,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(&svm.dgpu_aperture, + return _fmm_map_to_gpu_gtt(&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(&svm.dgpu_alt_aperture, + return _fmm_map_to_gpu_gtt(&svm.dgpu_alt_aperture, address, size, NULL, NULL, 0); /* @@ -3028,7 +3054,7 @@ HSAKMT_STATUS fmm_map_to_gpu_nodes(void *address, uint64_t size, } if (map_node_id_array_size) - retcode = _fmm_map_to_gpu(aperture, address, size, object, + retcode = _fmm_map_to_gpu_gtt(aperture, address, size, object, map_node_id_array, map_node_id_array_size * sizeof(uint32_t));