[PATCH 4/4] drm/amdgpu: rework reserved VMID handling

Alex Deucher alexdeucher at gmail.com
Thu Dec 8 17:36:49 UTC 2022


Series is:
Reviewed-by: Alex Deucher <alexander.deucher at amd.com>

On Mon, Dec 5, 2022 at 5:43 AM Christian König
<ckoenig.leichtzumerken at gmail.com> wrote:
>
> Instead of reserving a VMID for a single process allow that many
> processes use the reserved ID. This allows for proper isolation
> between the processes.
>
> Signed-off-by: Christian König <christian.koenig at amd.com>
> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_ids.c | 45 ++++++++++++-------------
>  drivers/gpu/drm/amd/amdgpu/amdgpu_ids.h |  3 +-
>  drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h  |  6 +---
>  3 files changed, 24 insertions(+), 30 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.c
> index 7e5aad241295..6481b43ffe25 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.c
> @@ -279,12 +279,13 @@ static int amdgpu_vmid_grab_reserved(struct amdgpu_vm *vm,
>  {
>         struct amdgpu_device *adev = ring->adev;
>         unsigned vmhub = ring->funcs->vmhub;
> +       struct amdgpu_vmid_mgr *id_mgr = &adev->vm_manager.id_mgr[vmhub];
>         uint64_t fence_context = adev->fence_context + ring->idx;
>         bool needs_flush = vm->use_cpu_for_update;
>         uint64_t updates = amdgpu_vm_tlb_seq(vm);
>         int r;
>
> -       *id = vm->reserved_vmid[vmhub];
> +       *id = id_mgr->reserved;
>         if ((*id)->owner != vm->immediate.fence_context ||
>             !amdgpu_vmid_compatible(*id, job) ||
>             (*id)->flushed_updates < updates ||
> @@ -464,31 +465,27 @@ int amdgpu_vmid_alloc_reserved(struct amdgpu_device *adev,
>                                struct amdgpu_vm *vm,
>                                unsigned vmhub)
>  {
> -       struct amdgpu_vmid_mgr *id_mgr;
> -       struct amdgpu_vmid *idle;
> -       int r = 0;
> +       struct amdgpu_vmid_mgr *id_mgr = &adev->vm_manager.id_mgr[vmhub];
>
> -       id_mgr = &adev->vm_manager.id_mgr[vmhub];
>         mutex_lock(&id_mgr->lock);
>         if (vm->reserved_vmid[vmhub])
>                 goto unlock;
> -       if (atomic_inc_return(&id_mgr->reserved_vmid_num) >
> -           AMDGPU_VM_MAX_RESERVED_VMID) {
> -               DRM_ERROR("Over limitation of reserved vmid\n");
> -               atomic_dec(&id_mgr->reserved_vmid_num);
> -               r = -EINVAL;
> -               goto unlock;
> +
> +       ++id_mgr->reserved_use_count;
> +       if (!id_mgr->reserved) {
> +               struct amdgpu_vmid *id;
> +
> +               id = list_first_entry(&id_mgr->ids_lru, struct amdgpu_vmid,
> +                                     list);
> +               /* Remove from normal round robin handling */
> +               list_del_init(&id->list);
> +               id_mgr->reserved = id;
>         }
> -       /* Select the first entry VMID */
> -       idle = list_first_entry(&id_mgr->ids_lru, struct amdgpu_vmid, list);
> -       list_del_init(&idle->list);
> -       vm->reserved_vmid[vmhub] = idle;
> -       mutex_unlock(&id_mgr->lock);
> +       vm->reserved_vmid[vmhub] = true;
>
> -       return 0;
>  unlock:
>         mutex_unlock(&id_mgr->lock);
> -       return r;
> +       return 0;
>  }
>
>  void amdgpu_vmid_free_reserved(struct amdgpu_device *adev,
> @@ -498,12 +495,12 @@ void amdgpu_vmid_free_reserved(struct amdgpu_device *adev,
>         struct amdgpu_vmid_mgr *id_mgr = &adev->vm_manager.id_mgr[vmhub];
>
>         mutex_lock(&id_mgr->lock);
> -       if (vm->reserved_vmid[vmhub]) {
> -               list_add(&vm->reserved_vmid[vmhub]->list,
> -                       &id_mgr->ids_lru);
> -               vm->reserved_vmid[vmhub] = NULL;
> -               atomic_dec(&id_mgr->reserved_vmid_num);
> +       if (vm->reserved_vmid[vmhub] &&
> +           !--id_mgr->reserved_use_count) {
> +               /* give the reserved ID back to normal round robin */
> +               list_add(&id_mgr->reserved->list, &id_mgr->ids_lru);
>         }
> +       vm->reserved_vmid[vmhub] = false;
>         mutex_unlock(&id_mgr->lock);
>  }
>
> @@ -570,7 +567,7 @@ void amdgpu_vmid_mgr_init(struct amdgpu_device *adev)
>
>                 mutex_init(&id_mgr->lock);
>                 INIT_LIST_HEAD(&id_mgr->ids_lru);
> -               atomic_set(&id_mgr->reserved_vmid_num, 0);
> +               id_mgr->reserved_use_count = 0;
>
>                 /* manage only VMIDs not used by KFD */
>                 id_mgr->num_ids = adev->vm_manager.first_kfd_vmid;
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.h
> index 06c8a0034fa5..c573a8ffff47 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.h
> @@ -67,7 +67,8 @@ struct amdgpu_vmid_mgr {
>         unsigned                num_ids;
>         struct list_head        ids_lru;
>         struct amdgpu_vmid      ids[AMDGPU_NUM_VMID];
> -       atomic_t                reserved_vmid_num;
> +       struct amdgpu_vmid      *reserved;
> +       unsigned int            reserved_use_count;
>  };
>
>  int amdgpu_pasid_alloc(unsigned int bits);
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
> index 6546e786bf00..094bb4807303 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
> @@ -119,9 +119,6 @@ struct amdgpu_bo_vm;
>  /* Reserve 2MB at top/bottom of address space for kernel use */
>  #define AMDGPU_VA_RESERVED_SIZE                        (2ULL << 20)
>
> -/* max vmids dedicated for process */
> -#define AMDGPU_VM_MAX_RESERVED_VMID    1
> -
>  /* See vm_update_mode */
>  #define AMDGPU_VM_USE_CPU_FOR_GFX (1 << 0)
>  #define AMDGPU_VM_USE_CPU_FOR_COMPUTE (1 << 1)
> @@ -298,8 +295,7 @@ struct amdgpu_vm {
>         struct dma_fence        *last_unlocked;
>
>         unsigned int            pasid;
> -       /* dedicated to vm */
> -       struct amdgpu_vmid      *reserved_vmid[AMDGPU_MAX_VMHUBS];
> +       bool                    reserved_vmid[AMDGPU_MAX_VMHUBS];
>
>         /* Flag to indicate if VM tables are updated by CPU or GPU (SDMA) */
>         bool                                    use_cpu_for_update;
> --
> 2.34.1
>


More information about the amd-gfx mailing list