[PATCH] drm/amdkfd: allocate MMIO/DOORBELL BOs with AMDGPU_GEM_CREATE_PREEMPTIBLE
Felix Kuehling
felix.kuehling at amd.com
Thu May 12 00:45:22 UTC 2022
On 2022-05-11 05:44, Lang Yu wrote:
> MMIO/DOORBELL BOs' backing resources(bus address resources that are
> used to talk to the GPU) are not managed by GTT manager, but they
> are counted by GTT manager. That makes no sense.
>
> With AMDGPU_GEM_CREATE_PREEMPTIBLE flag, such BOs will be managed by
> PREEMPT manager(for preemptible contexts, e.g., KFD). Then they won't
> be evicted and don't need to be pinned as well.
>
> But we still leave these BOs pinned to indicate that the underlying
> resource never moves.
>
> Signed-off-by: Lang Yu <Lang.Yu at amd.com>
Reviewed-by: Felix Kuehling <Felix.Kuehling at amd.com>
> ---
> .../gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c | 32 +++++++++----------
> 1 file changed, 16 insertions(+), 16 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
> index 8b14c55a0793..fada3b149361 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
> @@ -1518,26 +1518,26 @@ int amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu(
> } else if (flags & KFD_IOC_ALLOC_MEM_FLAGS_GTT) {
> domain = alloc_domain = AMDGPU_GEM_DOMAIN_GTT;
> alloc_flags = 0;
> - } else if (flags & KFD_IOC_ALLOC_MEM_FLAGS_USERPTR) {
> + } else {
> domain = AMDGPU_GEM_DOMAIN_GTT;
> alloc_domain = AMDGPU_GEM_DOMAIN_CPU;
> alloc_flags = AMDGPU_GEM_CREATE_PREEMPTIBLE;
> - if (!offset || !*offset)
> - return -EINVAL;
> - user_addr = untagged_addr(*offset);
> - } else if (flags & (KFD_IOC_ALLOC_MEM_FLAGS_DOORBELL |
> - KFD_IOC_ALLOC_MEM_FLAGS_MMIO_REMAP)) {
> - domain = AMDGPU_GEM_DOMAIN_GTT;
> - alloc_domain = AMDGPU_GEM_DOMAIN_CPU;
> - bo_type = ttm_bo_type_sg;
> - alloc_flags = 0;
> - if (size > UINT_MAX)
> +
> + if (flags & KFD_IOC_ALLOC_MEM_FLAGS_USERPTR) {
> + if (!offset || !*offset)
> + return -EINVAL;
> + user_addr = untagged_addr(*offset);
> + } else if (flags & (KFD_IOC_ALLOC_MEM_FLAGS_DOORBELL |
> + KFD_IOC_ALLOC_MEM_FLAGS_MMIO_REMAP)) {
> + bo_type = ttm_bo_type_sg;
> + if (size > UINT_MAX)
> + return -EINVAL;
> + sg = create_doorbell_sg(*offset, size);
> + if (!sg)
> + return -ENOMEM;
> + } else {
> return -EINVAL;
> - sg = create_doorbell_sg(*offset, size);
> - if (!sg)
> - return -ENOMEM;
> - } else {
> - return -EINVAL;
> + }
> }
>
> *mem = kzalloc(sizeof(struct kgd_mem), GFP_KERNEL);
More information about the amd-gfx
mailing list