drm/amdgpu: directly return fence from ib_schedule
authorChristian König <christian.koenig@amd.com>
Mon, 1 Feb 2016 10:56:35 +0000 (11:56 +0100)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 10 Feb 2016 19:17:21 +0000 (14:17 -0500)
Signed-off-by: Christian König <christian.koenig@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu.h
drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c
drivers/gpu/drm/amd/amdgpu/amdgpu_sched.c

index dd6dd23fb3c79a9c7d85a1ece23fa6838da565fe..387a26bba65ad0f63e88ecfe7e73bb03a1a4d8e0 100644 (file)
@@ -1181,7 +1181,8 @@ int amdgpu_ib_get(struct amdgpu_device *adev, struct amdgpu_vm *vm,
                  unsigned size, struct amdgpu_ib *ib);
 void amdgpu_ib_free(struct amdgpu_device *adev, struct amdgpu_ib *ib);
 int amdgpu_ib_schedule(struct amdgpu_ring *ring, unsigned num_ibs,
-                      struct amdgpu_ib *ib, void *owner);
+                      struct amdgpu_ib *ib, void *owner,
+                      struct fence **f);
 int amdgpu_ib_pool_init(struct amdgpu_device *adev);
 void amdgpu_ib_pool_fini(struct amdgpu_device *adev);
 int amdgpu_ib_ring_tests(struct amdgpu_device *adev);
index 47196ec593fcb89c8fe41aa446ae79f08582e2bd..4b2c176b83f2df04eebbf3a416587229c09c43eb 100644 (file)
@@ -104,6 +104,7 @@ void amdgpu_ib_free(struct amdgpu_device *adev, struct amdgpu_ib *ib)
  * @num_ibs: number of IBs to schedule
  * @ibs: IB objects to schedule
  * @owner: owner for creating the fences
+ * @f: fence created during this submission
  *
  * Schedule an IB on the associated ring (all asics).
  * Returns 0 on success, error on failure.
@@ -119,7 +120,8 @@ void amdgpu_ib_free(struct amdgpu_device *adev, struct amdgpu_ib *ib)
  * to SI there was just a DE IB.
  */
 int amdgpu_ib_schedule(struct amdgpu_ring *ring, unsigned num_ibs,
-                      struct amdgpu_ib *ibs, void *owner)
+                      struct amdgpu_ib *ibs, void *owner,
+                      struct fence **f)
 {
        struct amdgpu_device *adev = ring->adev;
        struct amdgpu_ib *ib = &ibs[0];
@@ -200,6 +202,9 @@ int amdgpu_ib_schedule(struct amdgpu_ring *ring, unsigned num_ibs,
                                       AMDGPU_FENCE_FLAG_64BIT);
        }
 
+       if (f)
+               *f = fence_get(&ib->fence->base);
+
        amdgpu_ring_commit(ring);
        return 0;
 }
index 84453c1c4b07336356edd45e32ffb7a8702ab5c5..cabb0fc28610b3140978f7076fb314bd8dc9c6d4 100644 (file)
@@ -88,7 +88,7 @@ static struct fence *amdgpu_sched_dependency(struct amd_sched_job *sched_job)
 
 static struct fence *amdgpu_sched_run_job(struct amd_sched_job *sched_job)
 {
-       struct amdgpu_fence *fence = NULL;
+       struct fence *fence = NULL;
        struct amdgpu_job *job;
        int r;
 
@@ -98,21 +98,19 @@ static struct fence *amdgpu_sched_run_job(struct amd_sched_job *sched_job)
        }
        job = to_amdgpu_job(sched_job);
        trace_amdgpu_sched_run_job(job);
-       r = amdgpu_ib_schedule(job->ring, job->num_ibs, job->ibs, job->owner);
+       r = amdgpu_ib_schedule(job->ring, job->num_ibs, job->ibs,
+                              job->owner, &fence);
        if (r) {
                DRM_ERROR("Error scheduling IBs (%d)\n", r);
                goto err;
        }
 
-       fence = job->ibs[job->num_ibs - 1].fence;
-       fence_get(&fence->base);
-
 err:
        if (job->free_job)
                job->free_job(job);
 
        kfree(job);
-       return fence ? &fence->base : NULL;
+       return fence;
 }
 
 struct amd_sched_backend_ops amdgpu_sched_ops = {