[PATCH 5/5] drm/amdgpu: allow concurrent VM flushes

Alex Deucher alexdeucher at gmail.com
Wed Apr 5 19:07:45 UTC 2017


On Wed, Apr 5, 2017 at 12:22 PM, Christian König
<deathsimple at vodafone.de> wrote:
> From: Christian König <christian.koenig at amd.com>
>
> Enable concurrent VM flushes for Vega10.
>
> Signed-off-by: Christian König <christian.koenig at amd.com>

Acked-by: Alex Deucher <alexander.deucher at amd.com>


> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 51 +++++++++++++++++++---------------
>  1 file changed, 28 insertions(+), 23 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
> index 6fd1952..1bb2f8a 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
> @@ -462,11 +462,12 @@ int amdgpu_vm_grab_id(struct amdgpu_vm *vm, struct amdgpu_ring *ring,
>         }
>         kfree(fences);
>
> -       job->vm_needs_flush = true;
> +       job->vm_needs_flush = false;
>         /* Check if we can use a VMID already assigned to this VM */
>         i = ring->idx;
>         do {
>                 struct fence *flushed;
> +               bool needs_flush = false;
>
>                 id = vm->ids[i++];
>                 if (i == AMDGPU_MAX_RINGS)
> @@ -484,16 +485,17 @@ int amdgpu_vm_grab_id(struct amdgpu_vm *vm, struct amdgpu_ring *ring,
>                 if (job->vm_pd_addr != id->pd_gpu_addr[vmhub])
>                         continue;
>
> -               if (!id->last_flush[vmhub])
> -                       continue;
> -
> -               if (id->last_flush[vmhub]->context != fence_context &&
> -                   !fence_is_signaled(id->last_flush[vmhub]))
> -                       continue;
> +               if (!id->last_flush[vmhub] ||
> +                   (id->last_flush[vmhub]->context != fence_context &&
> +                    !fence_is_signaled(id->last_flush[vmhub])))
> +                       needs_flush = true;
>
>                 flushed  = id->flushed_updates[vmhub];
> -               if (updates &&
> -                   (!flushed || fence_is_later(updates, flushed)))
> +               if (updates && (!flushed || fence_is_later(updates, flushed)))
> +                       needs_flush = true;
> +
> +               /* Concurrent flushes are only possible starting with Vega10 */
> +               if (adev->asic_type < CHIP_VEGA10 && needs_flush)
>                         continue;
>
>                 /* Good we can use this VMID. Remember this submission as
> @@ -503,15 +505,15 @@ int amdgpu_vm_grab_id(struct amdgpu_vm *vm, struct amdgpu_ring *ring,
>                 if (r)
>                         goto error;
>
> -               list_move_tail(&id->list, &adev->vm_manager.ids_lru);
> -               vm->ids[ring->idx] = id;
> -
> -               job->vm_id = id - adev->vm_manager.ids;
> -               job->vm_needs_flush = false;
> -               trace_amdgpu_vm_grab_id(vm, ring->idx, job);
> +               if (updates && (!flushed || fence_is_later(updates, flushed))) {
> +                       fence_put(id->flushed_updates[vmhub]);
> +                       id->flushed_updates[vmhub] = fence_get(updates);
> +               }
>
> -               mutex_unlock(&adev->vm_manager.lock);
> -               return 0;
> +               if (needs_flush)
> +                       goto needs_flush;
> +               else
> +                       goto no_flush_needed;
>
>         } while (i != ring->idx);
>
> @@ -523,18 +525,21 @@ int amdgpu_vm_grab_id(struct amdgpu_vm *vm, struct amdgpu_ring *ring,
>         if (r)
>                 goto error;
>
> +       id->pd_gpu_addr[vmhub] = job->vm_pd_addr;
> +       fence_put(id->flushed_updates[vmhub]);
> +       id->flushed_updates[vmhub] = fence_get(updates);
> +       id->current_gpu_reset_count = atomic_read(&adev->gpu_reset_counter);
> +       atomic64_set(&id->owner, vm->client_id);
> +
> +needs_flush:
> +       job->vm_needs_flush = true;
>         for (i = 0; i < AMDGPU_MAX_VMHUBS; ++i) {
>                 fence_put(id->last_flush[i]);
>                 id->last_flush[i] = NULL;
>         }
>
> -       fence_put(id->flushed_updates[vmhub]);
> -       id->flushed_updates[vmhub] = fence_get(updates);
> -
> -       id->pd_gpu_addr[vmhub] = job->vm_pd_addr;
> -       id->current_gpu_reset_count = atomic_read(&adev->gpu_reset_counter);
> +no_flush_needed:
>         list_move_tail(&id->list, &adev->vm_manager.ids_lru);
> -       atomic64_set(&id->owner, vm->client_id);
>         vm->ids[ring->idx] = id;
>
>         job->vm_id = id - adev->vm_manager.ids;
> --
> 2.5.0
>
> _______________________________________________
> amd-gfx mailing list
> amd-gfx at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx


More information about the amd-gfx mailing list