[PATCH 3/4] drm/amdkfd: Allow access for mmapping KFD BOs

Christian König ckoenig.leichtzumerken at gmail.com
Wed Apr 14 06:43:38 UTC 2021


Am 08.04.21 um 01:12 schrieb Felix Kuehling:
> DRM allows access automatically when it creates a GEM handle for a BO.
> KFD BOs don't have GEM handles, so KFD needs to manage access manually.

Ok, double checking the code that makes sense.

> Signed-off-by: Felix Kuehling <Felix.Kuehling at amd.com>

Acked-by: Christian König <christian.koenig at amd.com>

> ---
>   drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h    |  3 ++-
>   .../gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c  | 19 ++++++++++++++++++-
>   drivers/gpu/drm/amd/amdkfd/kfd_chardev.c      |  8 +++++---
>   drivers/gpu/drm/amd/amdkfd/kfd_process.c      |  7 ++++---
>   4 files changed, 29 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
> index 0d59bebd92af..7c8c5e469707 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
> @@ -245,7 +245,8 @@ int amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu(
>   		void *drm_priv, struct kgd_mem **mem,
>   		uint64_t *offset, uint32_t flags);
>   int amdgpu_amdkfd_gpuvm_free_memory_of_gpu(
> -		struct kgd_dev *kgd, struct kgd_mem *mem, uint64_t *size);
> +		struct kgd_dev *kgd, struct kgd_mem *mem, void *drm_priv,
> +		uint64_t *size);
>   int amdgpu_amdkfd_gpuvm_map_memory_to_gpu(
>   		struct kgd_dev *kgd, struct kgd_mem *mem, void *drm_priv);
>   int amdgpu_amdkfd_gpuvm_unmap_memory_from_gpu(
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
> index 95442bcd60fb..e7d61ec966b6 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
> @@ -1232,6 +1232,12 @@ int amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu(
>   			 domain_string(alloc_domain), ret);
>   		goto err_bo_create;
>   	}
> +	ret = drm_vma_node_allow(&gobj->vma_node, drm_priv);
> +	if (ret) {
> +		pr_debug("Failed to allow vma node access. ret %d\n",
> +			 ret);
> +		goto err_node_allow;
> +	}
>   	bo = gem_to_amdgpu_bo(gobj);
>   	if (bo_type == ttm_bo_type_sg) {
>   		bo->tbo.sg = sg;
> @@ -1261,6 +1267,8 @@ int amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu(
>   
>   allocate_init_user_pages_failed:
>   	remove_kgd_mem_from_kfd_bo_list(*mem, avm->process_info);
> +	drm_vma_node_revoke(&gobj->vma_node, drm_priv);
> +err_node_allow:
>   	amdgpu_bo_unref(&bo);
>   	/* Don't unreserve system mem limit twice */
>   	goto err_reserve_limit;
> @@ -1278,7 +1286,8 @@ int amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu(
>   }
>   
>   int amdgpu_amdkfd_gpuvm_free_memory_of_gpu(
> -		struct kgd_dev *kgd, struct kgd_mem *mem, uint64_t *size)
> +		struct kgd_dev *kgd, struct kgd_mem *mem, void *drm_priv,
> +		uint64_t *size)
>   {
>   	struct amdkfd_process_info *process_info = mem->process_info;
>   	unsigned long bo_size = mem->bo->tbo.base.size;
> @@ -1355,6 +1364,7 @@ int amdgpu_amdkfd_gpuvm_free_memory_of_gpu(
>   	}
>   
>   	/* Free the BO*/
> +	drm_vma_node_revoke(&mem->bo->tbo.base.vma_node, drm_priv);
>   	drm_gem_object_put(&mem->bo->tbo.base);
>   	mutex_destroy(&mem->lock);
>   	kfree(mem);
> @@ -1666,6 +1676,7 @@ int amdgpu_amdkfd_gpuvm_import_dmabuf(struct kgd_dev *kgd,
>   	struct amdgpu_vm *avm = drm_priv_to_vm(drm_priv);
>   	struct drm_gem_object *obj;
>   	struct amdgpu_bo *bo;
> +	int ret;
>   
>   	if (dma_buf->ops != &amdgpu_dmabuf_ops)
>   		/* Can't handle non-graphics buffers */
> @@ -1686,6 +1697,12 @@ int amdgpu_amdkfd_gpuvm_import_dmabuf(struct kgd_dev *kgd,
>   	if (!*mem)
>   		return -ENOMEM;
>   
> +	ret = drm_vma_node_allow(&obj->vma_node, drm_priv);
> +	if (ret) {
> +		kfree(mem);
> +		return ret;
> +	}
> +
>   	if (size)
>   		*size = amdgpu_bo_size(bo);
>   
> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c b/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c
> index 43de260b2230..8fc18de7cff4 100644
> --- a/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c
> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c
> @@ -1328,7 +1328,8 @@ static int kfd_ioctl_alloc_memory_of_gpu(struct file *filep,
>   	return 0;
>   
>   err_free:
> -	amdgpu_amdkfd_gpuvm_free_memory_of_gpu(dev->kgd, (struct kgd_mem *)mem, NULL);
> +	amdgpu_amdkfd_gpuvm_free_memory_of_gpu(dev->kgd, (struct kgd_mem *)mem,
> +					       pdd->vm, NULL);
>   err_unlock:
>   	mutex_unlock(&p->mutex);
>   	return err;
> @@ -1365,7 +1366,7 @@ static int kfd_ioctl_free_memory_of_gpu(struct file *filep,
>   	}
>   
>   	ret = amdgpu_amdkfd_gpuvm_free_memory_of_gpu(dev->kgd,
> -						(struct kgd_mem *)mem, &size);
> +					(struct kgd_mem *)mem, pdd->vm, &size);
>   
>   	/* If freeing the buffer failed, leave the handle in place for
>   	 * clean-up during process tear-down.
> @@ -1721,7 +1722,8 @@ static int kfd_ioctl_import_dmabuf(struct file *filep,
>   	return 0;
>   
>   err_free:
> -	amdgpu_amdkfd_gpuvm_free_memory_of_gpu(dev->kgd, (struct kgd_mem *)mem, NULL);
> +	amdgpu_amdkfd_gpuvm_free_memory_of_gpu(dev->kgd, (struct kgd_mem *)mem,
> +					       pdd->vm, NULL);
>   err_unlock:
>   	mutex_unlock(&p->mutex);
>   	dma_buf_put(dmabuf);
> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_process.c b/drivers/gpu/drm/amd/amdkfd/kfd_process.c
> index bad0ecd6ef87..da452407c4e5 100644
> --- a/drivers/gpu/drm/amd/amdkfd/kfd_process.c
> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_process.c
> @@ -648,7 +648,7 @@ static void kfd_process_free_gpuvm(struct kgd_mem *mem,
>   	struct kfd_dev *dev = pdd->dev;
>   
>   	amdgpu_amdkfd_gpuvm_unmap_memory_from_gpu(dev->kgd, mem, pdd->vm);
> -	amdgpu_amdkfd_gpuvm_free_memory_of_gpu(dev->kgd, mem, NULL);
> +	amdgpu_amdkfd_gpuvm_free_memory_of_gpu(dev->kgd, mem, pdd->vm, NULL);
>   }
>   
>   /* kfd_process_alloc_gpuvm - Allocate GPU VM for the KFD process
> @@ -712,7 +712,7 @@ static int kfd_process_alloc_gpuvm(struct kfd_process_device *pdd,
>   	return err;
>   
>   err_map_mem:
> -	amdgpu_amdkfd_gpuvm_free_memory_of_gpu(kdev->kgd, mem, NULL);
> +	amdgpu_amdkfd_gpuvm_free_memory_of_gpu(kdev->kgd, mem, pdd->vm, NULL);
>   err_alloc_mem:
>   	*kptr = NULL;
>   	return err;
> @@ -907,7 +907,8 @@ static void kfd_process_device_free_bos(struct kfd_process_device *pdd)
>   				peer_pdd->dev->kgd, mem, peer_pdd->vm);
>   		}
>   
> -		amdgpu_amdkfd_gpuvm_free_memory_of_gpu(pdd->dev->kgd, mem, NULL);
> +		amdgpu_amdkfd_gpuvm_free_memory_of_gpu(pdd->dev->kgd, mem,
> +						       pdd->vm, NULL);
>   		kfd_process_device_remove_obj_handle(pdd, id);
>   	}
>   }



More information about the dri-devel mailing list