From: Christian König <[email protected]>

Enable concurrent VM flushes for Vega10.

Signed-off-by: Christian König <[email protected]>
---
 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
[email protected]
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

Reply via email to